diff options
author | Benoît Dejean <benoit@placenet.org> | 2007-01-14 18:09:56 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2007-01-14 18:09:56 +0000 |
commit | e156172e7ce13e4830aa8db878626ae4b740204b (patch) | |
tree | c313f18536b4572b6f84db4356d4833aa8c7742c | |
parent | c9385972bdafd52271690b1a86b874fceec650ac (diff) | |
download | libgtop-e156172e7ce13e4830aa8db878626ae4b740204b.tar.gz |
Fixed stack overflow in proc_map. Switched to Glibc getline because fgets
2007-01-14 Benoît Dejean <benoit@placenet.org>
* procmap.c: (glibtop_get_proc_map_s):
* procopenfiles.c: (parse_file):
Fixed stack overflow in proc_map.
Switched to Glibc getline because fgets gets fooled by long
lines.
Closes #396477.
svn path=/trunk/; revision=2546
-rw-r--r-- | sysdeps/linux/ChangeLog | 10 | ||||
-rw-r--r-- | sysdeps/linux/procmap.c | 27 | ||||
-rw-r--r-- | sysdeps/linux/procopenfiles.c | 12 |
3 files changed, 30 insertions, 19 deletions
diff --git a/sysdeps/linux/ChangeLog b/sysdeps/linux/ChangeLog index 1f06d345..39a095da 100644 --- a/sysdeps/linux/ChangeLog +++ b/sysdeps/linux/ChangeLog @@ -1,3 +1,13 @@ +2007-01-14 Benoît Dejean <benoit@placenet.org> + + * procmap.c: (glibtop_get_proc_map_s): + * procopenfiles.c: (parse_file): + + Fixed stack overflow in proc_map. + Switched to Glibc getline because fgets gets fooled by long + lines. + Closes #396477. + 2007-01-11 Benoît Dejean <benoit@placenet.org> * glibtop_private.c: (get_scaled): diff --git a/sysdeps/linux/procmap.c b/sysdeps/linux/procmap.c index 18b8bec9..1d85e32e 100644 --- a/sysdeps/linux/procmap.c +++ b/sysdeps/linux/procmap.c @@ -38,7 +38,7 @@ #define SMAPS_FILE "/proc/%u/smaps" -#define PROC_MAPS_FORMAT "%16llx-%16llx %4c %16llx %02hx:%02hx %llu%*[ ]%[^\n]\n" +#define PROC_MAPS_FORMAT "%16llx-%16llx %4c %16llx %02hx:%02hx %llu%*[ ]%n" static const unsigned long _glibtop_sysdeps_proc_map = @@ -132,6 +132,8 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) FILE *maps; const char *filename; gboolean has_smaps; + char *line = NULL; + size_t line_size = 0; glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0); @@ -152,32 +154,28 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) while(TRUE) { - char line[1024]; - unsigned long perm = 0; - int rv; guint len; + int line_end; unsigned short dev_major, dev_minor; guint64 start, end, offset, inode; char flags[4]; - char filename [GLIBTOP_MAP_FILENAME_LEN+1]; + char *filename; glibtop_map_entry *entry; - if (!fgets(line, sizeof line, maps)) + if (getline(&line, &line_size, maps) == -1) break; /* 8 arguments */ - rv = sscanf(line, PROC_MAPS_FORMAT, - &start, &end, flags, &offset, - &dev_major, &dev_minor, &inode, filename); - - if(rv == EOF || rv < 7) - break; + if (sscanf(line, PROC_MAPS_FORMAT, + &start, &end, flags, &offset, + &dev_major, &dev_minor, &inode, &line_end) != 7) + break; - if(rv == 7) /* no filename */ - filename[0] = '\0'; + filename = line + line_end; + g_strstrip(filename); /* Compute access permissions. */ @@ -217,6 +215,7 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) } + free(line); fclose (maps); buf->flags = _glibtop_sysdeps_proc_map; diff --git a/sysdeps/linux/procopenfiles.c b/sysdeps/linux/procopenfiles.c index 0c3aaa82..c4c4b986 100644 --- a/sysdeps/linux/procopenfiles.c +++ b/sysdeps/linux/procopenfiles.c @@ -58,7 +58,8 @@ static void parse_file(const char *filename, LineParser parser, GHashTable *dict) { FILE *f; - char line[1024]; + char *line = NULL; + size_t size = 0; f = fopen(filename, "r"); @@ -67,15 +68,16 @@ parse_file(const char *filename, LineParser parser, GHashTable *dict) return; } + /* skip the first line */ - if(!fgets(line, sizeof line, f)) goto eof; + if (getline(&line, &size, f) == -1) + goto eof; - while(fgets(line, sizeof line, f)) - { + while (getline(&line, &size, f) != -1) parser(dict, line); - } eof: + free(line); fclose(f); } |