[Toybox] [PATCH] Clean up xz a good amount
enh
enh at google.com
Wed Feb 28 09:13:39 PST 2024
On Tue, Feb 27, 2024 at 8:34 PM Rob Landley <rob at landley.net> wrote:
>
> On 2/27/24 21:27, Oliver Webb wrote:
> > 2 are help text, do_xzcat was due to replacing the case statement for error handling with a array
> > If I had to guess, xz_dec_run or xz_dec_bcj_reset
> >
> > It was the case statement I stripped out in xz_dec_bcj_reset, it works with the attached patch
>
> Let's see..
>
> > diff --git a/toys/pending/xzcat.c b/toys/pending/xzcat.c
> > index 5177f243..b50c9524 100644
> > --- a/toys/pending/xzcat.c
> > +++ b/toys/pending/xzcat.c
> > @@ -55,6 +55,7 @@ enum xz_ret {
> > // truncated or otherwise corrupt.
> > };
> >
> > +
> > // Passing input and output buffers to XZ code
> > // Only the contents of the output buffer from out[out_pos] onward, and
> > // the variables in_pos and out_pos are modified by the XZ code.
>
> Whitespace change.
>
> > @@ -212,7 +213,7 @@ struct xz_dec_bcj {
> > // in an x86 instruction.
> > static int bcj_x86_test_msbyte(char b)
> > {
> > - return !b || !~b;
> > + return !b || b == 0xFF;
> > }
>
> NOP.
>
> > static size_t bcj_x86(struct xz_dec_bcj *s, char *buf, size_t size)
> > @@ -639,6 +640,20 @@ enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s, struct xz_dec_lzma2 *lzma2,
> > */
> > enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, char id)
> > {
> > + switch (id) {
> > + case BCJ_X86:
> > + case BCJ_POWERPC:
> > + case BCJ_IA64:
> > + case BCJ_ARM:
> > + case BCJ_ARMTHUMB:
> > + case BCJ_SPARC:
> > + break;
> > +
> > + default:
> > + /* Unsupported Filter ID */
> > + return XZ_OPTIONS_ERROR;
> > + }
> > +
> > s->type = id;
> > s->ret = XZ_OK;
> > s->pos = 0;
ah, crap, that's another thing to put on the riscv64 to-do list...
(thanks for bringing that to light!)
> NOP unless you hit the error path, what are the values...
>
> enum {
> BCJ_X86 = 4, /* x86 or x86-64 */
> BCJ_POWERPC = 5, /* Big endian only */
> BCJ_IA64 = 6, /* Big or little endian */
> BCJ_ARM = 7, /* Little endian only */
> BCJ_ARMTHUMB = 8, /* Little endian only */
> BCJ_SPARC = 9 /* Big or little endian */
> } type;
>
> Since id is char, which is unsigned in toybox, this is:
>
> if ((id-4)>5) return XZ_OPTIONS_ERROR;
>
> > @@ -2860,16 +2875,17 @@ void do_xzcat(int fd, char *name)
> > if (ret == XZ_OK || ret == XZ_UNSUPPORTED_CHECK)
> > continue;
> >
> > - else if (ret == XZ_STREAM_END) {
> > - xz_dec_end(s);
> > - return;
> > - }
> > -
> > if (fwrite(out, 1, b.out_pos, stdout) != b.out_pos) {
> > msg = "Write error\n";
> > goto error;
> > }
> >
> > + if (ret == XZ_STREAM_END) {
> > + xz_dec_end(s);
> > + return;
> > + }
> > +
> > +
> > msg = (ret-3 < ARRAY_LEN(errors)) ? errors[ret-3] : "Bug!";
> > goto error;
> > }
>
> There's the bug, moving a return before the fwrite().
>
> Rob
> _______________________________________________
> Toybox mailing list
> Toybox at lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net
More information about the Toybox
mailing list