diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-02-26 19:40:32 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:32:30 -0700 |
commit | e964c2c05d3d6e2bdb21b3461ed7a4e85315cbc1 (patch) | |
tree | 942e0b9c0bdd90ec7d0f0c98abf94ba7c75159af | |
parent | 831f800da34ddb449aecae925cd1f154f20b1eed (diff) |
[PATCH] udev - safer string handling - part three
Here we truncate our input strings from the environment to our
defined limit. It's a bit theroretical but better check for it.
It cleans up some magic length definitions and removes the code
duplication in udev, udevtest and udevsend.
udevd needs to be killed after installation, cause the message size
is changed with this patch.
Should we do this with the 'make install', like we do with the '.udevdb'?
-rw-r--r-- | namedev.c | 2 | ||||
-rw-r--r-- | udev.c | 30 | ||||
-rw-r--r-- | udev.h | 45 | ||||
-rw-r--r-- | udevd.c | 4 | ||||
-rw-r--r-- | udevd.h | 6 | ||||
-rw-r--r-- | udevsend.c | 26 | ||||
-rw-r--r-- | udevtest.c | 24 |
7 files changed, 54 insertions, 83 deletions
@@ -405,7 +405,7 @@ static int execute_program(char *path, char *value, int len) int fds[2]; pid_t pid; int value_set = 0; - char buffer[256]; + char buffer[255]; char *pos; char *args[PROGRAM_MAXARG]; int i; @@ -43,7 +43,7 @@ char **main_envp; unsigned char logname[42]; void log_message (int level, const char *format, ...) { - va_list args; + va_list args; if (!udev_log) return; @@ -67,30 +67,6 @@ static void sig_handler(int signum) } } -static inline char *get_action(void) -{ - char *action; - - action = getenv("ACTION"); - return action; -} - -static inline char *get_devpath(void) -{ - char *devpath; - - devpath = getenv("DEVPATH"); - return devpath; -} - -static inline char *get_seqnum(void) -{ - char *seqnum; - - seqnum = getenv("SEQNUM"); - return seqnum; -} - static char *subsystem_blacklist[] = { "net", "scsi_host", @@ -130,7 +106,7 @@ static int udev_hotplug(int argc, char **argv) } /* skip blacklisted subsystems */ - subsystem = argv[1]; + subsystem = get_subsystem(argv[1]); if (!subsystem) { dbg("no subsystem?"); goto exit; @@ -200,5 +176,3 @@ int main(int argc, char **argv, char **envp) return udev_hotplug(argc, argv); } - - @@ -23,6 +23,8 @@ #ifndef UDEV_H #define UDEV_H +#include <stdlib.h> +#include <string.h> #include <sysfs/libsysfs.h> #include <stddef.h> #include <sys/param.h> @@ -34,6 +36,10 @@ #define GROUP_SIZE 30 #define MODE_SIZE 8 +#define ACTION_SIZE 30 +#define DEVPATH_SIZE 255 +#define SUBSYSTEM_SIZE 30 + /* length of public data */ #define UDEVICE_LEN (offsetof(struct udevice, bus_id)) @@ -79,6 +85,45 @@ do { \ strncat(to, from, maxsize - strlen(to)-1); \ } while (0) +static inline char *get_action(void) +{ + char *action; + + action = getenv("ACTION"); + if (strlen(action) > ACTION_SIZE) + action[ACTION_SIZE-1] = '\0'; + + return action; +} + +static inline char *get_devpath(void) +{ + char *devpath; + + devpath = getenv("DEVPATH"); + if (strlen(devpath) > DEVPATH_SIZE) + devpath[DEVPATH_SIZE-1] = '\0'; + + return devpath; +} + +static inline char *get_seqnum(void) +{ + char *seqnum; + + seqnum = getenv("SEQNUM"); + + return seqnum; +} + +static inline char *get_subsystem(char *subsystem) +{ + if (strlen(subsystem) > SUBSYSTEM_SIZE) + subsystem[SUBSYSTEM_SIZE-1] = '\0'; + + return subsystem; +} + extern int udev_add_device(char *path, char *subsystem, int fake); extern int udev_remove_device(char *path, char *subsystem); extern void udev_init_config(void); @@ -119,8 +119,8 @@ static void msg_queue_insert(struct hotplug_msg *msg) static void udev_run(struct hotplug_msg *msg) { pid_t pid; - char action[32]; - char devpath[256]; + char action[ACTION_SIZE]; + char devpath[DEVPATH_SIZE]; char *env[] = { action, devpath, NULL }; snprintf(action, sizeof(action), "ACTION=%s", msg->action); @@ -35,7 +35,7 @@ struct hotplug_msg { pid_t pid; int seqnum; time_t queue_time; - char action[8]; - char devpath[128]; - char subsystem[16]; + char action[ACTION_SIZE]; + char devpath[DEVPATH_SIZE]; + char subsystem[SUBSYSTEM_SIZE]; }; diff --git a/udevsend.c b/udevsend.c index 08212dfee6..4b6ef5c2f3 100644 --- a/udevsend.c +++ b/udevsend.c @@ -52,30 +52,6 @@ void log_message (int level, const char *format, ...) } #endif -static inline char *get_action(void) -{ - char *action; - - action = getenv("ACTION"); - return action; -} - -static inline char *get_devpath(void) -{ - char *devpath; - - devpath = getenv("DEVPATH"); - return devpath; -} - -static inline char *get_seqnum(void) -{ - char *seqnum; - - seqnum = getenv("SEQNUM"); - return seqnum; -} - static int build_hotplugmsg(struct hotplug_msg *msg, char *action, char *devpath, char *subsystem, int seqnum) { @@ -144,7 +120,7 @@ int main(int argc, char* argv[]) #endif dbg("version %s", UDEV_VERSION); - subsystem = argv[1]; + subsystem = get_subsystem(argv[1]); if (subsystem == NULL) { dbg("no subsystem"); goto exit; diff --git a/udevtest.c b/udevtest.c index 4956758636..4bc094fd90 100644 --- a/udevtest.c +++ b/udevtest.c @@ -66,30 +66,6 @@ static void sig_handler(int signum) } } -static inline char *get_action(void) -{ - char *action; - - action = getenv("ACTION"); - return action; -} - -static inline char *get_devpath(void) -{ - char *devpath; - - devpath = getenv("DEVPATH"); - return devpath; -} - -static inline char *get_seqnum(void) -{ - char *seqnum; - - seqnum = getenv("SEQNUM"); - return seqnum; -} - static char *subsystem_blacklist[] = { "net", "scsi_host", |