Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752109Ab3FXNLI (ORCPT ); Mon, 24 Jun 2013 09:11:08 -0400 Received: from mga14.intel.com ([143.182.124.37]:25371 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750807Ab3FXNLD (ORCPT ); Mon, 24 Jun 2013 09:11:03 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.87,928,1363158000"; d="scan'208";a="321686584" From: Adrian Hunter To: Arnaldo Carvalho de Melo Cc: linux-kernel@vger.kernel.org, David Ahern , Frederic Weisbecker , Jiri Olsa , Mike Galbraith , Namhyung Kim , Paul Mackerras , Peter Zijlstra , Stephane Eranian , Adrian Hunter Subject: [PATCH 09/15] perf tools: validate perf event header size Date: Mon, 24 Jun 2013 16:16:06 +0300 Message-Id: <1372079772-20803-10-git-send-email-adrian.hunter@intel.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1372079772-20803-1-git-send-email-adrian.hunter@intel.com> References: <1372079772-20803-1-git-send-email-adrian.hunter@intel.com> Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1780 Lines: 61 'size' includes the header so must be at least 'sizeof(struct perf_event_header)'. Error out immediately if that is not the case. Also don't byte-swap the header until it is actually "fetched" from the mmap region. Signed-off-by: Adrian Hunter --- tools/perf/util/session.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 19ea888..7e0d605 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1094,8 +1094,10 @@ more: perf_event_header__bswap(&event->header); size = event->header.size; - if (size == 0) - size = 8; + if (size < sizeof(struct perf_event_header)) { + pr_err("bad event header size\n"); + goto out_err; + } if (size > cur_size) { void *new = realloc(buf, size); @@ -1161,12 +1163,12 @@ fetch_mmaped_event(struct perf_session *session, event = (union perf_event *)(buf + head); - if (session->header.needs_swap) - perf_event_header__bswap(&event->header); - if (head + event->header.size > mmap_size) return NULL; + if (session->header.needs_swap) + perf_event_header__bswap(&event->header); + return event; } @@ -1245,7 +1247,7 @@ more: size = event->header.size; - if (size == 0 || + if (size < sizeof(struct perf_event_header) || perf_session__process_event(session, event, tool, file_pos) < 0) { pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", file_offset + head, event->header.size, -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/