From: Adrian Hunter <adrian.hunter@intel.com>
To: Jiri Olsa <jolsa@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
linux-kernel@vger.kernel.org, David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Mike Galbraith <efault@gmx.de>, Namhyung Kim <namhyung@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Peter Zijlstra <peterz@infradead.org>,
Stephane Eranian <eranian@google.com>,
Ingo Molnar <mingo@kernel.org>
Subject: Re: [PATCH V6 05/12] perf tools: tidy up sample parsing overflow checking
Date: Wed, 17 Jul 2013 09:33:30 +0300 [thread overview]
Message-ID: <51E63ABA.9030803@intel.com> (raw)
In-Reply-To: <20130716115323.GA9964@krava.brq.redhat.com>
On 16/07/13 14:53, Jiri Olsa wrote:
> On Tue, Jul 16, 2013 at 09:38:11AM +0300, Adrian Hunter wrote:
>> The size of data retrieved from a sample event must be
>> validated to ensure it does not go past the end of the
>> event. That was being done sporadically and without
>> considering integer overflows.
>>
>> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
>> ---
>> tools/perf/util/evsel.c | 102 ++++++++++++++++++++++++++++++------------------
>> 1 file changed, 64 insertions(+), 38 deletions(-)
>>
>> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
>> index 724b75a..20e2ed9 100644
>> --- a/tools/perf/util/evsel.c
>> +++ b/tools/perf/util/evsel.c
>> @@ -1114,24 +1114,38 @@ static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
>> return 0;
>> }
>>
>> -static bool sample_overlap(const union perf_event *event,
>> - const void *offset, u64 size)
>> +static inline bool overflow_one(const void *endp, const void *offset)
>> {
>> - const void *base = event;
>> -
>> - if (offset + size > base + event->header.size)
>> - return true;
>> + return offset + sizeof(u64) > endp;
>> +}
>>
>> - return false;
>> +static inline bool overflow(const void *endp, u16 max_size, const void *offset,
>> + u64 size)
>> +{
>> + return size > max_size || offset + size > endp;
>
> hum, does '(size > max_size)' catch anything that would
> not be catched by '(offset + size > endp)' ?
'offset + size' can overflow and end up less than endp
>
>> }
>>
>> +#define OVERFLOW_CHECK_ONE(offset) \
>> + do { \
>> + if (overflow_one(endp, (offset))) \
>> + return -EFAULT; \
>> + } while (0)
>> +
>> +#define OVERFLOW_CHECK(offset, size) \
>> + do { \
>> + if (overflow(endp, max_size, (offset), (size))) \
>> + return -EFAULT; \
>> + } while (0)
>
> I think, it'd be better to have just one overflow check function, like:
>
> static inline bool overflow(const void *endp, const void *offset, u64 size)
> {
> return offset + size > endp;
> }
>
> #define OVERFLOW_CHECK(offset, size) \
> do { \
> if (overflow(endp, (offset), (size))) \
> return -EFAULT; \
> } while (0)
>
> #define OVERFLOW_CHECK_u64(offset) OVERFLOW_CHECK(offset, sizeof(u64))
>
OK
>> +
>> int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
>> struct perf_sample *data)
>> {
>
> Hum, I was thinking of making this check more general and
> cover also perf_event__synthesize_sample function.. but
> looks like it's not needed there..?
Currently the caller must ensure there is enough space.
>
>
>> u64 type = evsel->attr.sample_type;
>> - u64 regs_user = evsel->attr.sample_regs_user;
>> bool swapped = evsel->needs_swap;
>> const u64 *array;
>> + u16 max_size = event->header.size;
>> + const void *endp = (void *)event + max_size;
>> + u64 sz;
>>
>> /*
>> * used for cross-endian analysis. See git commit 65014ab3
>> @@ -1153,6 +1167,11 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
>>
>> array = event->sample.array;
>>
>> + /*
>> + * sample_size is based on PERF_SAMPLE_MASK which includes up to
>
> please prepend ^^^: The evsel's
OK
>
>> + * PERF_SAMPLE_PERIOD. After that overflow_one() or overflow() must be
>> + * used to check the format does not go past the end of the event.
>> + */
>> if (evsel->sample_size + sizeof(event->header) > event->header.size)
>> return -EFAULT;
>>
next prev parent reply other threads:[~2013-07-17 6:27 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-16 6:38 [PATCH V6 00/12] perf tools: some fixes and tweaks Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 01/12] perf tools: add debug prints Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 02/12] perf tools: allow non-matching sample types Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 03/12] perf tools: add pid to struct thread Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 04/12] perf tools: change machine__findnew_thread() to set thread pid Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 05/12] perf tools: tidy up sample parsing overflow checking Adrian Hunter
2013-07-16 11:53 ` Jiri Olsa
2013-07-17 6:33 ` Adrian Hunter [this message]
2013-07-16 6:38 ` [PATCH V6 06/12] perf tools: remove unnecessary callchain validation Adrian Hunter
2013-07-16 12:05 ` Jiri Olsa
2013-07-17 8:02 ` Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 07/12] perf tools: remove references to struct ip_event Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 08/12] perf tools: move " Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 09/12] perf: make events stream always parsable Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 10/12] perf tools: add support for PERF_SAMPLE_IDENTFIER Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 11/12] perf tools: expand perf_event__synthesize_sample() Adrian Hunter
2013-07-16 6:38 ` [PATCH V6 12/12] perf tools: add a sample parsing test Adrian Hunter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51E63ABA.9030803@intel.com \
--to=adrian.hunter@intel.com \
--cc=acme@ghostprotocols.net \
--cc=dsahern@gmail.com \
--cc=efault@gmx.de \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@gmail.com \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.