From 9965fdcbe4a65efadba6ee27504eb8c9b536c873 Mon Sep 17 00:00:00 2001 From: Emanuele Aina Date: Tue, 9 Feb 2016 23:02:31 +0100 Subject: [PATCH] pmap: Fix detail parsing on long mapping lines If the mapping descriptor is longer than 128 chars, the last parsed character won't be a newline even if the current buffer contains it a bit further than that. The current code always interprets it as a short fgets() read instead, and thus keeps calling fgets() until it gets a newline, dropping valid lines and failing with the following error: pmap: ERROR: inconsistent detail field in smaps file, line: Rss: 212 kB --- pmap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pmap.c b/pmap.c index ac45f5bb..0ca95e9c 100644 --- a/pmap.c +++ b/pmap.c @@ -314,17 +314,17 @@ static void print_extended_maps (FILE *f) while (ret != NULL) { /* === READ MAPPING === */ map_desc[0] = '\0'; - c = '\n'; nfields = sscanf(mapbuf, "%"NUML"[0-9a-f]-%"NUML"[0-9a-f] " "%"DETL"s %"NUML"[0-9a-f] " - "%63[0-9a-f:] %"NUML"s %127[^\n]%c", + "%63[0-9a-f:] %"NUML"s %127[^\n]", start, end, perms, offset, - dev, inode, map_desc, &c); + dev, inode, map_desc); /* Must read at least up to inode, else something has changed! */ if (nfields < 6) xerrx(EXIT_FAILURE, _("Unknown format in smaps file!")); /* If line too long we dump everything else. */ + c = mapbuf[strlen(mapbuf) - 1]; while (c != '\n') { ret = fgets(mapbuf, sizeof mapbuf, f); c = mapbuf[strlen(mapbuf) - 1];