The default CFLAGS assigned by the build system include -funsigned-char, so that certain arithmetic operations on buffer contents can behave as expected. However, when setting CFLAGS on the make command line, these defaults get overridden, and if one neglects to include -funsigned-char in the override CFLAGS, some applets such as `sum` may produce results which are incorrect.
Update the declaration of the bb_common_bufsiz1 buffer, which is used by `sum` and others, to explicitly make it a buffer of unsigned char. This should be harmless, since this is the case anyway with -funsigned-char. Several other pointers, which are used to do pointer arithmetic against bb_common_bufsiz1, are also updated to be declared unsigned char. With this change, `sum` now produces correct results regardless of the presence of the -funsigned-char CFLAG. However, since there may still be other implicit dependencies on unsigned char behavior, -funsigned-char remains in the default CFLAGS assignment. Signed-off-by: Daniel Dadap <[email protected]> --- libbb/common_bufsiz.c | 6 +++--- miscutils/fbsplash.c | 2 +- miscutils/tree.c | 2 +- procps/nmeter.c | 4 ++-- scripts/generate_BUFSIZ.sh | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libbb/common_bufsiz.c b/libbb/common_bufsiz.c index 6bc6d7bc9..d7577fa9d 100644 --- a/libbb/common_bufsiz.c +++ b/libbb/common_bufsiz.c @@ -50,7 +50,7 @@ /* We use it for "global" data via *(struct global*)bb_common_bufsiz1. * Since gcc insists on aligning struct global's members, it would be a pity * (and an alignment fault on some CPUs) to mess it up. */ -char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long)); +unsigned char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long)); #else @@ -68,7 +68,7 @@ char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long)); * It is not defined as a dummy macro. * It means we have to provide this function. */ -char *const bb_common_bufsiz1 __attribute__ ((section (".data"))); +unsigned char *const bb_common_bufsiz1 __attribute__ ((section (".data"))); void setup_common_bufsiz(void) { if (!bb_common_bufsiz1) @@ -77,7 +77,7 @@ void setup_common_bufsiz(void) # else # ifndef bb_common_bufsiz1 /* bb_common_bufsiz1[] is not aliased to _end[] */ -char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long)); +unsigned char bb_common_bufsiz1[COMMON_BUFSIZE] ALIGNED(sizeof(long long)); # endif # endif diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c index 2934d8eb7..576546f5f 100644 --- a/miscutils/fbsplash.c +++ b/miscutils/fbsplash.c @@ -375,7 +375,7 @@ static void fb_drawprogressbar(unsigned percent) static void fb_drawimage(void) { FILE *theme_file; - char *read_ptr; + unsigned char *read_ptr; unsigned char *pixline; unsigned i, j, width, height, line_size; diff --git a/miscutils/tree.c b/miscutils/tree.c index 0b142c85c..3b58edc04 100644 --- a/miscutils/tree.c +++ b/miscutils/tree.c @@ -23,7 +23,7 @@ #define prefix_buf bb_common_bufsiz1 -static void tree_print(unsigned count[2], const char* directory_name, char* prefix_pos) +static void tree_print(unsigned count[2], const char* directory_name, unsigned char* prefix_pos) { struct dirent **entries; int index, size; diff --git a/procps/nmeter.c b/procps/nmeter.c index dca07eac6..edce265ea 100644 --- a/procps/nmeter.c +++ b/procps/nmeter.c @@ -87,7 +87,7 @@ struct globals { // 1 if sample delay is not an integer fraction of a second smallint need_seconds; char final_char; - char *cur_outbuf; + unsigned char *cur_outbuf; int delta; unsigned deltanz; struct timeval tv; @@ -136,7 +136,7 @@ static void print_outbuf(void) static void put(const char *s) { - char *p = cur_outbuf; + unsigned char *p = cur_outbuf; int sz = outbuf + COMMON_BUFSIZE - p; while (*s && --sz >= 0) *p++ = *s++; diff --git a/scripts/generate_BUFSIZ.sh b/scripts/generate_BUFSIZ.sh index 718788e0b..fae7d68a7 100755 --- a/scripts/generate_BUFSIZ.sh +++ b/scripts/generate_BUFSIZ.sh @@ -28,7 +28,7 @@ generate_std_and_exit() { $debug && echo "Configuring: bb_common_bufsiz1[] in bss" { echo "enum { COMMON_BUFSIZE = 1024 };" - echo "extern char bb_common_bufsiz1[];" + echo "extern unsigned char bb_common_bufsiz1[];" echo "#define setup_common_bufsiz() ((void)0)" } | regenerate "$common_bufsiz_h" echo "std" >"$common_bufsiz_h.method" @@ -39,7 +39,7 @@ generate_big_and_exit() { $debug && echo "Configuring: bb_common_bufsiz1[] in bss, COMMON_BUFSIZE = $1" { echo "enum { COMMON_BUFSIZE = $1 };" - echo "extern char bb_common_bufsiz1[];" + echo "extern unsigned char bb_common_bufsiz1[];" echo "#define setup_common_bufsiz() ((void)0)" } | regenerate "$common_bufsiz_h" echo "$2" >"$common_bufsiz_h.method" -- 2.39.5 _______________________________________________ busybox mailing list [email protected] https://lists.busybox.net/mailman/listinfo/busybox
