Justus Winter, le Mon 16 Jun 2014 19:49:28 +0200, a écrit :
> If the size argument is 0, realloc may either return NULL, or return a
> pointer that is only valid for use with free(3). In either case, the
> memory is freed. So if realloc would return NULL (it does not on
> GNU), the current code would double free p.
>
> Found using the Clang Static Analyzer.
>
> * libports/bucket-iterate.c (_ports_bucket_class_iterate): Avoid
> calling realloc if no ports were matched.
Ack.
> ---
> libports/bucket-iterate.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libports/bucket-iterate.c b/libports/bucket-iterate.c
> index babc204..2d1b00d 100644
> --- a/libports/bucket-iterate.c
> +++ b/libports/bucket-iterate.c
> @@ -65,7 +65,7 @@ _ports_bucket_class_iterate (struct port_bucket *bucket,
> }
> pthread_mutex_unlock (&_ports_lock);
>
> - if (n != nr_items)
> + if (n != 0 && n != nr_items)
> {
> /* We allocated too much. Release unused memory. */
> void **new = realloc (p, n * sizeof *p);
> --
> 2.0.0
>
--
Samuel
As usual, this being a 1.3.x release, I haven't even compiled this
kernel yet. So if it works, you should be doubly impressed.
(Linus Torvalds, announcing kernel 1.3.3 on the linux-kernel mailing list.)