From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: [PATCH] cleanup udevstart
Date: Tue, 02 Mar 2004 21:55:36 +0000 [thread overview]
Message-ID: <20040302215536.GA12039@vrfy.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 426 bytes --]
I just wanted to terminate the snprintf() strings, cause I can see a
overflow with closed eyes after all the audit :)
But then I changed a bit more to bring it in line with the style of the
other files. I replaced the exec_udev() function with the one from
udevd, cause we don't need to read the stdout from udev.
Please have a look if it still works for you too and not
only for usernames with 3 characters :)
thanks,
Kay
[-- Attachment #2: 01-cleanup-undevstart.patch --]
[-- Type: text/plain, Size: 7425 bytes --]
===== udevstart.c 1.1 vs edited =====
--- 1.1/udevstart.c Tue Mar 2 02:30:38 2004
+++ edited/udevstart.c Tue Mar 2 22:31:16 2004
@@ -27,7 +27,6 @@
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
-#include <signal.h>
#include <dirent.h>
#include <sys/wait.h>
@@ -47,133 +46,86 @@
#endif
-#define MAX_PATHLEN 1024
-#define SYSBLOCK "/sys/block"
-#define SYSCLASS "/sys/class"
+#define MAX_PATHLEN 1024
+#define SYSBLOCK "/sys/block"
+#define SYSCLASS "/sys/class"
+#define UDEV_BIN "/sbin/udev"
-static int execute_udev(char *path, char *value, int len)
+static void udev_exec(const char *path, const char* subsystem)
{
- int retval;
- int res;
- int status;
- int fds[2];
pid_t pid;
- int value_set = 0;
- char buffer[255];
- char *pos;
-
- retval = pipe(fds);
- if (retval != 0) {
- dbg("pipe failed");
- return -1;
- }
+ char action[] = "ACTION=add";
+ char devpath[MAX_PATHLEN];
+ char nosleep[] = "UDEV_NO_SLEEP=1";
+ char *env[] = { action, devpath, nosleep, NULL };
+
+ snprintf(devpath, MAX_PATHLEN, "DEVPATH=%s", path);
+ devpath[MAX_PATHLEN-1] = '\0';
+
pid = fork();
- switch(pid) {
+ switch (pid) {
case 0:
/* child */
- close(STDOUT_FILENO);
-
- /* dup write side of pipe to STDOUT */
- dup(fds[1]);
-
- dbg("executing /sbin/udev '%s'", path);
- retval = execl("/sbin/udev", "/sbin/udev", path, NULL);
-
- info("execution of '%s' failed", path);
+ execle(UDEV_BIN, "udev", subsystem, NULL, env);
+ dbg("exec of child failed");
exit(1);
+ break;
case -1:
- dbg("fork failed");
- return -1;
+ dbg("fork of child failed");
+ break;
default:
- /* parent reads from fds[0] */
- close(fds[1]);
- retval = 0;
- while (1) {
- res = read(fds[0], buffer, sizeof(buffer) - 1);
- if (res <= 0)
- break;
- buffer[res] = '\0';
- if (res > len) {
- dbg("result len %d too short", len);
- retval = -1;
- }
- if (value_set) {
- dbg("result value already set");
- retval = -1;
- } else {
- value_set = 1;
- strncpy(value, buffer, len);
- pos = value + strlen(value)-1;
- if (pos[0] == '\n')
- pos[0] = '\0';
- dbg("result is '%s'", value);
- }
- }
- close(fds[0]);
- res = wait(&status);
- if (res < 0) {
- dbg("wait failed result %d", res);
- retval = -1;
- }
-
- if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
- dbg("exec program status 0x%x", status);
- retval = -1;
- }
+ wait(NULL);
}
- return retval;
}
static int udev_scan(void)
{
- char *devpath;
- DIR *dir;
- struct dirent *dent;
- int retval = -EINVAL;
- char scratch[200];
+ char *devpath;
+ DIR *dir;
+ struct dirent *dent;
+ int retval = -EINVAL;
devpath = "block";
dir = opendir(SYSBLOCK);
- if (dir) {
- for (dent = readdir(dir); dent; dent = readdir(dir)) {
- char dirname[MAX_PATHLEN];
- DIR *dir2;
- struct dirent *dent2;
- if ((strcmp(dent->d_name, ".") == 0)
- || (strcmp(dent->d_name, "..") == 0))
+ if (dir != NULL) {
+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ char dirname[MAX_PATHLEN];
+ DIR *dir2;
+ struct dirent *dent2;
+
+ if ((strcmp(dent->d_name, ".") == 0) ||
+ (strcmp(dent->d_name, "..") == 0))
continue;
snprintf(dirname, MAX_PATHLEN, "/block/%s", dent->d_name);
-
- setenv("DEVPATH", dirname, 1);
- dbg("udev block, 'DEVPATH' = '%s'", dirname);
- execute_udev("block", scratch, sizeof(scratch));
+ dirname[MAX_PATHLEN-1] = '\0';
+ udev_exec(dirname, "block");
snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSBLOCK, dent->d_name);
-
dir2 = opendir(dirname);
- if (dir2) {
- for (dent2 = readdir(dir2); dent2; dent2 = readdir(dir2)) {
- char dirname2[MAX_PATHLEN];
- DIR *dir3;
- struct dirent *dent3;
+ if (dir2 != NULL) {
+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
+ char dirname2[MAX_PATHLEN];
+ DIR *dir3;
+ struct dirent *dent3;
if ((strcmp(dent2->d_name, ".") == 0) ||
(strcmp(dent2->d_name, "..") == 0))
continue;
snprintf(dirname2, MAX_PATHLEN, "%s/%s", dirname, dent2->d_name);
+ dirname2[MAX_PATHLEN-1] = '\0';
dir3 = opendir(dirname2);
- if (dir3) {
- for (dent3 = readdir(dir3); dent3; dent3 = readdir(dir3)) {
+ if (dir3 != NULL) {
+ for (dent3 = readdir(dir3); dent3 != NULL; dent3 = readdir(dir3)) {
char filename[MAX_PATHLEN];
if (strcmp(dent3->d_name, "dev") == 0) {
- snprintf(filename, MAX_PATHLEN, "/block/%s/%s", dent->d_name, dent2->d_name);
- setenv("DEVPATH", filename, 1);
- dbg("udev block, 'DEVPATH' = '%s'", filename);
- execute_udev("block", scratch, sizeof(scratch));
+ snprintf(filename, MAX_PATHLEN, "/block/%s/%s",
+ dent->d_name, dent2->d_name);
+ filename[MAX_PATHLEN-1] = '\0';
+ udev_exec(filename, "block");
}
}
}
@@ -184,43 +136,42 @@
devpath = "class";
dir = opendir(SYSCLASS);
- if (dir) {
- for (dent = readdir(dir); dent; dent = readdir(dir)) {
- char dirname[MAX_PATHLEN];
- DIR *dir2;
- struct dirent *dent2;
- if ((strcmp(dent->d_name, ".") == 0)
- || (strcmp(dent->d_name, "..") == 0))
+ if (dir != NULL) {
+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ char dirname[MAX_PATHLEN];
+ DIR *dir2;
+ struct dirent *dent2;
+
+ if ((strcmp(dent->d_name, ".") == 0) ||
+ (strcmp(dent->d_name, "..") == 0))
continue;
snprintf(dirname, MAX_PATHLEN, "%s/%s", SYSCLASS, dent->d_name);
-
+ dirname[MAX_PATHLEN] = '\0';
dir2 = opendir(dirname);
- if (dir2) {
- for (dent2 = readdir(dir2); dent2; dent2 = readdir(dir2)) {
- char dirname2[MAX_PATHLEN];
- DIR *dir3;
- struct dirent *dent3;
+ if (dir2 != NULL) {
+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
+ char dirname2[MAX_PATHLEN-1];
+ DIR *dir3;
+ struct dirent *dent3;
- if ((strcmp(dent2->d_name, ".") == 0) || (strcmp(dent2->d_name, "..") == 0))
+ if ((strcmp(dent2->d_name, ".") == 0) ||
+ (strcmp(dent2->d_name, "..") == 0))
continue;
snprintf(dirname2, MAX_PATHLEN, "%s/%s", dirname, dent2->d_name);
+ dirname2[MAX_PATHLEN-1] = '\0';
dir3 = opendir(dirname2);
- if (dir3) {
- for (dent3 = readdir(dir3); dent3; dent3 = readdir(dir3)) {
- char
- filename[MAX_PATHLEN];
+ if (dir3 != NULL) {
+ for (dent3 = readdir(dir3); dent3 != NULL; dent3 = readdir(dir3)) {
+ char filename[MAX_PATHLEN];
if (strcmp(dent3->d_name, "dev") == 0) {
- snprintf
- (filename,
- MAX_PATHLEN,
- "/class/%s/%s", dent->d_name, dent2->d_name);
- setenv("DEVPATH", filename, 1);
- dbg("udev '%s', 'DEVPATH' = '%s'", dent->d_name, filename);
- execute_udev(dent->d_name, scratch, sizeof(scratch));
+ snprintf(filename, MAX_PATHLEN, "/class/%s/%s",
+ dent->d_name, dent2->d_name);
+ filename[MAX_PATHLEN-1] = '\0';
+ udev_exec(filename, dent->d_name);
}
}
}
@@ -239,9 +190,6 @@
int main(int argc, char **argv, char **envp)
{
init_logging("udevstart");
-
- setenv("ACTION", "add", 1);
- setenv("UDEV_NO_SLEEP", "1", 1);
return udev_scan();
}
next reply other threads:[~2004-03-02 21:55 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-03-02 21:55 Kay Sievers [this message]
2004-03-02 22:16 ` [PATCH] cleanup udevstart Greg KH
2004-03-02 23:09 ` Olaf Hering
2004-03-02 23:20 ` Greg KH
2004-03-02 23:23 ` Olaf Hering
2004-03-02 23:32 ` Greg KH
2004-03-15 21:22 ` Olaf Hering
2004-03-16 1:28 ` Kay Sievers
2004-03-16 2:49 ` Kay Sievers
2004-03-16 17:01 ` Patrick Mansfield
2004-03-16 21:57 ` Kay Sievers
2004-03-16 22:24 ` Patrick Mansfield
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040302215536.GA12039@vrfy.org \
--to=kay.sievers@vrfy.org \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.