1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-26 14:04:03 +03:00

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 <kay.sievers@suse.de>
This commit is contained in:
Kay Sievers 2005-08-08 02:21:55 +02:00
parent 738428b449
commit 13d11705bf
6 changed files with 40 additions and 16 deletions

1
udev.c
View File

@ -131,6 +131,7 @@ int main(int argc, char *argv[], char *envp[])
}
}
udev_rules_close(&rules);
udev_cleanup_device(&udev);
exit:

View 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);

View File

@ -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;

View 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 */

View 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) {

View 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);
}
}