[Toybox] two bugs in od

Isaac ibid.ag at gmail.com
Sun Sep 15 16:00:21 PDT 2013


On Sun, Sep 15, 2013 at 05:23:09AM -0400, hhm wrote:
> Found 2 bugs in `od`, not very familiar with the code so just reporting them:
> 
> 
> 1. -t <integer-type>0 does not work correctly (loops infinitely while
> printing 0)

That's supposed to work at all?
$ od -t x0 </bin/true
od: invalid type string `x0';
this system doesn't provide a 0-byte integral type

Although it probably makes sense to disallow it rather than hoping 
that some user won't break things...

> 2. -J does not seem to have an effect (although it looks like there is
> some code which does reference/use it)
I presume you mean '[-j #]' ?
That appears to not have an effect; it should skip '#' bytes.
And it's not documented in the help message...
Hmm...
  if (TT.jump_bytes < TT.pos) {
    off_t off = lskip(fd, TT.jump_bytes);
    if (off > 0) TT.pos += off;
    if (TT.jump_bytes < TT.pos) return;
  }

Let's see what happens with -j 16, one small (8 byte) file:
if (TT.jump_bytes < TT.pos)
becomes
if (16 < 0)

Should be if (TT.jump_bytes > TT.pos).

If we got past that, off becomes the filesize, so TT.pos is 8.
if (TT.jump_bytes < TT.pos) return;
becomes
if (16 < 8) return;
That is wrong. We should be returning if (16 > 8).

Of course, TT.pos appears to need reinitializing to 0 before this...

But the obvious patch doesn't work.
(inserts fprintf)
And it appears that off is 0. So lskip is returning 0:

  if (and != -1 && offset >= lseek(fd, offset, SEEK_END)
    && offset+and == lseek(fd, offset+and, SEEK_SET)) return 0;
And the other path returns 0:
while (offset) {
//read loop, which decrements offset by bytes read
}
return offset;

I'm not sure how to fix this mess.  Should lskip return bytes left to fill 
the request (0 if success), or bytes advanced?


HTH,
Isaac Dunham

 1379286021.0


More information about the Toybox mailing list