linux-trace-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] rtla: fix double free
@ 2022-07-25 13:10 Andreas Schwab
  2022-07-25 13:34 ` Daniel Bristot de Oliveira
  0 siblings, 1 reply; 8+ messages in thread
From: Andreas Schwab @ 2022-07-25 13:10 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira
  Cc: Steven Rostedt, linux-trace-devel, linux-kernel

Don't call trace_instance_destroy in trace_instance_init when it fails,
this is done by the caller.

Signed-off-by: Andreas Schwab <schwab@suse.de>
---
 tools/tracing/rtla/src/trace.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tools/tracing/rtla/src/trace.c b/tools/tracing/rtla/src/trace.c
index 5784c9f9e570..7c27fc2a52cb 100644
--- a/tools/tracing/rtla/src/trace.c
+++ b/tools/tracing/rtla/src/trace.c
@@ -179,7 +179,6 @@ int trace_instance_init(struct trace_instance *trace, char *tool_name)
 	return 0;
 
 out_err:
-	trace_instance_destroy(trace);
 	return 1;
 }
 
-- 
2.37.1


-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] rtla: fix double free
  2022-07-25 13:10 [PATCH] rtla: fix double free Andreas Schwab
@ 2022-07-25 13:34 ` Daniel Bristot de Oliveira
  2022-07-25 13:46   ` Andreas Schwab
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-07-25 13:34 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Steven Rostedt, linux-trace-devel, linux-kernel

Hi Andreas

On 7/25/22 15:10, Andreas Schwab wrote:
> Don't call trace_instance_destroy in trace_instance_init when it fails,
> this is done by the caller.

Regarding the Subject, are you seeing a double-free error, or it is just an
optimization?

AFAICS, trace_instance_destroy() checks the pointers before calling free().

Why am I asking? because if it is a double-free bug, we need to add the "Fixes:"
tag, otherwise, we can think about a Subject that better describes the patch,  like:

"rtla: Do not call trace_instance_destroy() twice on error"

Also, after the "subsystem:," i.e., "rlta:" we need to use capital: e.g.,

"rtla: Fix double free"

Anyways, I see that the code makes sense. I am just trying to improve the
description.

Thanks!
-- Daniel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] rtla: fix double free
  2022-07-25 13:34 ` Daniel Bristot de Oliveira
@ 2022-07-25 13:46   ` Andreas Schwab
  2022-07-25 14:56     ` Steven Rostedt
  0 siblings, 1 reply; 8+ messages in thread
From: Andreas Schwab @ 2022-07-25 13:46 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira
  Cc: Steven Rostedt, linux-trace-devel, linux-kernel

On Jul 25 2022, Daniel Bristot de Oliveira wrote:

> Hi Andreas
>
> On 7/25/22 15:10, Andreas Schwab wrote:
>> Don't call trace_instance_destroy in trace_instance_init when it fails,
>> this is done by the caller.
>
> Regarding the Subject, are you seeing a double-free error, or it is just an
> optimization?

A double free nowadays is almost always an error, due to better malloc
checking.

> AFAICS, trace_instance_destroy() checks the pointers before calling free().

That doesn't help when the pointer is not cleared afterwards.  Do you
prefer that?

> Why am I asking? because if it is a double-free bug, we need to add the "Fixes:"
> tag,

It's the first time I tried running rtla, so I don't know whether it is
a regression, but from looking at the history it appears to have been
introduced already in commit 0605bf009f18 ("rtla: Add osnoise tool")

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] rtla: fix double free
  2022-07-25 13:46   ` Andreas Schwab
@ 2022-07-25 14:56     ` Steven Rostedt
  2022-07-25 15:12       ` [PATCH v2] rtla: Fix " Andreas Schwab
  2022-07-25 15:22       ` [PATCH] rtla: fix " Daniel Bristot de Oliveira
  0 siblings, 2 replies; 8+ messages in thread
From: Steven Rostedt @ 2022-07-25 14:56 UTC (permalink / raw)
  To: Andreas Schwab
  Cc: Daniel Bristot de Oliveira, linux-trace-devel, linux-kernel

On Mon, 25 Jul 2022 15:46:40 +0200
Andreas Schwab <schwab@suse.de> wrote:

> On Jul 25 2022, Daniel Bristot de Oliveira wrote:
> 
> > Hi Andreas
> >
> > On 7/25/22 15:10, Andreas Schwab wrote:  
> >> Don't call trace_instance_destroy in trace_instance_init when it fails,
> >> this is done by the caller.  
> >
> > Regarding the Subject, are you seeing a double-free error, or it is just an
> > optimization?  
> 
> A double free nowadays is almost always an error, due to better malloc
> checking.
> 
> > AFAICS, trace_instance_destroy() checks the pointers before calling free().  
> 
> That doesn't help when the pointer is not cleared afterwards.  Do you
> prefer that?
> 
> > Why am I asking? because if it is a double-free bug, we need to add the "Fixes:"
> > tag,  
> 
> It's the first time I tried running rtla, so I don't know whether it is
> a regression, but from looking at the history it appears to have been
> introduced already in commit 0605bf009f18 ("rtla: Add osnoise tool")
> 

I think the real fix is to make trace_instance_destroy() be able to be
called more than once.

void trace_instance_destroy(struct trace_instance *trace)
{
        if (trace->inst) {
                disable_tracer(trace->inst);
                destroy_instance(trace->inst);
		trace->inst = NULL;
        }

        if (trace->seq) {
                free(trace->seq);
		trace->seq = NULL;
	}

        if (trace->tep) {
                tep_free(trace->tep);
		trace->tep = NULL;
	}
}

As trace_instance_init() is doing the above allocations, it should clean it
up on error. But I also agree, this will lead to double free without
changing trace_instance_destroy() to be the above and then calling it twice.

-- Steve

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2] rtla: Fix double free
  2022-07-25 14:56     ` Steven Rostedt
@ 2022-07-25 15:12       ` Andreas Schwab
  2022-07-25 15:18         ` Andreas Schwab
  2022-07-25 15:23         ` Daniel Bristot de Oliveira
  2022-07-25 15:22       ` [PATCH] rtla: fix " Daniel Bristot de Oliveira
  1 sibling, 2 replies; 8+ messages in thread
From: Andreas Schwab @ 2022-07-25 15:12 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Daniel Bristot de Oliveira, linux-trace-devel, linux-kernel

Avoid double free by making trace_instance_destroy indempotent.  When
trace_instance_init fails, it calls trace_instance_destroy, but its only
caller osnoise_destroy_tool calls it again.

Fixes: 0605bf009f18 ("rtla: Add osnoise tool")
Signed-off-by: Andreas Schwab <schwab@suse.de>
---
 tools/tracing/rtla/src/trace.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/tools/tracing/rtla/src/trace.c b/tools/tracing/rtla/src/trace.c
index 5784c9f9e570..e1ba6d9f4265 100644
--- a/tools/tracing/rtla/src/trace.c
+++ b/tools/tracing/rtla/src/trace.c
@@ -134,13 +134,18 @@ void trace_instance_destroy(struct trace_instance *trace)
 	if (trace->inst) {
 		disable_tracer(trace->inst);
 		destroy_instance(trace->inst);
+		trace->inst = NULL;
 	}
 
-	if (trace->seq)
+	if (trace->seq) {
 		free(trace->seq);
+		trace->seq = NULL;
+	}
 
-	if (trace->tep)
+	if (trace->tep) {
 		tep_free(trace->tep);
+		trace->tep = NULL;
+	}
 }
 
 /*
-- 
2.37.1


-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] rtla: Fix double free
  2022-07-25 15:12       ` [PATCH v2] rtla: Fix " Andreas Schwab
@ 2022-07-25 15:18         ` Andreas Schwab
  2022-07-25 15:23         ` Daniel Bristot de Oliveira
  1 sibling, 0 replies; 8+ messages in thread
From: Andreas Schwab @ 2022-07-25 15:18 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Daniel Bristot de Oliveira, linux-trace-devel, linux-kernel

On Jul 25 2022, Andreas Schwab wrote:

> Avoid double free by making trace_instance_destroy indempotent.  When

s/indempotent/idempotent/

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] rtla: fix double free
  2022-07-25 14:56     ` Steven Rostedt
  2022-07-25 15:12       ` [PATCH v2] rtla: Fix " Andreas Schwab
@ 2022-07-25 15:22       ` Daniel Bristot de Oliveira
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-07-25 15:22 UTC (permalink / raw)
  To: Steven Rostedt, Andreas Schwab; +Cc: linux-trace-devel, linux-kernel

On 7/25/22 16:56, Steven Rostedt wrote:
> On Mon, 25 Jul 2022 15:46:40 +0200
> Andreas Schwab <schwab@suse.de> wrote:
> 
>> On Jul 25 2022, Daniel Bristot de Oliveira wrote:
>>
>>> Hi Andreas
>>>
>>> On 7/25/22 15:10, Andreas Schwab wrote:  
>>>> Don't call trace_instance_destroy in trace_instance_init when it fails,
>>>> this is done by the caller.  
>>>
>>> Regarding the Subject, are you seeing a double-free error, or it is just an
>>> optimization?  
>>
>> A double free nowadays is almost always an error, due to better malloc
>> checking.
>>
>>> AFAICS, trace_instance_destroy() checks the pointers before calling free().  
>>
>> That doesn't help when the pointer is not cleared afterwards.  Do you
>> prefer that?
>>
>>> Why am I asking? because if it is a double-free bug, we need to add the "Fixes:"
>>> tag,  
>>
>> It's the first time I tried running rtla, so I don't know whether it is
>> a regression, but from looking at the history it appears to have been
>> introduced already in commit 0605bf009f18 ("rtla: Add osnoise tool")
>>
> 
> I think the real fix is to make trace_instance_destroy() be able to be
> called more than once.
> 
> void trace_instance_destroy(struct trace_instance *trace)
> {
>         if (trace->inst) {
>                 disable_tracer(trace->inst);
>                 destroy_instance(trace->inst);
> 		trace->inst = NULL
ah! right, it was missing this... ^^^
-- Daniel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2] rtla: Fix double free
  2022-07-25 15:12       ` [PATCH v2] rtla: Fix " Andreas Schwab
  2022-07-25 15:18         ` Andreas Schwab
@ 2022-07-25 15:23         ` Daniel Bristot de Oliveira
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-07-25 15:23 UTC (permalink / raw)
  To: Andreas Schwab, Steven Rostedt; +Cc: linux-trace-devel, linux-kernel

On 7/25/22 17:12, Andreas Schwab wrote:
> Avoid double free by making trace_instance_destroy indempotent.  When
> trace_instance_init fails, it calls trace_instance_destroy, but its only
> caller osnoise_destroy_tool calls it again.
> 
> Fixes: 0605bf009f18 ("rtla: Add osnoise tool")
> Signed-off-by: Andreas Schwab <schwab@suse.de>

Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>

Thanks!
-- Daniel

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-07-25 15:23 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-25 13:10 [PATCH] rtla: fix double free Andreas Schwab
2022-07-25 13:34 ` Daniel Bristot de Oliveira
2022-07-25 13:46   ` Andreas Schwab
2022-07-25 14:56     ` Steven Rostedt
2022-07-25 15:12       ` [PATCH v2] rtla: Fix " Andreas Schwab
2022-07-25 15:18         ` Andreas Schwab
2022-07-25 15:23         ` Daniel Bristot de Oliveira
2022-07-25 15:22       ` [PATCH] rtla: fix " Daniel Bristot de Oliveira

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).