linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cleanup udevstart
@ 2004-03-02 21:55 Kay Sievers
  2004-03-02 22:16 ` Greg KH
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Kay Sievers @ 2004-03-02 21:55 UTC (permalink / raw)
  To: linux-hotplug

[-- 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();
 }

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2004-03-16 22:24 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-02 21:55 [PATCH] cleanup udevstart Kay Sievers
2004-03-02 22:16 ` 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).