From patchwork Wed Jan 6 03:41:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 59219 Delivered-To: patch@linaro.org Received: by 10.112.130.2 with SMTP id oa2csp6343339lbb; Tue, 5 Jan 2016 19:43:02 -0800 (PST) X-Received: by 10.66.150.37 with SMTP id uf5mr141295975pab.30.1452051781987; Tue, 05 Jan 2016 19:43:01 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ko6si4739491pab.2.2016.01.05.19.43.01; Tue, 05 Jan 2016 19:43:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752210AbcAFDm7 (ORCPT + 29 others); Tue, 5 Jan 2016 22:42:59 -0500 Received: from szxga01-in.huawei.com ([58.251.152.64]:39753 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751809AbcAFDm5 (ORCPT ); Tue, 5 Jan 2016 22:42:57 -0500 Received: from 172.24.1.48 (EHLO szxeml428-hub.china.huawei.com) ([172.24.1.48]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DCJ13445; Wed, 06 Jan 2016 11:42:28 +0800 (CST) Received: from linux-4hy3.site (10.107.193.248) by szxeml428-hub.china.huawei.com (10.82.67.183) with Microsoft SMTP Server id 14.3.235.1; Wed, 6 Jan 2016 11:41:39 +0800 From: Wang Nan To: , CC: , , , Wang Nan , Arnaldo Carvalho de Melo , He Kuang , Masami Hiramatsu , Namhyung Kim Subject: [PATCH] perf tools: Fix mmap2 event allocation in synthesize code Date: Wed, 6 Jan 2016 03:41:23 +0000 Message-ID: <1452051683-21916-1-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 MIME-Version: 1.0 X-Originating-IP: [10.107.193.248] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020201.568C8D26.0102, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: ee2d980faa2405fde16f54211b366866 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org perf_event__synthesize_mmap_events() issues mmap2 events, but the memory of that event is allocated using: mmap_event = malloc(sizeof(mmap_event->mmap) + machine->id_hdr_size); If path of mmap source file is long (near PATH_MAX), random crash would happen. Should use sizeof(mmap_event->mmap2). Fix two memory allocations and rename all mmap_event to mmap2_event to make it clear. Signed-off-by: Wang Nan Cc: Arnaldo Carvalho de Melo Cc: He Kuang Cc: Jiri Olsa Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Zefan Li Cc: pi3orama@163.com --- tools/perf/util/event.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) -- 1.8.3.4 -- 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/ diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index cd61bb1..cde8228 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -413,7 +413,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool, } static int __event__synthesize_thread(union perf_event *comm_event, - union perf_event *mmap_event, + union perf_event *mmap2_event, union perf_event *fork_event, pid_t pid, int full, perf_event__handler_t process, @@ -436,7 +436,7 @@ static int __event__synthesize_thread(union perf_event *comm_event, if (tgid == -1) return -1; - return perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid, + return perf_event__synthesize_mmap_events(tool, mmap2_event, pid, tgid, process, machine, mmap_data, proc_map_timeout); } @@ -478,7 +478,7 @@ static int __event__synthesize_thread(union perf_event *comm_event, rc = 0; if (_pid == pid) { /* process the parent's maps too */ - rc = perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid, + rc = perf_event__synthesize_mmap_events(tool, mmap2_event, pid, tgid, process, machine, mmap_data, proc_map_timeout); if (rc) break; @@ -496,15 +496,15 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, bool mmap_data, unsigned int proc_map_timeout) { - union perf_event *comm_event, *mmap_event, *fork_event; + union perf_event *comm_event, *mmap2_event, *fork_event; int err = -1, thread, j; comm_event = malloc(sizeof(comm_event->comm) + machine->id_hdr_size); if (comm_event == NULL) goto out; - mmap_event = malloc(sizeof(mmap_event->mmap) + machine->id_hdr_size); - if (mmap_event == NULL) + mmap2_event = malloc(sizeof(mmap2_event->mmap2) + machine->id_hdr_size); + if (mmap2_event == NULL) goto out_free_comm; fork_event = malloc(sizeof(fork_event->fork) + machine->id_hdr_size); @@ -513,7 +513,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, err = 0; for (thread = 0; thread < threads->nr; ++thread) { - if (__event__synthesize_thread(comm_event, mmap_event, + if (__event__synthesize_thread(comm_event, mmap2_event, fork_event, thread_map__pid(threads, thread), 0, process, tool, machine, @@ -539,7 +539,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, /* if not, generate events for it */ if (need_leader && - __event__synthesize_thread(comm_event, mmap_event, + __event__synthesize_thread(comm_event, mmap2_event, fork_event, comm_event->comm.pid, 0, process, tool, machine, @@ -551,7 +551,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, } free(fork_event); out_free_mmap: - free(mmap_event); + free(mmap2_event); out_free_comm: free(comm_event); out: @@ -567,7 +567,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, DIR *proc; char proc_path[PATH_MAX]; struct dirent dirent, *next; - union perf_event *comm_event, *mmap_event, *fork_event; + union perf_event *comm_event, *mmap2_event, *fork_event; int err = -1; if (machine__is_default_guest(machine)) @@ -577,8 +577,8 @@ int perf_event__synthesize_threads(struct perf_tool *tool, if (comm_event == NULL) goto out; - mmap_event = malloc(sizeof(mmap_event->mmap) + machine->id_hdr_size); - if (mmap_event == NULL) + mmap2_event = malloc(sizeof(mmap2_event->mmap2) + machine->id_hdr_size); + if (mmap2_event == NULL) goto out_free_comm; fork_event = malloc(sizeof(fork_event->fork) + machine->id_hdr_size); @@ -601,7 +601,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, * We may race with exiting thread, so don't stop just because * one thread couldn't be synthesized. */ - __event__synthesize_thread(comm_event, mmap_event, fork_event, pid, + __event__synthesize_thread(comm_event, mmap2_event, fork_event, pid, 1, process, tool, machine, mmap_data, proc_map_timeout); } @@ -611,7 +611,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, out_free_fork: free(fork_event); out_free_mmap: - free(mmap_event); + free(mmap2_event); out_free_comm: free(comm_event); out: