If there is any white space character in the file name field, sscanf
would only copy the file name part until the first white space and
leave out everything else.
The fix is trivial; we will use the %n with sscanf to find out all the
chars before the file name part and then skip that part when using
strncpy to copy the file name.
Signed-off-by: Timo Kokkonen <timo.t.kokkonen@iki.fi>
while (fgets(line, sizeof(line), file)) {
struct maps *map = alloc_map();
unsigned long start, end;
while (fgets(line, sizeof(line), file)) {
struct maps *map = alloc_map();
unsigned long start, end;
if (map == NULL)
return 0;
if (map == NULL)
return 0;
if (the_map == NULL)
the_map = map;
if (the_map == NULL)
the_map = map;
- ret = sscanf(line, "%lx-%lx %*s %*s %*s %*s %s",
- &start, &end, name);
+ ret = sscanf(line, "%lx-%lx %*s %*s %*s %*s %n",
+ &start, &end, &skip);
if (ret < 2) {
printf("Error reading input: %s\n", line);
if (ret < 2) {
printf("Error reading input: %s\n", line);
map->pid = pid;
map->tid = tid;
map->pid = pid;
map->tid = tid;
- if (ret >= 3)
- strncpy(map->name, name, sizeof(map->name));
+ strncpy(map->name, line + skip, sizeof(map->name));
+
+ /* zero out the newline */
+ map->name[MAX(strlen(map->name) - 1, 0)] = '\0';
list_add_tail(&map->list, &the_map->list);
}
list_add_tail(&map->list, &the_map->list);
}