aboutsummaryrefslogtreecommitdiff
path: root/libbb/appletlib.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 /libbb/appletlib.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 'libbb/appletlib.c')
-rw-r--r--libbb/appletlib.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index fa19e8488..9fa17cfa1 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -631,7 +631,7 @@ static void check_suid(int applet_no)
631 /* same group / in group */ 631 /* same group / in group */
632 m >>= 3; 632 m >>= 3;
633 if (!(m & S_IXOTH)) /* is x bit not set? */ 633 if (!(m & S_IXOTH)) /* is x bit not set? */
634 bb_error_msg_and_die("you have no permission to run this applet"); 634 bb_simple_error_msg_and_die("you have no permission to run this applet");
635 635
636 /* We set effective AND saved ids. If saved-id is not set 636 /* We set effective AND saved ids. If saved-id is not set
637 * like we do below, seteuid(0) can still later succeed! */ 637 * like we do below, seteuid(0) can still later succeed! */
@@ -643,7 +643,7 @@ static void check_suid(int applet_no)
643 rgid = sct->m_ugid.gid; 643 rgid = sct->m_ugid.gid;
644 /* else: we will set egid = rgid, thus dropping sgid effect */ 644 /* else: we will set egid = rgid, thus dropping sgid effect */
645 if (setresgid(-1, rgid, rgid)) 645 if (setresgid(-1, rgid, rgid))
646 bb_perror_msg_and_die("setresgid"); 646 bb_simple_perror_msg_and_die("setresgid");
647 647
648 /* Are we directed to change uid 648 /* Are we directed to change uid
649 * (APPLET = s** USER.GROUP or APPLET = S** USER.GROUP)? 649 * (APPLET = s** USER.GROUP or APPLET = S** USER.GROUP)?
@@ -653,7 +653,7 @@ static void check_suid(int applet_no)
653 uid = sct->m_ugid.uid; 653 uid = sct->m_ugid.uid;
654 /* else: we will set euid = ruid, thus dropping suid effect */ 654 /* else: we will set euid = ruid, thus dropping suid effect */
655 if (setresuid(-1, uid, uid)) 655 if (setresuid(-1, uid, uid))
656 bb_perror_msg_and_die("setresuid"); 656 bb_simple_perror_msg_and_die("setresuid");
657 657
658 goto ret; 658 goto ret;
659 } 659 }
@@ -663,7 +663,7 @@ static void check_suid(int applet_no)
663 663
664 if (!onetime) { 664 if (!onetime) {
665 onetime = 1; 665 onetime = 1;
666 bb_error_msg("using fallback suid method"); 666 bb_simple_error_msg("using fallback suid method");
667 } 667 }
668 } 668 }
669# endif 669# endif
@@ -673,7 +673,7 @@ static void check_suid(int applet_no)
673 /* Real uid is not 0. If euid isn't 0 too, suid bit 673 /* Real uid is not 0. If euid isn't 0 too, suid bit
674 * is most probably not set on our executable */ 674 * is most probably not set on our executable */
675 if (geteuid()) 675 if (geteuid())
676 bb_error_msg_and_die("must be suid to work properly"); 676 bb_simple_error_msg_and_die("must be suid to work properly");
677 } else if (APPLET_SUID(applet_no) == BB_SUID_DROP) { 677 } else if (APPLET_SUID(applet_no) == BB_SUID_DROP) {
678 /* 678 /*
679 * Drop all privileges. 679 * Drop all privileges.