od(1): Fix skip value handling

POSIX defines -j as the number of bytes that od(1) should skip over the
concatenated input files. The existing code tries to implement this behavior
by checking if the current address was smaller than the skip value. However,
this is not correct, because we adjust both the skip value and the address
at the same time when we do fseeko (when file is seekable) or getchar (when
file is not seekable).

This commit fixes the problem by expecting the skip value to be zero upon
return of next(). If the condition is not satisfied, a diagnostic message
will be issued.

Reported-by:	Mohamed Akram <mohd.akram@outlook.com>
Reviewed-by:	emaste
PR:		271832
MFC-after:	2 weeks
Differential Revision: https://reviews.freebsd.org/D40446
This commit is contained in:
Xin LI 2023-06-07 18:06:07 -07:00
parent 653738e895
commit 1232c7884d

View file

@ -263,7 +263,7 @@ get(void)
* block and set the end flag.
*/
if (!length || (ateof && !next((char **)NULL))) {
if (odmode && address < skip)
if (odmode && skip > 0)
errx(1, "cannot skip past end of input");
if (need == blocksize)
return((u_char *)NULL);