Re: [PATCH] libarchive: add a function to unpack embedded data
Sam Liddicott wrote: >Will that support an embedded .profile there as well? It doesn't currently. I looked into it briefly and it should be possible. Ron ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH] libarchive: add a function to unpack embedded data
Will that support an embedded .profile there as well? Sam On Fri, 2 Nov 2018 at 13:19, Denys Vlasenko wrote: > Applied, thanks! > On Fri, Nov 2, 2018 at 9:34 AM Ron Yorston wrote: > > > > Similar code to unpack embedded data is used to decompress usage > > messages, embedded scripts and the config file (in the non-default > > bbconfig applet). > > > > Moving this code to a common function reduces the size of the default > > build and hides more of the internals of libarchive. > > > > function old new delta > > unpack_bz2_data- 135+135 > > bb_show_usage137 157 +20 > > get_script_content32 47 +15 > > unpack_scripts 119 --119 > > unpack_usage_messages124 --124 > > > -- > > (add/remove: 1/2 grow/shrink: 2/0 up/down: 170/-243) Total: -73 > bytes > > > > Signed-off-by: Ron Yorston > > --- > > archival/libarchive/decompress_bunzip2.c | 38 +-- > > include/bb_archive.h | 7 +- > > libbb/appletlib.c| 81 +--- > > miscutils/bbconfig.c | 27 ++-- > > 4 files changed, 54 insertions(+), 99 deletions(-) > > > > diff --git a/archival/libarchive/decompress_bunzip2.c > b/archival/libarchive/decompress_bunzip2.c > > index 7ef4e035f..3deb213a8 100644 > > --- a/archival/libarchive/decompress_bunzip2.c > > +++ b/archival/libarchive/decompress_bunzip2.c > > @@ -107,7 +107,7 @@ struct bunzip_data { > > uint8_t selectors[32768]; /* nSelectors=15 bits */ > > struct group_data groups[MAX_GROUPS]; /* Huffman coding tables > */ > > }; > > -/* typedef struct bunzip_data bunzip_data; -- done in .h file */ > > +typedef struct bunzip_data bunzip_data; > > > > > > /* Return the next nnn bits of input. All reads from the compressed > input > > @@ -575,7 +575,7 @@ static int get_next_block(bunzip_data *bd) > > in outbuf. IOW: on EOF returns len ("all bytes are not filled"), not > 0. > > (Why? This allows to get rid of one local variable) > > */ > > -int FAST_FUNC read_bunzip(bunzip_data *bd, char *outbuf, int len) > > +static int FAST_FUNC read_bunzip(bunzip_data *bd, char *outbuf, int len) > > { > > const uint32_t *dbuf; > > int pos, current, previous; > > @@ -699,7 +699,7 @@ int FAST_FUNC read_bunzip(bunzip_data *bd, char > *outbuf, int len) > > /* Because bunzip2 is used for help text unpacking, and because > bb_show_usage() > > should work for NOFORK applets too, we must be extremely careful to > not leak > > any allocations! */ > > -int FAST_FUNC start_bunzip( > > +static int FAST_FUNC start_bunzip( > > void *jmpbuf, > > bunzip_data **bdp, > > int in_fd, > > @@ -759,7 +759,7 @@ int FAST_FUNC start_bunzip( > > return RETVAL_OK; > > } > > > > -void FAST_FUNC dealloc_bunzip(bunzip_data *bd) > > +static void FAST_FUNC dealloc_bunzip(bunzip_data *bd) > > { > > free(bd->dbuf); > > free(bd); > > @@ -847,6 +847,36 @@ unpack_bz2_stream(transformer_state_t *xstate) > > return i ? i : IF_DESKTOP(total_written) + 0; > > } > > > > +const char * FAST_FUNC > > +unpack_bz2_data(const char *packed, int packed_len, int unpacked_len) > > +{ > > + char *outbuf = NULL; > > + bunzip_data *bd; > > + int i; > > + jmp_buf jmpbuf; > > + > > + /* Setup for I/O error handling via longjmp */ > > + i = setjmp(jmpbuf); > > + if (i == 0) { > > + i = start_bunzip(, > > + , > > + /* src_fd: */ -1, > > + /* inbuf: */ packed, > > + /* len:*/ packed_len > > + ); > > + } > > + /* read_bunzip can longjmp and end up here with i != 0 > > +* on read data errors! Not trivial */ > > + if (i == 0) { > > + /* Cannot use xmalloc: will leak bd in NOFORK case! */ > > + outbuf = malloc_or_warn(unpacked_len); > > + if (outbuf) > > + read_bunzip(bd, outbuf, unpacked_len); > > + } > > + dealloc_bunzip(bd); > > + return outbuf; > > +} > > + > > #ifdef TESTING > > > > static char *const bunzip_errors[] = { > > diff --git a/include/bb_archive.h b/include/bb_archive.h > > index d2022336b..0dbe17496 100644 > > --- a/include/bb_archive.h > > +++ b/include/bb_archive.h > > @@ -214,12 +214,7 @@ const llist_t *find_list_entry(const llist_t *list, > const char *filename) FAST_F > > const llist_t *find_list_entry2(const llist_t *list, const char > *filename) FAST_FUNC; > > > > /* A bit of bunzip2 internals are exposed for
Re: [PATCH] libarchive: add a function to unpack embedded data
Applied, thanks! On Fri, Nov 2, 2018 at 9:34 AM Ron Yorston wrote: > > Similar code to unpack embedded data is used to decompress usage > messages, embedded scripts and the config file (in the non-default > bbconfig applet). > > Moving this code to a common function reduces the size of the default > build and hides more of the internals of libarchive. > > function old new delta > unpack_bz2_data- 135+135 > bb_show_usage137 157 +20 > get_script_content32 47 +15 > unpack_scripts 119 --119 > unpack_usage_messages124 --124 > -- > (add/remove: 1/2 grow/shrink: 2/0 up/down: 170/-243) Total: -73 bytes > > Signed-off-by: Ron Yorston > --- > archival/libarchive/decompress_bunzip2.c | 38 +-- > include/bb_archive.h | 7 +- > libbb/appletlib.c| 81 +--- > miscutils/bbconfig.c | 27 ++-- > 4 files changed, 54 insertions(+), 99 deletions(-) > > diff --git a/archival/libarchive/decompress_bunzip2.c > b/archival/libarchive/decompress_bunzip2.c > index 7ef4e035f..3deb213a8 100644 > --- a/archival/libarchive/decompress_bunzip2.c > +++ b/archival/libarchive/decompress_bunzip2.c > @@ -107,7 +107,7 @@ struct bunzip_data { > uint8_t selectors[32768]; /* nSelectors=15 bits */ > struct group_data groups[MAX_GROUPS]; /* Huffman coding tables */ > }; > -/* typedef struct bunzip_data bunzip_data; -- done in .h file */ > +typedef struct bunzip_data bunzip_data; > > > /* Return the next nnn bits of input. All reads from the compressed input > @@ -575,7 +575,7 @@ static int get_next_block(bunzip_data *bd) > in outbuf. IOW: on EOF returns len ("all bytes are not filled"), not 0. > (Why? This allows to get rid of one local variable) > */ > -int FAST_FUNC read_bunzip(bunzip_data *bd, char *outbuf, int len) > +static int FAST_FUNC read_bunzip(bunzip_data *bd, char *outbuf, int len) > { > const uint32_t *dbuf; > int pos, current, previous; > @@ -699,7 +699,7 @@ int FAST_FUNC read_bunzip(bunzip_data *bd, char *outbuf, > int len) > /* Because bunzip2 is used for help text unpacking, and because > bb_show_usage() > should work for NOFORK applets too, we must be extremely careful to not > leak > any allocations! */ > -int FAST_FUNC start_bunzip( > +static int FAST_FUNC start_bunzip( > void *jmpbuf, > bunzip_data **bdp, > int in_fd, > @@ -759,7 +759,7 @@ int FAST_FUNC start_bunzip( > return RETVAL_OK; > } > > -void FAST_FUNC dealloc_bunzip(bunzip_data *bd) > +static void FAST_FUNC dealloc_bunzip(bunzip_data *bd) > { > free(bd->dbuf); > free(bd); > @@ -847,6 +847,36 @@ unpack_bz2_stream(transformer_state_t *xstate) > return i ? i : IF_DESKTOP(total_written) + 0; > } > > +const char * FAST_FUNC > +unpack_bz2_data(const char *packed, int packed_len, int unpacked_len) > +{ > + char *outbuf = NULL; > + bunzip_data *bd; > + int i; > + jmp_buf jmpbuf; > + > + /* Setup for I/O error handling via longjmp */ > + i = setjmp(jmpbuf); > + if (i == 0) { > + i = start_bunzip(, > + , > + /* src_fd: */ -1, > + /* inbuf: */ packed, > + /* len:*/ packed_len > + ); > + } > + /* read_bunzip can longjmp and end up here with i != 0 > +* on read data errors! Not trivial */ > + if (i == 0) { > + /* Cannot use xmalloc: will leak bd in NOFORK case! */ > + outbuf = malloc_or_warn(unpacked_len); > + if (outbuf) > + read_bunzip(bd, outbuf, unpacked_len); > + } > + dealloc_bunzip(bd); > + return outbuf; > +} > + > #ifdef TESTING > > static char *const bunzip_errors[] = { > diff --git a/include/bb_archive.h b/include/bb_archive.h > index d2022336b..0dbe17496 100644 > --- a/include/bb_archive.h > +++ b/include/bb_archive.h > @@ -214,12 +214,7 @@ const llist_t *find_list_entry(const llist_t *list, > const char *filename) FAST_F > const llist_t *find_list_entry2(const llist_t *list, const char *filename) > FAST_FUNC; > > /* A bit of bunzip2 internals are exposed for compressed help support: */ > -typedef struct bunzip_data bunzip_data; > -int start_bunzip(void *, bunzip_data **bdp, int in_fd, const void *inbuf, > int len) FAST_FUNC; > -/* NB: read_bunzip returns < 0 on error, or the number of *unfilled* bytes > - * in outbuf. IOW: on EOF returns len ("all bytes are not filled"), not 0: */ > -int