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