summaryrefslogtreecommitdiff
path: root/showmap
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2014-04-18 16:47:20 -0700
committerJeff Brown <jeffbrown@google.com>2014-04-18 16:47:20 -0700
commit9a213e07f1e1f083bc56dbe707e0ec2af3990b43 (patch)
tree99ad024d2003b3c80158f03408d3803022d24981 /showmap
parente35f7fedabf9346d299abe10af25eaf88207a133 (diff)
downloadextras-9a213e07f1e1f083bc56dbe707e0ec2af3990b43.tar.gz
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
Diffstat (limited to 'showmap')
-rw-r--r--showmap/showmap.c44
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) {