Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20110613064845.GA22390@openwall.com>
Date: Mon, 13 Jun 2011 10:48:45 +0400
From: Solar Designer <solar@...nwall.com>
To: musl@...ts.openwall.com
Subject: Re: Weekly reports - B

On Mon, Jun 13, 2011 at 12:54:18AM -0400, Rich Felker wrote:
> On Mon, Jun 13, 2011 at 06:56:55AM +0400, Solar Designer wrote:
> > IIRC, some ancient versions of glibc didn't allow programs to assign to
> > errno at all, because it was declared as a macro (not a variable).  That
> 
> This sounds like an urban legend. errno is a macro and has been for a
> long time (ever since threads) on most systems. It's required by the
> standard to be an lvalue macro.

Oh, of course I did not recall correctly.  Here's what I think this was
about: old programs such as qmail (not maintained upstream since 1998)
used "extern int errno;" instead of including errno.h, and indeed this
failed when errno became a macro (for threads, as you correctly remind
me).  So this was an entirely different issue.

> > Is it guaranteed that errno is preserved across libc calls that complete
> > without error?  Maybe not.  I don't really know, and I'd prefer not to
> > depend on that.
> 
> Unless it's documented that a particular function can't, libc
> functions can clobber errno all they like, whether or not they return
> failure. The only thing they can't do is set it to 0, unless they put
> some other nonzero (hopefully meaningful) value in it before
> returning.

I went to:

http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html

and it does say "No function in this volume of IEEE Std 1003.1-2001
shall set errno to 0. The setting of errno after a successful call to a
function is unspecified unless the description of that function
specifies that errno shall not be modified."  Which not surprisingly
matches what you wrote above.

I was a bit puzzled why they decided to outlaw setting of errno to 0 by
library functions, although this does make some sense to me (easy to
achieve and preserves at least some recent error code for poorly written
old programs).

> This all makes using errno a little bit messy, but if libc functions
> were required not to change errno except when reporting an error,
> pretty much every libc function that uses other libc functions would
> be full of useless bloat and slowdowns saving and restoring errno
> values...

Good point.  I guess they'd resort to calling other than exported
versions of the functions, though.  But this could mean extra function
call overhead for the exported versions...

Alexander

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.