summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer2006-05-19 10:43:32 +0000
committerBernhard Reutner-Fischer2006-05-19 10:43:32 +0000
commit0e37af831d707494a86111755a3530b707d1035c (patch)
tree472954b39a7e9ec2c319971f028b2111f7b6f86e
parent006955556f9677ecf73aac582497f6efc47d383f (diff)
downloadbusybox-0e37af831d707494a86111755a3530b707d1035c.zip
busybox-0e37af831d707494a86111755a3530b707d1035c.tar.gz
- make sure not to trip enless loops when using strlen in IMA mode.
(r15000 from trunk plus preprocessor fixes plus repair of commit message)
-rw-r--r--include/libbb.h6
-rw-r--r--include/platform.h33
-rw-r--r--libbb/xfuncs.c13
3 files changed, 16 insertions, 36 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 0ec332b..01393ad 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -387,12 +387,6 @@ int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name);
void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name);
void reset_ino_dev_hashtable(void);
-/* Stupid gcc always includes its own builtin strlen()... */
-extern size_t bb_strlen(const char *string);
-#ifndef BB_STRLEN_IMPLEMENTATION
-#define strlen(x) bb_strlen(x)
-#endif
-
char *bb_xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
#define FAIL_DELAY 3
diff --git a/include/platform.h b/include/platform.h
index ea2983d..e2f97c0 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -32,40 +32,29 @@
# endif
#endif
-#if 0
-/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
-#ifndef ATTRIBUTE_MALLOC
-# if __GNUC_PREREQ (2,96)
-# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-# define ATTRIBUTE_MALLOC
-# endif /* GNUC >= 2.96 */
-#endif /* ATTRIBUTE_MALLOC */
-#endif
-
#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
#endif /* ATTRIBUTE_UNUSED */
#ifndef ATTRIBUTE_NORETURN
-# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
#endif /* ATTRIBUTE_NORETURN */
#ifndef ATTRIBUTE_PACKED
-# define ATTRIBUTE_PACKED __attribute__ ((__packed__))
-#endif /* ATTRIBUTE_PACKED */
+#define ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#endif /* ATTRIBUTE_NORETURN */
#ifndef ATTRIBUTE_ALIGNED
-# define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))
+#define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))
#endif /* ATTRIBUTE_ALIGNED */
/* -fwhole-program makes all symbols local. The attribute externally_visible
forces a symbol global. */
#ifndef ATTRIBUTE_EXTERNALLY_VISIBLE
# if __GNUC_PREREQ (4,1)
-# define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))
+# define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))
# else
-# define ATTRIBUTE_EXTERNALLY_VISIBLE
+# define ATTRIBUTE_EXTERNALLY_VISIBLE
# endif /* GNUC >= 4.1 */
#endif /* ATTRIBUTE_EXTERNALLY_VISIBLE */
@@ -78,6 +67,11 @@
# endif
#endif
+#ifdef __GNUC__
+#define strlen(x) bb_strlen(x)
+extern size_t bb_strlen(const char *string);
+#endif
+
/* ---- Endian Detection ------------------------------------ */
#ifndef __APPLE__
# include <byteswap.h>
@@ -86,13 +80,10 @@
#ifdef __BIG_ENDIAN__
# define BB_BIG_ENDIAN 1
-# define BB_LITTLE_ENDIAN 0
#elif __BYTE_ORDER == __BIG_ENDIAN
# define BB_BIG_ENDIAN 1
-# define BB_LITTLE_ENDIAN 0
#else
# define BB_BIG_ENDIAN 0
-# define BB_LITTLE_ENDIAN 1
#endif
/* ---- Networking ------------------------------------------ */
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 9ee4fcd..8bb75f6 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -14,16 +14,8 @@
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
-
-/* Since gcc always inlines strlen(), this saves a byte or two, but we need
- * the #undef here to avoid endless loop from #define strlen bb_strlen */
-#ifdef L_strlen
-#define BB_STRLEN_IMPLEMENTATION
-#endif
-
#include "libbb.h"
-
#ifndef DMALLOC
#ifdef L_xmalloc
void *xmalloc(size_t size)
@@ -175,10 +167,13 @@ void bb_xfflush_stdout(void)
}
#endif
+/* GCC forces inlining of strlen everywhere, which is generally a byte
+ larger than calling a function, and it's called a lot so it adds up.
+*/
#ifdef L_strlen
size_t bb_strlen(const char *string)
{
- return(strlen(string));
+ return(__builtin_strlen(string));
}
#endif