public inbox for util-linux@vger.kernel.org
 help / color / mirror / Atom feed
From: Karel Zak <kzak@redhat.com>
To: Sami Kerola <kerolasa@iki.fi>
Cc: util-linux@vger.kernel.org
Subject: Re: [PATCH 01/12] include/xalloc: ensure arithmetics overflow cannot happen
Date: Mon, 28 Apr 2014 08:52:43 +0200	[thread overview]
Message-ID: <20140428065243.GJ2405@x2.net.home> (raw)
In-Reply-To: <1398629138-31718-2-git-send-email-kerolasa@iki.fi>

On Sun, Apr 27, 2014 at 09:05:27PM +0100, Sami Kerola wrote:
> The xrealloc() changes has the greatest change.  It splits the size and
> multiplier arguments so that arithmetics overflow can be detected.  This
> change is propagated to use of the function in other files.

 I don't like it at all. The function realloc() has well know semantic
 and arguments. We don't want to create parallel universe...
 
 If you want something else "nmemb, size"  then introduce xrecalloc()
 or so.. but don't use "realloc" name at all.

> Additionally this change checks that size inputs for allocations are
> never zero.  It is uncertain if in these cases abort() should be called
> to get a core.

 I don't think we need a different semantic than C standards.

>  void *xmalloc(const size_t size)
>  {
> -        void *ret = malloc(size);
> +	void *ret;
>  
> -        if (!ret && size)
> -                err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
> -        return ret;
> +	if (size == 0)
> +		err(XALLOC_EXIT_CODE, "xmalloc: zero size");

 man malloc, zero size is just correct

> +	ret = malloc(size);
> +	if (!ret)
> +		err(XALLOC_EXIT_CODE, "xmalloc: cannot allocate %zu bytes", size);
> +	return ret;
>  }

 I don't think we need "xmalloc:" prefix to the error message.

>  static inline __ul_alloc_size(2)
> -void *xrealloc(void *ptr, const size_t size)
> +void *xrealloc(void *ptr, const size_t nmemb, const size_t size)
>  {
> -        void *ret = realloc(ptr, size);
> -
> -        if (!ret && size)
> -                err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
> -        return ret;
> +	void *ret;
> +	size_t new_size = nmemb * size;
> +
> +	if (new_size == 0)
> +		err(XALLOC_EXIT_CODE, "xrealloc: zero size");

 man realloc, zero size is correct

> +	if (SIZE_MAX / nmemb < size)
> +		err(XALLOC_EXIT_CODE, "xrealloc: nmemb * size > SIZE_MAX");
> +	if (ptr == NULL)
> +		ret = malloc(new_size);
> +	else
> +		ret = realloc(ptr, new_size);
> +	if (!ret)
> +		err(XALLOC_EXIT_CODE, "xrealloc: cannot allocate %zu bytes", size);
> +	return ret;
>  }
>  
>  static inline __ul_calloc_size(1, 2)
>  void *xcalloc(const size_t nelems, const size_t size)
>  {
> -        void *ret = calloc(nelems, size);
> -
> -        if (!ret && size && nelems)
> -                err(XALLOC_EXIT_CODE, "cannot allocate %zu bytes", size);
> -        return ret;
> +	void *ret;
> +
> +	if (nelems == 0 || size == 0)
> +		err(XALLOC_EXIT_CODE, "xcalloc: zero size");

 zero size is correct

> +	if (SIZE_MAX / nelems < size)
> +		err(XALLOC_EXIT_CODE, "xcalloc: nmemb * size > SIZE_MAX");
> +	ret = calloc(nelems, size);
> +	if (!ret)
> +		err(XALLOC_EXIT_CODE, "xcalloc: cannot allocate %zu bytes", nelems * size);
> +	return ret;
>  }
>  
>  static inline char __attribute__((warn_unused_result)) *xstrdup(const char *str)
>  {
> -        char *ret;
> -
> -        if (!str)
> -                return NULL;
> -
> -        ret = strdup(str);
> +	size_t len;
> +	char *ret;
>  
> -        if (!ret)
> -                err(XALLOC_EXIT_CODE, "cannot duplicate string");
> -        return ret;
> +	if (!str)
> +		return NULL;
> +	len = strlen(str) + 1;
> +	ret = xmalloc(len);
> +	memcpy(ret, str, len);
> +	return ret;
>  }

 Seem like premature optimization, it would be better to use libc
 rather than maintain private implementation.

    Karel


-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com

  parent reply	other threads:[~2014-04-28  6:52 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-27 20:05 [PATCH 00/12] pull: mostly swap command clarifications Sami Kerola
2014-04-27 20:05 ` [PATCH 01/12] include/xalloc: ensure arithmetics overflow cannot happen Sami Kerola
2014-04-27 20:45   ` Bernhard Voelker
2014-04-28  6:52   ` Karel Zak [this message]
2014-04-28  8:42     ` Sami Kerola
2014-04-27 20:05 ` [PATCH 02/12] dmesg: move get_boot_time() to lib/timeutils Sami Kerola
2014-05-06 10:00   ` Ruediger Meier
2014-05-06 11:20     ` Karel Zak
2014-05-06 13:42       ` Ruediger Meier
2014-05-06 14:40         ` Karel Zak
2014-05-06 16:03           ` Ruediger Meier
2014-05-07  9:52             ` Karel Zak
2014-05-07 14:04               ` Ruediger Meier
2014-04-27 20:05 ` [PATCH 03/12] last: fix is_phantom() detection Sami Kerola
2014-04-27 20:05 ` [PATCH 04/12] include/c.h: add macro to print definitions as string Sami Kerola
2014-04-27 20:05 ` [PATCH 05/12] mkswap, swaplabel: move version number to header Sami Kerola
2014-04-27 20:05 ` [PATCH 06/12] mkswap: remove legacy swap structure Sami Kerola
2014-04-27 20:05 ` [PATCH 07/12] include/swapheader.h: ensure type sizes Sami Kerola
2014-04-27 20:05 ` [PATCH 08/12] swapon: swaps with legacy version label are not supported Sami Kerola
2014-04-28  8:37   ` Benno Schulenberg
2014-04-28  8:44     ` Sami Kerola
2014-04-28  9:00       ` Karel Zak
2014-04-27 20:05 ` [PATCH 09/12] swapon, swapheader, mkswap: move swap signature to header Sami Kerola
2014-04-27 20:05 ` [PATCH 10/12] libsmartcols: remove ununsed assignment Sami Kerola
2014-04-28  9:02   ` Karel Zak
2014-04-27 20:05 ` [PATCH 11/12] lib/timeutils: fix memory leak Sami Kerola
2014-04-27 20:05 ` [PATCH 12/12] lib/pager: use names when referring to standard file descriptors Sami Kerola
2014-04-29 21:05 ` [PATCH 00/12] pull: mostly swap command clarifications Sami Kerola
2014-04-29 21:46   ` Bernhard Voelker
2014-05-06  8:36 ` Karel Zak

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=20140428065243.GJ2405@x2.net.home \
    --to=kzak@redhat.com \
    --cc=kerolasa@iki.fi \
    --cc=util-linux@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