chiark / gitweb /
switch some strlcpy's to memcpy
authorKay Sievers <kay.sievers@suse.de>
Mon, 8 Aug 2005 00:21:55 +0000 (02:21 +0200)
committerKay Sievers <kay.sievers@suse.de>
Mon, 8 Aug 2005 00:21:55 +0000 (02:21 +0200)
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 <kay.sievers@suse.de>
udev.c
udev_config.c
udev_db.c
udev_libc_wrapper.c
udev_rules.c
udev_rules_parse.c

diff --git a/udev.c b/udev.c
index 2a6e1efc9932e1699b9f0b69e3b2222a12f8a9a0..6a0beda1c247cb67bfdf7d2b455b1d155af35e39 100644 (file)
--- 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:
index c57e36cd8c21ce5115babf3c23780dbd11788255..f0b409b0676fb9926ab5f14923393b748296b0fd 100644 (file)
@@ -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);
index ef0e9a71ae8471131a1b39f2136f43c638e84bf7..f9adf5c6317554b6bb53cc9d24989f879b28a21f 100644 (file)
--- 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;
index 1852141c9378c7baa9b389013ed838a90a2d9871..4e9f9f1fe87108625ae539fbf4823a8a1b061ed4 100644 (file)
@@ -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 */
index d86b8e8599cbb301a0878f7e839ccf688fed6e1f..d42b219d7d4697bedac9032e81167700c778a707 100644 (file)
@@ -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) {
index be0757374e216f2e2822e75c955c83a49a7b138f..4580a779c6be8b77b3c5ccf8805765be20890a1c 100644 (file)
@@ -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);
                }
        }