The -c option defines the user requested sampling period. It was implemented
  using an unsigned int variable but the type of the option was OPT_LONG. Thus,
  the option parser was overwriting memory belonging to other variables, namely
  the mmap_pages leading to a zero page sampling buffer. The bug was exposed
  only when compiling at -O0, probably because the compiler was padding
  variables at higher optimization levels.

  This patch fixes this problem by declaring user_interval as u64. This also
  avoids wrap-around issues for large period on 32-bit systems.
 
  Signed-off-by: Stephane Eranian <eran...@google.com>
--
 tools/perf/builtin-record.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0f467cf..78f64cc 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -33,8 +33,8 @@ enum write_mode_t {
 
 static int                     *fd[MAX_NR_CPUS][MAX_COUNTERS];
 
-static unsigned int            user_interval                   = UINT_MAX;
-static long                    default_interval                =      0;
+static u64                     user_interval                   = ULLONG_MAX;
+static u64                     default_interval                =      0;
 
 static int                     nr_cpus                         =      0;
 static unsigned int            page_size;
@@ -268,7 +268,7 @@ static void create_counter(int counter, int cpu)
         * it a weak assumption overridable by the user.
         */
        if (!attr->sample_period || (user_freq != UINT_MAX &&
-                                    user_interval != UINT_MAX)) {
+                                    user_interval != ULLONG_MAX)) {
                if (freq) {
                        attr->sample_type       |= PERF_SAMPLE_PERIOD;
                        attr->freq              = 1;
@@ -901,7 +901,7 @@ int cmd_record(int argc, const char **argv, const char 
*prefix __used)
        if (!event_array)
                return -ENOMEM;
 
-       if (user_interval != UINT_MAX)
+       if (user_interval != ULLONG_MAX)
                default_interval = user_interval;
        if (user_freq != UINT_MAX)
                freq = user_freq;

------------------------------------------------------------------------------

_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to