aboutsummaryrefslogtreecommitdiff
path: root/archival/unzip.c
diff options
context:
space:
mode:
authorJames Byrne <james.byrne@origamienergy.com>2019-07-02 11:35:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-07-02 11:35:03 +0200
commit6937487be73cd4563b876413277a295a5fe2f32c (patch)
treef16cc9999a7c827891e6ec8d99c699fc791008ee /archival/unzip.c
parentcaecfdc20d450686cd1f7e9b5f650322f894b3c2 (diff)
downloadbusybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.gz
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.bz2
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.zip
libbb: reduce the overhead of single parameter bb_error_msg() calls
Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower overhead call to bb_perror_msg() when only a string was being printed with no parameters. This saves space for some CPU architectures because it avoids the overhead of a call to a variadic function. However there has never been a simple version of bb_error_msg(), and since 2007 many new calls to bb_perror_msg() have been added that only take a single parameter and so could have been using bb_simple_perror_message(). This changeset introduces 'simple' versions of bb_info_msg(), bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and bb_herror_msg_and_die(), and replaces all calls that only take a single parameter, or use something like ("%s", arg), with calls to the corresponding 'simple' version. Since it is likely that single parameter calls to the variadic functions may be accidentally reintroduced in the future a new debugging config option WARN_SIMPLE_MSG has been introduced. This uses some macro magic which will cause any such calls to generate a warning, but this is turned off by default to avoid use of the unpleasant macros in normal circumstances. This is a large changeset due to the number of calls that have been replaced. The only files that contain changes other than simple substitution of function calls are libbb.h, libbb/herror_msg.c, libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c, networking/udhcp/common.h and util-linux/mdev.c additonal macros have been added for logging so that single parameter and multiple parameter logging variants exist. The amount of space saved varies considerably by architecture, and was found to be as follows (for 'defconfig' using GCC 7.4): Arm: -92 bytes MIPS: -52 bytes PPC: -1836 bytes x86_64: -938 bytes Note that for the MIPS architecture only an exception had to be made disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h) because it made these files larger on MIPS. Signed-off-by: James Byrne <james.byrne@origamienergy.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival/unzip.c')
-rw-r--r--archival/unzip.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/archival/unzip.c b/archival/unzip.c
index 466794031..8c4cb9881 100644
--- a/archival/unzip.c
+++ b/archival/unzip.c
@@ -322,7 +322,7 @@ static uint32_t read_next_cdf(uint32_t cdf_offset, cdf_header_t *cdf)
322static void die_if_bad_fnamesize(unsigned sz) 322static void die_if_bad_fnamesize(unsigned sz)
323{ 323{
324 if (sz > 0xfff) /* more than 4k?! no funny business please */ 324 if (sz > 0xfff) /* more than 4k?! no funny business please */
325 bb_error_msg_and_die("bad archive"); 325 bb_simple_error_msg_and_die("bad archive");
326} 326}
327 327
328static void unzip_skip(off_t skip) 328static void unzip_skip(off_t skip)
@@ -359,7 +359,7 @@ static void unzip_extract_symlink(llist_t **symlink_placeholders,
359 xread(zip_fd, target, zip->fmt.ucmpsize); 359 xread(zip_fd, target, zip->fmt.ucmpsize);
360 } else { 360 } else {
361#if 1 361#if 1
362 bb_error_msg_and_die("compressed symlink is not supported"); 362 bb_simple_error_msg_and_die("compressed symlink is not supported");
363#else 363#else
364 transformer_state_t xstate; 364 transformer_state_t xstate;
365 init_transformer_state(&xstate); 365 init_transformer_state(&xstate);
@@ -399,10 +399,10 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
399 if (zip->fmt.method == 8) { 399 if (zip->fmt.method == 8) {
400 /* Method 8 - inflate */ 400 /* Method 8 - inflate */
401 if (inflate_unzip(&xstate) < 0) 401 if (inflate_unzip(&xstate) < 0)
402 bb_error_msg_and_die("inflate error"); 402 bb_simple_error_msg_and_die("inflate error");
403 /* Validate decompression - crc */ 403 /* Validate decompression - crc */
404 if (zip->fmt.crc32 != (xstate.crc32 ^ 0xffffffffL)) { 404 if (zip->fmt.crc32 != (xstate.crc32 ^ 0xffffffffL)) {
405 bb_error_msg_and_die("crc error"); 405 bb_simple_error_msg_and_die("crc error");
406 } 406 }
407 } 407 }
408#if ENABLE_FEATURE_UNZIP_BZIP2 408#if ENABLE_FEATURE_UNZIP_BZIP2
@@ -412,7 +412,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
412 */ 412 */
413 xstate.bytes_out = unpack_bz2_stream(&xstate); 413 xstate.bytes_out = unpack_bz2_stream(&xstate);
414 if (xstate.bytes_out < 0) 414 if (xstate.bytes_out < 0)
415 bb_error_msg_and_die("inflate error"); 415 bb_simple_error_msg_and_die("inflate error");
416 } 416 }
417#endif 417#endif
418#if ENABLE_FEATURE_UNZIP_LZMA 418#if ENABLE_FEATURE_UNZIP_LZMA
@@ -420,7 +420,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
420 /* Not tested yet */ 420 /* Not tested yet */
421 xstate.bytes_out = unpack_lzma_stream(&xstate); 421 xstate.bytes_out = unpack_lzma_stream(&xstate);
422 if (xstate.bytes_out < 0) 422 if (xstate.bytes_out < 0)
423 bb_error_msg_and_die("inflate error"); 423 bb_simple_error_msg_and_die("inflate error");
424 } 424 }
425#endif 425#endif
426#if ENABLE_FEATURE_UNZIP_XZ 426#if ENABLE_FEATURE_UNZIP_XZ
@@ -428,7 +428,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
428 /* Not tested yet */ 428 /* Not tested yet */
429 xstate.bytes_out = unpack_xz_stream(&xstate); 429 xstate.bytes_out = unpack_xz_stream(&xstate);
430 if (xstate.bytes_out < 0) 430 if (xstate.bytes_out < 0)
431 bb_error_msg_and_die("inflate error"); 431 bb_simple_error_msg_and_die("inflate error");
432 } 432 }
433#endif 433#endif
434 else { 434 else {
@@ -439,7 +439,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
439 if (zip->fmt.ucmpsize != xstate.bytes_out) { 439 if (zip->fmt.ucmpsize != xstate.bytes_out) {
440 /* Don't die. Who knows, maybe len calculation 440 /* Don't die. Who knows, maybe len calculation
441 * was botched somewhere. After all, crc matched! */ 441 * was botched somewhere. After all, crc matched! */
442 bb_error_msg("bad length"); 442 bb_simple_error_msg("bad length");
443 } 443 }
444} 444}
445 445
@@ -447,7 +447,7 @@ static void my_fgets80(char *buf80)
447{ 447{
448 fflush_all(); 448 fflush_all();
449 if (!fgets(buf80, 80, stdin)) { 449 if (!fgets(buf80, 80, stdin)) {
450 bb_perror_msg_and_die("can't read standard input"); 450 bb_simple_perror_msg_and_die("can't read standard input");
451 } 451 }
452} 452}
453 453