mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: LUA + musl, garbage collection issue?
Date: Sun, 21 Sep 2014 00:38:31 -0400	[thread overview]
Message-ID: <20140921043831.GF23797@brightrain.aerifal.cx> (raw)
In-Reply-To: <BLU437-SMTP1619EF295C4A1463E8B5A1C0B20@phx.gbl>

On Sat, Sep 20, 2014 at 04:41:14PM -1000, Scott Valentine wrote:
> I noticed that in order to free memory, it basically calls realloc
> with 0 as the new size. Is this something musl doesn't handle well?
> 
> I'm trying a rebuild with a check for n == 0 in musl's realloc
> function to just free the pointer, and I'll report back.
> 
> What is "the right thing to do" to fix this? Should lua not be using
> realloc to free memory, or should musl handle the case better, if,
> in fact this is the problem?

This is a bug in lua; it's depending on a bug in glibc. POSIX attempts
to allow the glibc behavior (see the text here:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html)
but this allowance is invalid since it conflicts with the requirements
of ISO C (and, as you can see in the above link, "The functionality
described on this reference page is aligned with the ISO C standard.
Any conflict between the requirements described here and the ISO C
standard is unintentional. This volume of POSIX.1-2008 defers to the
ISO C standard.") The relevant ISO C requirement is:

"The realloc function returns a pointer to the new object (which may
have the same value as a pointer to the old object), or a null pointer
if the new object could not be allocated."

In particular, the only way realloc is permitted to return 0 is if the
operation failed, in which case the old pointer is still valid (not
freed).

But even if the glibc behavior weren't conflicting with the C
standard, it's still not valid for an application to assume it, and
it's still undesirable behavior (because it's inconsistent with
glibc's malloc, which returns a non-null, unique pointer for each
malloc(0), and because it makes it impossible for applications to
reliably determine whether the operation succeeded or failed).

The whole situation is a big enough mess that I feel I can safely say
that any application that ever passes 0 as the size argument to
realloc has potentially-serious bugs. So if lua wants to free memory,
it just needs to call free.

Rich


  reply	other threads:[~2014-09-21  4:38 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-21  2:41 Scott Valentine
2014-09-21  4:38 ` Rich Felker [this message]
2014-09-21  9:58   ` Scott Valentine
2014-09-21 10:16   ` Justin Cormack
2014-09-24  5:25     ` Scott Valentine
2014-09-24  5:50       ` Szabolcs Nagy
2014-09-24  6:14         ` Scott Valentine

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=20140921043831.GF23797@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

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).