Re: [Powertop] [PATCH 1/2] perf_bundle: Check memory allocation failure

Arjan van de Ven <arjan at linux.intel.com> Tue, 18 Sep 2012 07:25:06 -0700
Newsgroups dev.linux.lists.powertop
Message-ID <[email protected]>
--===============2729113143585514131==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

On 9/18/2012 7:21 AM, Namhyung Kim wrote:
> Check return value of malloc/strdup not to make NULL dereferences.

I don't mind these patches; they are clean code

however, one of the core userspace developers at work basically said "we do=
n't check for malloc NULL in userspace;
if that ever happens the system is so screwed up anyway that you just canno=
t continue".



> =

> Signed-off-by: Namhyung Kim <namhyung(a)gmail.com>
> ---
>  src/perf/perf_bundle.cpp |   13 +++++++++++++
>  1 file changed, 13 insertions(+)
> =

> diff --git a/src/perf/perf_bundle.cpp b/src/perf/perf_bundle.cpp
> index 38e1e91..4e70f30 100644
> --- a/src/perf/perf_bundle.cpp
> +++ b/src/perf/perf_bundle.cpp
> @@ -60,6 +60,9 @@ void perf_bundle_event::handle_event(struct perf_event_=
header *header, void *coo
>  	vector<void *> *vector;
>  =

>  	buffer =3D (unsigned char *)malloc(header->size);
> +	if (!buffer)
> +		return;
> +
>  	memcpy(buffer, header, header->size);
>  =

>  #ifdef USE_DECLTYPE
> @@ -130,6 +133,9 @@ static void parse_event_format(const char *event_name)
>  {
>  	char *tptr;
>  	char *name =3D strdup(event_name);
> +	if (!name)
> +		return;
> +
>  	char *sys =3D strtok_r(name, ":", &tptr);
>  	char *event =3D strtok_r(NULL, ":", &tptr);
>  	char *file;
> @@ -137,6 +143,9 @@ static void parse_event_format(const char *event_name)
>  =

>  	file =3D (char *)malloc(strlen(sys) + strlen(event) +
>  		      strlen("/sys/kernel/debug/tracing/events////format") + 2);
> +	if (!file)
> +		return;
> +
>  	sprintf(file, "/sys/kernel/debug/tracing/events/%s/%s/format", sys, eve=
nt);
>  =

>  	buf =3D read_file(file);
> @@ -169,6 +178,10 @@ bool perf_bundle::add_event(const char *event_name)
>  		if ((int)ev->trace_type >=3D 0) {
>  			if (event_names.find(ev->trace_type) =3D=3D event_names.end()) {
>  				event_names[ev->trace_type] =3D strdup(event_name);
> +				if (!event_names[ev->trace_type]) {
> +					delete ev;
> +					continue;
> +				}
>  				parse_event_format(event_name);
>  			}
>  			events.push_back(ev);
> =



--===============2729113143585514131==--