mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Amit Choudhary <amit2030@yahoo.com>
To: Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] include/linux/slab.h: new KFREE() macro.
Date: Sun, 7 Jan 2007 00:46:50 -0800 (PST)	[thread overview]
Message-ID: <585769.17683.qm@web55613.mail.re4.yahoo.com> (raw)

>>On 1/1/07, Amit Choudhary <amit2030@xxxxxxxxx> wrote:

>>    +#define KFREE(x) \
>>    + do { \
>>    + kfree(x); \
>>    + x = NULL; \
>>    + } while(0)


>>NAK until you have actual callers for it. CONFIG_SLAB_DEBUG already
>>catches use after free and double-free so I don't see the point of
>>this.

Well, I am not proposing this as a debugging aid. The idea is about correct programming, atleast
from my view. Ideally, if you kfree(x), then you should set x to NULL. So, either programmers do
it themselves or a ready made macro do it for them.

In my opinion, the programmers may welcome the macro that does it for them.

There is another good part about it that results in better programming and shorter code.

Consider an array x[10]. I allocate memory for all of them and then kfree them - kfree(x[0]),
kfree(x[1]), etc. But I do not set these elements to NULL. So,

x[0] = _location_0_already_freed
x[1] = _location_1_already_freed

... and so on...

Now, consider that when I try to allocate memory again, memory allocation fails at x[2]. So, we
have now,

x[0] = _valid_location_0
x[1] = _valid_location_1
x[2] = NULL
x[3] = _location_3_already_freed

So, now to avoid error path leak I have to free all the allocated memory. For this I have to
remember where the allocation failed because I cannot do kfree(x[3]) because it will crash.

You can easily visualize that how KFREE would have helped. Since, I have already KFREE'D them
earlier, x[3] is guaranteed to be NULL and I can free the entire array 'x' wihtout worrying.

So, the code becomes simpler.

Now, consider that there are two more arrays like 'x' being used in the same function. So, now we
have 'x', 'y', 'z' all allocating memory in the same function. Memory allocation can fail at
anytime. So, not only do I have to remember the element location where the allocation failed but
also the array that contains that element.

So, to avoid error path leak, we will have something like this (assume same number of elements in
all arrays):

case z_nomem:
              free_from_0_to_i
              free_all_'y'
              free_all_'x'
              return;

case y_nomem:
              free_from_0_to_i
              free_all_'x'
              return;

case x_nomem:
              free_from_0_to_i
              return;

However, if the programmer would have used KFREE, then the error path leak code have been shorter
and easier.

case nomem:
              free_all_'z'
              free_all_'y'
              free_all_'x'
              return;

I hope that I have made my point but please let me know if I have missed out something or made
some assumption that is not correct.

Regards,
Amit


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

             reply	other threads:[~2007-01-07  8:46 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-07  8:46 Amit Choudhary [this message]
2007-01-07 10:24 ` Christoph Hellwig
2007-01-07 22:43   ` Amit Choudhary
2007-01-07 23:22     ` Vadim Lobanov
2007-01-08  0:02       ` Amit Choudhary
2007-01-08  2:35         ` Vadim Lobanov
2007-01-08  4:09           ` Amit Choudhary
2007-01-08  7:04             ` Vadim Lobanov
2007-01-08  7:29               ` Amit Choudhary
2007-01-08  8:15                 ` Vadim Lobanov
2007-01-08  8:47                   ` Amit Choudhary
2007-01-08  9:09                     ` Al Viro
2007-01-08  7:49     ` Hua Zhong
2007-01-08  8:00       ` Pekka Enberg
2007-01-08  8:31         ` Amit Choudhary
2007-01-08  8:37           ` Al Viro
2007-01-08  8:39           ` Sumit Narayan
2007-01-08  8:44             ` Robert P. J. Day
2007-01-08  8:56             ` Amit Choudhary
2007-01-08  8:45           ` Pekka Enberg
2007-01-08  9:06             ` Amit Choudhary
2007-01-08  9:26               ` Pekka Enberg
2007-01-08 22:43               ` Valdis.Kletnieks
2007-01-09 19:02                 ` Amit Choudhary
2007-01-09 19:19                   ` Randy Dunlap
2007-01-10  4:57                     ` Amit Choudhary
2007-01-09 22:57                   ` Valdis.Kletnieks
2007-01-10  0:00                     ` Amit Choudhary
2007-01-10  2:43                       ` Valdis.Kletnieks
2007-01-08 11:10           ` Jesper Juhl
2007-01-08  8:05       ` Amit Choudhary
2007-01-08  8:12         ` Al Viro
2007-01-08  8:57         ` Hua Zhong
  -- strict thread matches above, loose matches on Subject: below --
2007-07-23 17:55 Amit Choudhary
     [not found] <7ADs5-25a-11@gated-at.bofh.it>
     [not found] ` <7AP02-3l3-13@gated-at.bofh.it>
2007-01-08 18:29   ` Bodo Eggert
2007-01-01  0:17 Amit Choudhary
2007-01-01  3:01 ` Segher Boessenkool
2007-01-01 21:23 ` Pekka Enberg
2007-01-02  9:21   ` Christoph Hellwig

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=585769.17683.qm@web55613.mail.re4.yahoo.com \
    --to=amit2030@yahoo.com \
    --cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®