Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jan 2003 10:53:03 -0700
From:      John Reynolds~ <jreynold@sedona.ch.intel.com>
To:        questions@freebsd.org
Subject:   is our printf(1) behavior correct w.r.t \0 escapes?
Message-ID:  <15926.50047.494451.473350@chlx255.ch.intel.com>

next in thread | raw e-mail | index | archive | help
Hi all, a friend of mine is working on a script which we want to be portable
between Linux and FreeBSD (it utilizes several external programs to do its
work). The last thing we've tripped on seems like a show-stopper.

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

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

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

-Jr

-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|John Reynolds       Sr. Component Design Engineer - ICG/EID/Si Engineering |
|Intel Corporation   MS: CH6-302   Phone: 480-554-9092   pgr: 602-868-6512  |
|jreynold@sedona.ch.intel.com  http://www-aec.ch.intel.com/~jreynold/       |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

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?15926.50047.494451.473350>