Date: Sat, 22 Jul 2000 19:01:40 +0100 From: Ben Smithurst <ben@FreeBSD.org> To: System Administrator <admin@chemcomp.com> Cc: Rahul Siddharthan <rsidd@physics.iisc.ernet.in>, freebsd-questions@FreeBSD.ORG Subject: Re: Tar bug??? Message-ID: <20000722190140.R64132@strontium.scientia.demon.co.uk> In-Reply-To: <3978C2AF.7A6362D4@chemcomp.com> References: <3978A6F6.55C3E578@chemcomp.com> <20000722021522.A8449@physics.iisc.ernet.in> <3978C2AF.7A6362D4@chemcomp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
System Administrator wrote:
> #3 0x8052292 in msg_perror (
> str=0x80825c0 "read error at byte %ld reading %d bytes in file %s")
> at port.c:1138
>
> vfprintf (stderr, str, args);
>
> But I can't just display the value of args and I really don't understand
> (and never did) the whole va_arg() working principles.
>
> (gdb) print args
> No symbol "args" in current context.
> (gdb)
That's because of optimizations -- if you compile without optimizations you
can print "args", though it's not very useful.
Something is going wrong though. With some debugging:
stderr=0x808c090 str=0x80862a0 (read error at byte %ld reading %d bytes in file %s)
arg[0]=0x0
arg[1]=0x0
arg[2]=0x200
arg[3]=0x80980d5
There's an extra argument with value 0x0 which isn't needed. Note that
arg[1] corresponds to the "byte %ld" value, arg[2] is the "reading %d
bytes" value (512, bufsiz), and arg[3] is the pointer to the filename.
These should all be shifted one forwards, so that arg[2] ends up as the
string pointer.
I'm not sure why that's happening though. :-(
When I add more debugging,
--- port.c 2000/07/12 00:59:32 1.7
+++ port.c 2000/07/22 17:57:44
@@ -1130,6 +1130,19 @@
{
va_list args;
int save_e;
+ int i;
+
+ if (str != NULL)
+ msg_perror(NULL, 1, 2, 3);
+
+ printf("stderr=%p str=%p (%s)\n", stderr, str, str);
+ va_start(args, str);
+ for (i = 0; i < 4; i++)
+ printf("arg[%d]=%p\n", i, va_arg(args, void *));
+ va_end(args);
+
+ if (str == NULL)
+ return;
save_e = errno;
fflush (msg_file);
I see this:
ben@platinum:~/tmp/tar$ MALLOC_OPTIONS=J ./tar -f /dev/null -A -v -C . /nfs/magnesium/usr
p=/nfs/magnesium/usr
stderr=0x808c0b0 str=0x0 ((null))
arg[0]=0x1
arg[1]=0x2
arg[2]=0x3
arg[3]=0x0
stderr=0x808c0b0 str=0x80862c0 (read error at byte %ld reading %d bytes in file %s)
arg[0]=0x0
arg[1]=0x0
arg[2]=0x200
arg[3]=0x80980d5
./tar: zsh: segmentation fault (core dumped) MALLOC_OPTIONS=J ./tar -f /dev/null -A -v -C . /nfs/magnesium/usr
so, when msg_perror(NULL, 1, 2, 3) is called the arguments are passed
correctly. Weird. Anyone else have any ideas?
> Something very strange is that it crashes only when accessing
> 'automounted' directories:
Not true, it crashes on any NFS directory for me. I suspect this is
because read() fails on directories on some filesystems, including NFS.
There's some other broken-ness in tar (well, it is GNU stuff):
ben@platinum:~/tmp/tar$ ./tar -f /dev/null -A -v -C .
p=
stderr=0x808c090 str=0x8086277 (can't open file %s)
arg[0]=0x80950b5
arg[1]=0xbfbff3dc
arg[2]=0x80481c9
arg[3]=0x7
./tar: can't open file : No such file or directory
ben@platinum:~/tmp/tar$ MALLOC_OPTIONS=J !!
MALLOC_OPTIONS=J ./tar -f /dev/null -A -v -C .
p=ÐÐÐÐÐÐÐÐÐÐÐ
stderr=0x808c090 str=0x8086277 (can't open file %s)
arg[0]=0x80950b5
arg[1]=0xbfbff3c8
arg[2]=0x80481c9
arg[3]=0x7
./tar: can't open file ÐÐÐÐÐÐÐÐÐÐÐ : No such file or directory
Whichever idiot wrote it assumed malloc returns zero filled memory.
--
Ben Smithurst / ben@FreeBSD.org / PGP: 0x99392F7D
FreeBSD Documentation Project /
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000722190140.R64132>
