From: Emanuele Aina Date: Tue, 9 Feb 2016 22:02:31 +0000 (+0100) Subject: pmap: Fix detail parsing on long mapping lines X-Git-Tag: v4.0.0~968 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b921e2e765d7daae3cb28ac22ca7b00ffdb4b168;p=procps-ng 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 --- diff --git a/pmap.c b/pmap.c index 734dedae..d8d163f7 100644 --- 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];