Date: Mon, 23 Aug 2004 02:34:14 +0300 From: Giorgos Keramidas <keramida@linux.gr> To: Sean McNeil <sean@mcneil.com> Cc: freebsd-current@freebsd.org Subject: Re: bsdtar core dumps Message-ID: <20040822233414.GA79931@gothmog.gr> In-Reply-To: <1093213755.72863.0.camel@server.mcneil.com> References: <1092777586.92327.9.camel@server.mcneil.com> <20040817213813.GE3827@gothmog.gr> <1092951447.1167.12.camel@server.mcneil.com> <4127841D.6050104@freebsd.org> <1093213755.72863.0.camel@server.mcneil.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2004-08-22 15:29, Sean McNeil <sean@mcneil.com> wrote: > On Sat, 2004-08-21 at 10:19, Tim Kientzle wrote: > > The code you've pointed to above concerns me because of the part about: > > if (n == 0) { > > ... > > n = 1; > > } > > > > That ain't right: If I told vsnprintf the buffer size was zero, it > > should treat it as such. If I meant "one", I would have said "one." > > > > On the other hand, the vsnprintf.3 man page does explicitly state > > that "the output is always null-terminated," which would preclude > > passing a zero-length buffer, which is exactly what libarchive is > > doing in this situation. It is bogus, but at least it's documented > > bogosity. ;-) The vsnprintf() function cannot pass a zero-length buffer to __vfprintf() because the __vfprintf() function is expected return the number of bytes it would need to do the real printing. It's not illegal to pass a zero-length bugger to vsnprintf(); at least it's not specifically prohibited by the manpage. The following program *DOES* pass zero as the length of the buffer to vsnprintf() and a NULL pointer as the buffer address but doesn't fault on an i386 machine: 1 #include <stdarg.h> 2 #include <stdio.h> 3 4 size_t koko(const char *_fmt, ...); 5 6 int 7 main(void) 8 { 9 size_t foo; 10 11 foo = koko("%ld", 5); 12 printf("rc = %lu\n", (unsigned long)foo); 13 return 0; 14 } 15 16 size_t 17 koko(const char *fmt, ...) 18 { 19 size_t rc; 20 va_list ap; 21 22 va_start(ap, fmt); 23 rc = vsnprintf(NULL, 0, fmt, ap); 24 va_end(ap); 25 return rc; 26 }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040822233414.GA79931>