diff options
author | Jeff Brown <jeffbrown@google.com> | 2014-04-18 16:47:20 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2014-04-18 16:47:20 -0700 |
commit | 9a213e07f1e1f083bc56dbe707e0ec2af3990b43 (patch) | |
tree | 99ad024d2003b3c80158f03408d3803022d24981 | |
parent | e35f7fedabf9346d299abe10af25eaf88207a133 (diff) | |
download | android_system_extras-9a213e07f1e1f083bc56dbe707e0ec2af3990b43.tar.gz android_system_extras-9a213e07f1e1f083bc56dbe707e0ec2af3990b43.tar.bz2 android_system_extras-9a213e07f1e1f083bc56dbe707e0ec2af3990b43.zip |
Ignore VmFlags: and other unrecognized fields.
Fixed a bug that causes showmap to skip items when /proc/pid/smap
included any unrecognized fields.
Change-Id: Ic648d4272d0269ff226047cf2d3271e9e63bb302
-rw-r--r-- | showmap/showmap.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/showmap/showmap.c b/showmap/showmap.c index f8ee9358..d90f269f 100644 --- a/showmap/showmap.c +++ b/showmap/showmap.c @@ -86,29 +86,31 @@ static int parse_header(const char* line, const mapinfo* prev, mapinfo** mi) { static int parse_field(mapinfo* mi, const char* line) { char field[64]; - int size; - - if (sscanf(line, "%63s %d kB", field, &size) != 2) { - return -1; - } + int len; - if (!strcmp(field, "Size:")) { - mi->size = size; - } else if (!strcmp(field, "Rss:")) { - mi->rss = size; - } else if (!strcmp(field, "Pss:")) { - mi->pss = size; - } else if (!strcmp(field, "Shared_Clean:")) { - mi->shared_clean = size; - } else if (!strcmp(field, "Shared_Dirty:")) { - mi->shared_dirty = size; - } else if (!strcmp(field, "Private_Clean:")) { - mi->private_clean = size; - } else if (!strcmp(field, "Private_Dirty:")) { - mi->private_dirty = size; + if (sscanf(line, "%63s %n", field, &len) == 1 + && *field && field[strlen(field) - 1] == ':') { + int size; + if (sscanf(line + len, "%d kB", &size) == 1) { + if (!strcmp(field, "Size:")) { + mi->size = size; + } else if (!strcmp(field, "Rss:")) { + mi->rss = size; + } else if (!strcmp(field, "Pss:")) { + mi->pss = size; + } else if (!strcmp(field, "Shared_Clean:")) { + mi->shared_clean = size; + } else if (!strcmp(field, "Shared_Dirty:")) { + mi->shared_dirty = size; + } else if (!strcmp(field, "Private_Clean:")) { + mi->private_clean = size; + } else if (!strcmp(field, "Private_Dirty:")) { + mi->private_dirty = size; + } + } + return 0; } - - return 0; + return -1; } static int order_before(const mapinfo *a, const mapinfo *b, int sort_by_address) { |