* [PATCH] Fix a memory leak in the i386 setup code @ 2006-07-10 22:13 Catalin Marinas 2006-07-10 22:25 ` Rafael J. Wysocki 2006-07-10 22:45 ` functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] Michael Tokarev 0 siblings, 2 replies; 7+ messages in thread From: Catalin Marinas @ 2006-07-10 22:13 UTC (permalink / raw) To: linux-kernel From: Catalin Marinas <catalin.marinas@gmail.com> Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com> --- arch/i386/kernel/setup.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 08c00d2..d32d264 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -1327,7 +1327,10 @@ #endif res->start = e820.map[i].addr; res->end = res->start + e820.map[i].size - 1; res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; - request_resource(&iomem_resource, res); + if (request_resource(&iomem_resource, res)) { + kfree(res); + continue; + } if (e820.map[i].type == E820_RAM) { /* * We don't know which RAM region contains kernel data, ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] Fix a memory leak in the i386 setup code 2006-07-10 22:13 [PATCH] Fix a memory leak in the i386 setup code Catalin Marinas @ 2006-07-10 22:25 ` Rafael J. Wysocki 2006-07-11 7:47 ` Catalin Marinas 2006-07-10 22:45 ` functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] Michael Tokarev 1 sibling, 1 reply; 7+ messages in thread From: Rafael J. Wysocki @ 2006-07-10 22:25 UTC (permalink / raw) To: Catalin Marinas; +Cc: linux-kernel Hi, Does x86_64 need a similar fix? On Tuesday 11 July 2006 00:13, Catalin Marinas wrote: > From: Catalin Marinas <catalin.marinas@gmail.com> > > Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com> > --- > > arch/i386/kernel/setup.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c > index 08c00d2..d32d264 100644 > --- a/arch/i386/kernel/setup.c > +++ b/arch/i386/kernel/setup.c > @@ -1327,7 +1327,10 @@ #endif > res->start = e820.map[i].addr; > res->end = res->start + e820.map[i].size - 1; > res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; > - request_resource(&iomem_resource, res); > + if (request_resource(&iomem_resource, res)) { > + kfree(res); > + continue; > + } > if (e820.map[i].type == E820_RAM) { > /* > * We don't know which RAM region contains kernel data, > - Evidently res is used if e820.map[i].type == E820_RAM, so it should be freed later on, it seems. Greetings, Rafael ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Fix a memory leak in the i386 setup code 2006-07-10 22:25 ` Rafael J. Wysocki @ 2006-07-11 7:47 ` Catalin Marinas 2006-07-11 8:26 ` Rafael J. Wysocki 0 siblings, 1 reply; 7+ messages in thread From: Catalin Marinas @ 2006-07-11 7:47 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: linux-kernel On 10/07/06, Rafael J. Wysocki <rjw@sisk.pl> wrote: > Does x86_64 need a similar fix? Doesn't look like it needs this. > On Tuesday 11 July 2006 00:13, Catalin Marinas wrote: > > --- a/arch/i386/kernel/setup.c > > +++ b/arch/i386/kernel/setup.c > > @@ -1327,7 +1327,10 @@ #endif > > res->start = e820.map[i].addr; > > res->end = res->start + e820.map[i].size - 1; > > res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; > > - request_resource(&iomem_resource, res); > > + if (request_resource(&iomem_resource, res)) { > > + kfree(res); > > + continue; > > + } > > if (e820.map[i].type == E820_RAM) { > > /* > > * We don't know which RAM region contains kernel data, > > Evidently res is used if e820.map[i].type == E820_RAM, so it should > be freed later on, it seems. The "if" block I added has a "continue" and therefore the E820_RAM case is skipped. There is no point in requesting a resource with "res" as parent when "res" couldn't be successfully acquired. -- Catalin ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Fix a memory leak in the i386 setup code 2006-07-11 7:47 ` Catalin Marinas @ 2006-07-11 8:26 ` Rafael J. Wysocki 0 siblings, 0 replies; 7+ messages in thread From: Rafael J. Wysocki @ 2006-07-11 8:26 UTC (permalink / raw) To: Catalin Marinas; +Cc: linux-kernel On Tuesday 11 July 2006 09:47, Catalin Marinas wrote: > On 10/07/06, Rafael J. Wysocki <rjw@sisk.pl> wrote: > > Does x86_64 need a similar fix? > > Doesn't look like it needs this. > > > On Tuesday 11 July 2006 00:13, Catalin Marinas wrote: > > > --- a/arch/i386/kernel/setup.c > > > +++ b/arch/i386/kernel/setup.c > > > @@ -1327,7 +1327,10 @@ #endif > > > res->start = e820.map[i].addr; > > > res->end = res->start + e820.map[i].size - 1; > > > res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; > > > - request_resource(&iomem_resource, res); > > > + if (request_resource(&iomem_resource, res)) { > > > + kfree(res); > > > + continue; > > > + } > > > if (e820.map[i].type == E820_RAM) { > > > /* > > > * We don't know which RAM region contains kernel data, > > > > Evidently res is used if e820.map[i].type == E820_RAM, so it should > > be freed later on, it seems. > > The "if" block I added has a "continue" and therefore the E820_RAM > case is skipped. There is no point in requesting a resource with "res" > as parent when "res" couldn't be successfully acquired. Ah, right, it's freed when request_resource(&iomem_resource, res) fails. Sorry for the noise. Rafael ^ permalink raw reply [flat|nested] 7+ messages in thread
* functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] 2006-07-10 22:13 [PATCH] Fix a memory leak in the i386 setup code Catalin Marinas 2006-07-10 22:25 ` Rafael J. Wysocki @ 2006-07-10 22:45 ` Michael Tokarev 2006-07-10 22:49 ` Michael Tokarev 2006-07-15 17:33 ` Dmitry Torokhov 1 sibling, 2 replies; 7+ messages in thread From: Michael Tokarev @ 2006-07-10 22:45 UTC (permalink / raw) To: linux-kernel Catalin Marinas wrote: > From: Catalin Marinas <catalin.marinas@gmail.com> [] > - request_resource(&iomem_resource, res); > + if (request_resource(&iomem_resource, res)) { > + kfree(res); ... Just a small nitpick, or, rather, a question. Quite alot of functions return 0 on success, or !=0 on failure. There are other functions, which, say, return NULL on failure. Or when 0 is valid result, something <0 is returned.. etc. Without looking at the function description or code, it's impossible to say wich of the above it is. But. When reading that kind of code as the quoted patch adds, I for one always think it's somehow incorrect or backwards. When used like that, request_resource() seems like a boolean, and the whole thing becomes: if (do_something_successeful()) fail(); Ofcourse, later you understand that do_something() returns 0 on failure, and the code is correct. But the first impression (again, for me anyway) is that it's wrong. In such cases when a routine returns 0 on error, I usually write it this way: if (request_resource() != 0) fail() This way it becomes obvious what does it do, and compiler generates EXACTLY the same instructions. Yes it's redundrand, that "!= 0" tail. But it makes the whole stuff readable without a need to re-think what does it return, and, which is especially important, logically correct when reading. Alternatively, it can be named something like request_resource_failed() instead of just request_resource(). Compare: if (request_resource(..)) fail(); (current). And if (request_resource_failed()) fail(); The latter seems more logical... ;) But that "!= 0" tail achieves almost the same effect. Yet again, from my point of view anyway... ;) Thanks. /mjt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] 2006-07-10 22:45 ` functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] Michael Tokarev @ 2006-07-10 22:49 ` Michael Tokarev 2006-07-15 17:33 ` Dmitry Torokhov 1 sibling, 0 replies; 7+ messages in thread From: Michael Tokarev @ 2006-07-10 22:49 UTC (permalink / raw) To: linux-kernel Michael Tokarev wrote: [] > Ofcourse, later you understand that do_something() returns 0 > on failure, and the code is correct. But the first impression > (again, for me anyway) is that it's wrong. > > In such cases when a routine returns 0 on error, I usually write > it this way: .... s/error/success/g. Blah ;) > > if (request_resource() != 0) > fail() [..] /mjt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] 2006-07-10 22:45 ` functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] Michael Tokarev 2006-07-10 22:49 ` Michael Tokarev @ 2006-07-15 17:33 ` Dmitry Torokhov 1 sibling, 0 replies; 7+ messages in thread From: Dmitry Torokhov @ 2006-07-15 17:33 UTC (permalink / raw) To: Michael Tokarev; +Cc: linux-kernel On Monday 10 July 2006 18:45, Michael Tokarev wrote: > In such cases when a routine returns 0 on error, I usually write > it this way: > > if (request_resource() != 0) > fail() > Many write: error = do_something(); if (error) { ... } And then it really obvious. -- Dmitry ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2006-07-15 17:33 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-07-10 22:13 [PATCH] Fix a memory leak in the i386 setup code Catalin Marinas 2006-07-10 22:25 ` Rafael J. Wysocki 2006-07-11 7:47 ` Catalin Marinas 2006-07-11 8:26 ` Rafael J. Wysocki 2006-07-10 22:45 ` functions returning 0 on success [was: [PATCH] Fix a memory leak in the i386 setup code] Michael Tokarev 2006-07-10 22:49 ` Michael Tokarev 2006-07-15 17:33 ` Dmitry Torokhov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox