Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jan 2003 12:40:23 -0600 (CST)
From:      Conrad Sabatier <conrads@cox.net>
To:        John Reynolds~ <jreynold@sedona.ch.intel.com>
Cc:        questions@FreeBSD.ORG
Subject:   Re: is our printf(1) behavior correct w.r.t \0 escapes?
Message-ID:  <XFMail.20030128124023.conrads@cox.net>
In-Reply-To: <15926.50047.494451.473350@chlx255.ch.intel.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On 28-Jan-2003 John Reynolds~ wrote:
> 
> We need to echo a string *and* a NUL character (\0) into a stream so that a
> program that delimits its input by \0 characters will do the right thing.
> 
> He had been doing this via printf(1) like so:
> 
>   % printf "some string\0" | some_process
> 
> however, it never worked under FreeBSD. Upon further inspection, our
> printf(1) does not work like the GNU one with the above string. Consider
> this from a linux box:
> 
>   linux [~]<374>% printf "foo\0bar\0" | od -c
>   0000000   f   o   o  \0   b   a   r  \0
>   0000010
> 
> Now the same command from a FreeBSD (4.7-STABLE) box:
> 
>   freebsd [~]<76>% printf "foo\0bar\0" | od -c
>   0000000    f   o   o                                                    
>   0000003

Works fine under -current:

$ printf "foo\0bar\0" | od -c
0000000    f   o   o  \0   b   a   r  \0

> After checking the man pages, I also used a complete octal constant but that
> doesn't work either:
> 
>   linux [~]<376>% printf "foo\0000" | od -c
>   0000000   f   o   o  \0
>   0000004
> 
>   freebsd [~]<77>% printf "foo\0000" | od -c
>   0000000    f   o   o                                                    
>   0000003

This also works under -current:

$ printf "foo\0000" | od -c
0000000    f   o   o  \0                                                
0000004

> I checked our implementation and it seems wrong. The first step done in the
> source code is to interpolate all escape sequences. However, when it does
> this and the octal number happens to be "0", this fact is not "captured"
> later on and that 0 becomes the NULL terminator for the string and nothing
> else is printed after it.
> 
>   linux [~]<379>% printf "foo\0%d" 4 | od -c
>   0000000   f   o   o  \0   4
>   0000005
>   
>   freebsd [~]<78>% printf "foo\0%d" 4 | od -c
>   printf: missing format character
>   0000000    f   o   o                                                    
>   0000003

This also works under -current:

$ printf "foo\0%d" 4 | od -c
0000000    f   o   o  \0   4                                            
0000005

> This behavior has been checked on HP-UX and Solaris and those two systems are
> identical to the Linux one. It seems to me that our printf(1)'s behavior is
> incorrect. Comments?

It may very well be that printf (or libc?) has a bug under -stable.  Are you
using any unusual optimization settings in /etc/make.conf, by the way?  When
did you last upgrade?
 
-- 
Conrad Sabatier <conrads@cox.net> - "In Unix veritas"


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?XFMail.20030128124023.conrads>