aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--udev.c1
-rw-r--r--udev_config.c3
-rw-r--r--udev_db.c36
-rw-r--r--udev_libc_wrapper.c3
-rw-r--r--udev_rules.c3
-rw-r--r--udev_rules_parse.c10
6 files changed, 40 insertions, 16 deletions
diff --git a/udev.c b/udev.c
index 2a6e1efc..6a0beda1 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 c57e36cd..f0b409b0 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 ef0e9a71..f9adf5c6 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 1852141c..4e9f9f1f 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 d86b8e85..d42b219d 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 be075737..4580a779 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);
}
}