[PATCH] Avoid double argument evaluation in MIN and MAX macros
Bartosz Golaszewski
bartekgola at gmail.com
Sun Mar 30 22:08:12 UTC 2014
Commit c3a27b0b fixes a double argument evaluation by modifying the
macro invocation. What about preventing it on macro definition level?
Signed-off-by: Bartosz Golaszewski <bartekgola at gmail.com>
---
include/libbb.h | 22 +++++++++++++++-------
util-linux/swaponoff.c | 5 ++---
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/include/libbb.h b/include/libbb.h
index 1cbe2c8..db75641 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -265,13 +265,21 @@ struct BUG_off_t_size_is_misdetected {
#define SKIP ((int) 2)
/* Macros for min/max. */
-#ifndef MIN
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#endif
-
-#ifndef MAX
-#define MAX(a,b) (((a)>(b))?(a):(b))
-#endif
+#undef MIN
+#define MIN(a,b) \
+ ({ \
+ __typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ _a < _b ? _a : _b; \
+ })
+
+#undef MAX
+#define MAX(a,b) \
+ ({ \
+ __typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ _a > _b ? _a : _b; \
+ })
/* buffer allocation schemes */
#if ENABLE_FEATURE_BUFFERS_GO_ON_STACK
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
index a7ad6db..b3d265f 100644
--- a/util-linux/swaponoff.c
+++ b/util-linux/swaponoff.c
@@ -137,11 +137,10 @@ static int do_em_all(void)
p = hasmntopt(m, "pri");
if (p) {
/* Max allowed 32767 (== SWAP_FLAG_PRIO_MASK) */
- unsigned prio = bb_strtou(p + 4, NULL, 10);
+ unsigned prio = MIN(bb_strtou(p + 4, NULL, 10), SWAP_FLAG_PRIO_MASK);
/* We want to allow "NNNN,foo", thus errno == EINVAL is allowed too */
if (errno != ERANGE) {
- g_flags = (g_flags & ~SWAP_FLAG_PRIO_MASK) | SWAP_FLAG_PREFER |
- MIN(prio, SWAP_FLAG_PRIO_MASK);
+ g_flags = (g_flags & ~SWAP_FLAG_PRIO_MASK) | SWAP_FLAG_PREFER | prio;
}
}
#endif
--
1.8.4.5
More information about the busybox
mailing list