summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoît Dejean <benoit@placenet.org>2007-01-14 18:09:56 +0000
committerBenoît Dejean <bdejean@src.gnome.org>2007-01-14 18:09:56 +0000
commite156172e7ce13e4830aa8db878626ae4b740204b (patch)
treec313f18536b4572b6f84db4356d4833aa8c7742c
parentc9385972bdafd52271690b1a86b874fceec650ac (diff)
downloadlibgtop-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/ChangeLog10
-rw-r--r--sysdeps/linux/procmap.c27
-rw-r--r--sysdeps/linux/procopenfiles.c12
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);
}