diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9d319642b8..63c3fa9ad1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2013-04-05 Jan Kratochvil + + Fix compatibility with Linux kernel 3.8.3. + * linux-tdep.c (linux_find_memory_regions_full): Move variable number + to more inner block. Remove parsing of NUMBER from outer block. + Parse NUMBER only if KEYWORD has been identified. + 2013-04-05 Jan Kratochvil Fix variable name shadowing. diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index cc63e9b8e5..9def108648 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -720,20 +720,30 @@ linux_find_memory_regions_full (struct gdbarch *gdbarch, line = strtok (NULL, "\n")) { char keyword[64 + 1]; - unsigned long number; - if (sscanf (line, "%64s%lu kB\n", keyword, &number) != 2) + if (sscanf (line, "%64s", keyword) != 1) { warning (_("Error parsing {s,}maps file '%s'"), mapsfilename); break; } if (strcmp (keyword, "Anonymous:") == 0) has_anonymous = 1; - if (number != 0 && (strcmp (keyword, "Shared_Dirty:") == 0 - || strcmp (keyword, "Private_Dirty:") == 0 - || strcmp (keyword, "Swap:") == 0 - || strcmp (keyword, "Anonymous:") == 0)) - modified = 1; + if (strcmp (keyword, "Shared_Dirty:") == 0 + || strcmp (keyword, "Private_Dirty:") == 0 + || strcmp (keyword, "Swap:") == 0 + || strcmp (keyword, "Anonymous:") == 0) + { + unsigned long number; + + if (sscanf (line, "%*s%lu", &number) != 1) + { + warning (_("Error parsing {s,}maps file '%s' number"), + mapsfilename); + break; + } + if (number != 0) + modified = 1; + } } /* Older Linux kernels did not support the "Anonymous:" counter.