[PATCH 2/2] libbb/u_signal_names.c: don't check errno after bb_strtou

Rasmus Villemoes rasmus.villemoes at prevas.dk
Wed Sep 12 14:06:37 UTC 2018


Since we're comparing the return value to a smallish integer anyway, we
might as well use that bb_strtou() returns UINT_MAX for malformed
input. Referencing errno is kinda bloaty on glibc. Seems to save ~34 or
~45 bytes (depending on RTMINMAX_USE_LIBC_DEFINITIONS).

While NSIG is not in POSIX, we do already rely on it being defined,
compile-time const and smallish, since arrays in struct globals_misc are
defined in terms of it.

Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
---
 libbb/u_signal_names.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/libbb/u_signal_names.c b/libbb/u_signal_names.c
index 5ef5c3f28..88f63192d 100644
--- a/libbb/u_signal_names.c
+++ b/libbb/u_signal_names.c
@@ -151,8 +151,12 @@ int FAST_FUNC get_signum(const char *name)
 	unsigned i;
 	unsigned sigrtmin, sigrtmax;
 
+	/* bb_strtou returns UINT_MAX on error. We should be able to
+	 * assume NSIG is not that big... Hence no need to check errno
+	 * after bb_strtou(). */
+	BUILD_BUG_ON(NSIG >= UINT_MAX);
 	i = bb_strtou(name, NULL, 10);
-	if (!errno && i < NSIG) /* for shells, we allow 0 too */
+	if (i < NSIG) /* for shells, we allow 0 too */
 		return i;
 	if (strncasecmp(name, "SIG", 3) == 0)
 		name += 3;
@@ -200,7 +204,7 @@ int FAST_FUNC get_signum(const char *name)
 			return sigrtmin;
 		if (name[5] == '+') {
 			i = bb_strtou(name + 6, NULL, 10);
-			if (!errno && i <= sigrtmax - sigrtmin)
+			if (i <= sigrtmax - sigrtmin)
 				return sigrtmin + i;
 		}
 	}
@@ -209,7 +213,7 @@ int FAST_FUNC get_signum(const char *name)
 			return sigrtmax;
 		if (name[5] == '-') {
 			i = bb_strtou(name + 6, NULL, 10);
-			if (!errno && i <= sigrtmax - sigrtmin)
+			if (i <= sigrtmax - sigrtmin)
 				return sigrtmax - i;
 		}
 	}
-- 
2.16.4



More information about the busybox mailing list