]> granicus.if.org Git - procps-ng/commitdiff
pmap: Fix detail parsing on long mapping lines
authorEmanuele Aina <emanuele.aina@collabora.com>
Tue, 9 Feb 2016 22:02:31 +0000 (23:02 +0100)
committerCraig Small <csmall@enc.com.au>
Mon, 11 Apr 2016 12:14:03 +0000 (22:14 +1000)
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

diff --git a/pmap.c b/pmap.c
index 734dedae06eb7c6b6d171799c66fb679df749e1f..d8d163f7eb6ec18313ddb76646ae759d044a9e78 100644 (file)
--- a/pmap.c
+++ b/pmap.c
@@ -318,17 +318,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];