Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jun 1998 17:36:44 +0000 (GMT)
From:      Terry Lambert <tlambert@primenet.com>
To:        peter@netplex.com.au (Peter Wemm)
Cc:        tlambert@primenet.com, joelh@gnu.org, fenner@parc.xerox.com, current@FreeBSD.ORG
Subject:   Re: Bogus errno twiddling by lstat...
Message-ID:  <199806221736.KAA11829@usr06.primenet.com>
In-Reply-To: <199806210727.PAA27276@spinner.netplex.com.au> from "Peter Wemm" at Jun 21, 98 03:27:17 pm

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> Terry Lambert wrote:
> > > If, however, you don't like our malloc's current implementation, and
> > > think that errno should be saved and restored across a successful
> > > call, and that the lost cycles would be worthwhile, then diffs would
> > > be perfectly welcome, I'm sure.
> > 
> > Since the malloc.conf file is unnecessarily being looked for in the
> > printf case (since ld.so already caused it to be looked for, and didn't
> > find it), I think the redundant call to llok for it is certainly worth
> > removing.
> 
> What redundant call??!?
> 
> pwroot@spinner[2:59pm]/tmp-115# cat xx.c
> #include <stdio.h>
> #include <string.h>
> #include <sys/stat.h>
> #include <errno.h>
> 
> main()
> {
>         struct stat sb;
>         int saveerrno, saveerrno2;
>         int ret;
>         char *e;
> 
>         write(1, "1\n", 2);
>         errno = 0;
>         ret = lstat("foo", &sb);
>         saveerrno = errno;
> 
>         write(1, "2\n", 2);
>         e = strerror(saveerrno);
>         saveerrno2 = errno;
> 
>         write(1, "3\n", 2);
>         printf("lstat returned %d, errno = %d = %s\n", ret, saveerrno, e);
> 
>         write(1, "4\n", 2);
>         printf("errno is now: %d, saveerrno2 = %d\n", errno, saveerrno2);
>         write(1, "5\n", 2);
> }
> pwroot@spinner[2:59pm]/tmp-116# cc -o xx xx.c
> pwroot@spinner[2:59pm]/tmp-117# ktrace ./xx
> 1
> 2

> Also, since this is freebsd-current, so I assume you're talking about 
> -current.

No.  I am talking about 2.2.6.  The __error weak symbol work was done
in support of 2.2.6 -> current migration and interoperability.

This just happened to come up in the context of something that won't
ever be changed in 2.2.6, namely non-encapsulated errno twiddling.

> So, first you blame lstat()

I should have blamed readlink().  Big deal.

> with a badly flawed test program as "evidence".

For what definition of badly flawed?  What about my atoi() example?
If atoi was allowed to fiddle errno under the covers, then conversion
errors would be undetectable.

Please don't quote the C standard to me; quote instead 10.13 of the
Single UNIX Specification.  I'm not interested in the language idiocy
in support of existing Microsoft Compilers (such as prototypes in scope
to support the x86 specific "far" attribute, when by rights, the linker
should throw improper argument usage errors, and the existance of
segmentation should be made transparent to the programmer by the compiler
writer).

If you *insist* on quoting old standards:

	The value of errno is 0 at program startup, but is never set
	to 0 by any XSI function.

This is *far* differrent than stating that the value is indeterminate
in the success case, which is what people are claiming.


> When challenged on it, you say "I knew that" and then claim that ld.so is
> calling malloc. At the same time you claim that this is therefore violating
> some ansi requirement for functions to not change errno, which somebody
> else has pointed out that the specs say the opposite.  When confronted with
> that, you then come up with malloc not caching it's readlink() of
> malloc.conf, which is clearly false and verifiable.
> 
> What next?

% cat fum.c
#include <stdio.h>
#include "errno.h"

main()
{
        int     k;

        for(k=0; k < 10; k++)
                printf( "default errno is %d\n", errno);
}
% cc -o fum fum.c -lc_r
% ktrace fum
% kdump
 22622 ktrace   RET   ktrace 0
 22622 ktrace   CALL  readlink(0x806b652,0xefbfd38c,0x3f)
 22622 ktrace   NAMI  "/etc/malloc.conf"
****************************************
 22622 ktrace   RET   readlink -1 errno 2 No such file or directory
 22622 ktrace   CALL  mmap(0,0x1000,0x3,0x1002,0xffffffff,0,0,0)
 22622 ktrace   RET   mmap 134328320/0x801b000
 22622 ktrace   CALL  break(0x5000)
 22622 ktrace   RET   break 0
 22622 ktrace   CALL  break(0x6000)
 22622 ktrace   RET   break 0
...
 22622 ktrace   NAMI  "/usr/X11R6/bin/fum"
 22622 ktrace   RET   execve -1 errno 2 No such file or directory
 22622 ktrace   CALL  execve(0xefbfd438,0xefbfd8f8,0xefbfd900)
 22622 ktrace   NAMI  "./fum"
 22622 fum      RET   execve 0
 22622 fum      CALL  open(0x109c,0,0)
 22622 fum      NAMI  "/usr/libexec/ld.so"
 22622 fum      RET   open 3
 22622 fum      CALL  read(0x3,0xefbfd8a0,0x20)
 22622 fum      GIO   fd 3 read 32 bytes
       "\M-L\0\M^F\M-@\0\M-`\0\0\0 \0\0$\0\0\0\0\0\0\0 \0\0\0\0\0\0\0\0\0\0\0"
 22622 fum      RET   read 32/0x20
...
 22622 fum      RET   sigprocmask 0
 22622 fum      CALL  sigprocmask(0x3,0)
 22622 fum      RET   sigprocmask -65793/0xfffefeff
 22622 fum      CALL  readlink(0x8072782,0xefbfd730,0x3f)
 22622 fum      NAMI  "/etc/malloc.conf"
****************************************
 22622 fum      RET   readlink -1 errno 2 No such file or directory
 22622 fum      CALL  mmap(0,0x1000,0x3,0x1002,0xffffffff,0,0,0)
 22622 fum      RET   mmap 134324224/0x801a000


> malloc() has been adjusted to preserve errno across the readlink(), so I 
> suggest you leave it at that rather than digging youself an even deeper 
> hole. :-)

Thank you for making the change; however, you can clearly see that
the /etc/malloc.conf file is beaing readlink'ed twice.


					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806221736.KAA11829>