From 13d11705bf0117365afc3f9210f4d568a2baa69c Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 8 Aug 2005 02:21:55 +0200 Subject: [PATCH] switch some strlcpy's to memcpy strlcpy counts the sourec string lengt and is therefore not suitable to copy a defined length of characters from one string to another. Signed-off-by: Kay Sievers --- udev.c | 1 + udev_config.c | 3 ++- udev_db.c | 36 ++++++++++++++++++++++++------------ udev_libc_wrapper.c | 3 ++- udev_rules.c | 3 ++- udev_rules_parse.c | 10 +++++++++- 6 files changed, 40 insertions(+), 16 deletions(-) diff --git a/udev.c b/udev.c index 2a6e1efc9..6a0beda1c 100644 --- a/udev.c +++ b/udev.c @@ -131,6 +131,7 @@ int main(int argc, char *argv[], char *envp[]) } } + udev_rules_close(&rules); udev_cleanup_device(&udev); exit: diff --git a/udev_config.c b/udev_config.c index c57e36cd8..f0b409b06 100644 --- a/udev_config.c +++ b/udev_config.c @@ -137,7 +137,8 @@ static int parse_config_file(void) if (bufline[0] == COMMENT_CHARACTER) continue; - strlcpy(line, bufline, count+1); + memcpy(line, bufline, count); + line[count] = '\0'; linepos = line; retval = get_key(&linepos, &variable, &value); diff --git a/udev_db.c b/udev_db.c index ef0e9a71a..f9adf5c63 100644 --- a/udev_db.c +++ b/udev_db.c @@ -127,42 +127,49 @@ static int parse_db_file(struct udevice *udev, const char *filename) case 'P': if (count > sizeof(udev->devpath)) count = sizeof(udev->devpath); - strlcpy(udev->devpath, &bufline[2], count-1); + memcpy(udev->devpath, &bufline[2], count-2); + udev->devpath[count-2] = '\0'; break; case 'N': if (count > sizeof(udev->name)) count = sizeof(udev->name); - strlcpy(udev->name, &bufline[2], count-1); + memcpy(udev->name, &bufline[2], count-2); + udev->name[count-2] = '\0'; break; case 'M': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; sscanf(line, "%u:%u", &major, &minor); udev->devt = makedev(major, minor); break; case 'S': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; name_list_add(&udev->symlink_list, line, 0); break; case 'A': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; udev->partitions = atoi(line); break; case 'R': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; udev->ignore_remove = atoi(line); break; case 'E': if (count > sizeof(line)) count = sizeof(line); - strlcpy(line, &bufline[2], count-1); + memcpy(line, &bufline[2], count-2); + line[count-2] = '\0'; name_list_add(&udev->env_list, line, 0); break; } @@ -244,16 +251,19 @@ int udev_db_search_name(char *devpath, size_t len, const char *name) case 'P': if (count > sizeof(path)) count = sizeof(path); - strlcpy(path, &bufline[2], count-1); + memcpy(path, &bufline[2], count-2); + path[count-2] = '\0'; break; case 'N': case 'S': if (count > sizeof(nodename)) count = sizeof(nodename); - strlcpy(nodename, &bufline[2], count-1); + memcpy(nodename, &bufline[2], count-2); + nodename[count-2] = '\0'; dbg("compare '%s' '%s'", nodename, name); if (strcmp(nodename, name) == 0) { - strlcpy(devpath, path, len); + memcpy(devpath, &bufline[2], count-2); + devpath[count-2] = '\0'; file_unmap(buf, bufsize); closedir(dir); return 0; @@ -319,12 +329,14 @@ int udev_db_dump_names(int (*handler_function)(const char *path, const char *nam case 'P': if (count > sizeof(path)) count = sizeof(path); - strlcpy(path, &bufline[2], count-1); + memcpy(path, &bufline[2], count-2); + path[count-2] = '\0'; break; case 'N': if (count > sizeof(nodename)) count = sizeof(nodename); - strlcpy(nodename, &bufline[2], count-1); + memcpy(nodename, &bufline[2], count-2); + nodename[count-2] = '\0'; break; default: continue; diff --git a/udev_libc_wrapper.c b/udev_libc_wrapper.c index 1852141c9..4e9f9f1fe 100644 --- a/udev_libc_wrapper.c +++ b/udev_libc_wrapper.c @@ -159,7 +159,8 @@ static unsigned long get_id_by_name(const char *uname, const char *dbfile) if (count >= sizeof(line)) continue; - strlcpy(line, bufline, count); + memcpy(line, bufline, count-1); + line[count-1] = '\0'; pos = line; /* get name */ diff --git a/udev_rules.c b/udev_rules.c index d86b8e859..d42b219d7 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -187,7 +187,8 @@ static int import_keys_into_env(struct udevice *udev, const char *buf, size_t bu if (bufline[0] == COMMENT_CHARACTER) continue; - strlcpy(line, bufline, count+1); + memcpy(line, bufline, count); + line[count] = '\0'; linepos = line; if (get_key(&linepos, &variable, &value) == 0) { diff --git a/udev_rules_parse.c b/udev_rules_parse.c index be0757374..4580a779c 100644 --- a/udev_rules_parse.c +++ b/udev_rules_parse.c @@ -89,7 +89,7 @@ static int get_key(char **line, char **key, enum key_operation *operation, char char *temp; linepos = *line; - if (!linepos) + if (linepos == NULL && linepos[0] == '\0') return -1; /* skip whitespace */ @@ -97,7 +97,10 @@ static int get_key(char **line, char **key, enum key_operation *operation, char linepos++; /* get the key */ + if (linepos[0] == '\0') + return -1; *key = linepos; + while (1) { linepos++; if (linepos[0] == '\0') @@ -120,6 +123,8 @@ static int get_key(char **line, char **key, enum key_operation *operation, char /* skip whitespace after key */ while (isspace(linepos[0])) linepos++; + if (linepos[0] == '\0') + return -1; /* get operation type */ if (linepos[0] == '=' && linepos[1] == '=') { @@ -152,6 +157,8 @@ static int get_key(char **line, char **key, enum key_operation *operation, char /* skip whitespace after operator */ while (isspace(linepos[0])) linepos++; + if (linepos[0] == '\0') + return -1; /* get the value*/ if (linepos[0] == '"') @@ -634,6 +641,7 @@ int udev_rules_init(struct udev_rules *rules, int resolve_names) list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) { parse_file(rules, name_loop->name); list_del(&name_loop->node); + free(name_loop); } } -- 2.30.2