From 5c23f2566c1d26c62024cc2c78ca5aad4c99dd33 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sat, 24 Oct 2015 02:29:00 +0200 Subject: [PATCH] Apply post-1.24.0 patches, bump version to 1.24.1 Signed-off-by: Denys Vlasenko --- Makefile | 2 +- coreutils/sort.c | 20 +++++++++++---- networking/ftpd.c | 17 ++++++++++++- networking/httpd.c | 25 ++++++++++++++----- scripts/trylink | 59 ++++++++++++++++++++++++++------------------ testsuite/sort.tests | 36 +++++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index efb6d46b3..ea9dd3db4 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 24 -SUBLEVEL = 0 +SUBLEVEL = 1 EXTRAVERSION = NAME = Unnamed diff --git a/coreutils/sort.c b/coreutils/sort.c index 36f02543b..c2e8bb8de 100644 --- a/coreutils/sort.c +++ b/coreutils/sort.c @@ -106,7 +106,9 @@ static struct sort_key { static char *get_key(char *str, struct sort_key *key, int flags) { - int start = 0, end = 0, len, j; + int start = start; /* for compiler */ + int end; + int len, j; unsigned i; /* Special case whole string, so we don't have to make a copy */ @@ -123,12 +125,15 @@ static char *get_key(char *str, struct sort_key *key, int flags) end = len; /* Loop through fields */ else { + unsigned char ch = 0; + end = 0; for (i = 1; i < key->range[2*j] + j; i++) { if (key_separator) { /* Skip body of key and separator */ - while (str[end]) { - if (str[end++] == key_separator) + while ((ch = str[end]) != '\0') { + end++; + if (ch == key_separator) break; } } else { @@ -136,7 +141,7 @@ static char *get_key(char *str, struct sort_key *key, int flags) while (isspace(str[end])) end++; /* Skip body of key */ - while (str[end]) { + while (str[end] != '\0') { if (isspace(str[end])) break; end++; @@ -144,8 +149,13 @@ static char *get_key(char *str, struct sort_key *key, int flags) } } /* Remove last delim: "abc:def:" => "abc:def" */ - if (key_separator && j && end != 0) + if (j && ch) { + //if (str[end-1] != key_separator) + // bb_error_msg(_and_die("BUG! " + // "str[start:%d,end:%d]:'%.*s'", + // start, end, (int)(end-start), &str[start]); end--; + } } if (!j) start = end; } diff --git a/networking/ftpd.c b/networking/ftpd.c index 7735b7233..8345ae67c 100644 --- a/networking/ftpd.c +++ b/networking/ftpd.c @@ -1223,11 +1223,26 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) #endif argv += optind; if (argv[0]) { + const char *basedir = argv[0]; #if !BB_MMU G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY); close_on_exec_on(G.root_fd); #endif - xchroot(argv[0]); + if (chroot(basedir) == 0) + basedir = "/"; +#if !BB_MMU + else { + close(G.root_fd); + G.root_fd = -1; + } +#endif + /* + * If chroot failed, assume that we aren't root, + * and at least chdir to the specified DIR + * (older versions were dying with error message). + * If chroot worked, move current dir to new "/": + */ + xchdir(basedir); } #if ENABLE_FEATURE_FTP_AUTHENTICATION diff --git a/networking/httpd.c b/networking/httpd.c index 00169c36d..ed15fd883 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -967,19 +967,30 @@ static void send_headers(int responseNum) } #endif if (responseNum == HTTP_MOVED_TEMPORARILY) { - len += sprintf(iobuf + len, "Location: %s/%s%s\r\n", + /* Responding to "GET /dir" with + * "HTTP/1.0 302 Found" "Location: /dir/" + * - IOW, asking them to repeat with a slash. + * Here, overflow IS possible, can't use sprintf: + * mkdir test + * python -c 'print("get /test?" + ("x" * 8192))' | busybox httpd -i -h . + */ + len += snprintf(iobuf + len, IOBUF_SIZE-3 - len, + "Location: %s/%s%s\r\n", found_moved_temporarily, (g_query ? "?" : ""), (g_query ? g_query : "")); + if (len > IOBUF_SIZE-3) + len = IOBUF_SIZE-3; } #if ENABLE_FEATURE_HTTPD_ERROR_PAGES if (error_page && access(error_page, R_OK) == 0) { - strcat(iobuf, "\r\n"); - len += 2; - - if (DEBUG) + iobuf[len++] = '\r'; + iobuf[len++] = '\n'; + if (DEBUG) { + iobuf[len] = '\0'; fprintf(stderr, "headers: '%s'\n", iobuf); + } full_write(STDOUT_FILENO, iobuf, len); if (DEBUG) fprintf(stderr, "writing error page: '%s'\n", error_page); @@ -1021,8 +1032,10 @@ static void send_headers(int responseNum) responseNum, responseString, responseNum, responseString, infoString); } - if (DEBUG) + if (DEBUG) { + iobuf[len] = '\0'; fprintf(stderr, "headers: '%s'\n", iobuf); + } if (full_write(STDOUT_FILENO, iobuf, len) != len) { if (verbose > 1) bb_perror_msg("error"); diff --git a/scripts/trylink b/scripts/trylink index 48c487bcd..357aa6277 100755 --- a/scripts/trylink +++ b/scripts/trylink @@ -47,18 +47,22 @@ try() { check_cc() { local tempname="$(mktemp)" + local r + echo "int main(int argc,char**argv){return argv?argc:0;}" >"$tempname".c # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :( - # "-xc": C language. "/dev/null" is an empty source file. - if $CC $CPPFLAGS $CFLAGS $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then - echo "$1"; - else - echo "$2"; - fi - rm -f "$tempname" "$tempname".o + # Was using "-xc /dev/null", but we need a valid C program. + # "eval" may be needed if CFLAGS can contain + # '... -D"BB_VER=KBUILD_STR(1.N.M)" ...' + # and we need shell to process quotes! + $CC $CFLAGS $1 "$tempname".c -o "$tempname" >/dev/null 2>&1 + r=$? + rm -f "$tempname" "$tempname".c "$tempname".o + return $r } check_libc_is_glibc() { local tempname="$(mktemp)" + local r echo "\ #include /* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */ @@ -66,12 +70,10 @@ check_libc_is_glibc() { syntax error here #endif " >"$tempname".c - if $CC $CPPFLAGS $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then - echo "$2"; - else - echo "$1"; - fi - rm -f "$tempname" "$tempname".[co] + ! $CC $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1 + r=$? + rm -f "$tempname" "$tempname".c "$tempname".o + return $r } EXE="$1" @@ -83,32 +85,41 @@ A_FILES="$6" LDLIBS="$7" # The --sort-section option is not supported by older versions of ld -SORT_SECTION=`check_cc "-Wl,--sort-section,alignment" ""` +SORT_SECTION="-Wl,--sort-section,alignment" +if ! check_cc "-Wl,--sort-section,alignment"; then + echo "Your linker does not support --sort-section,alignment" + SORT_SECTION="" +fi START_GROUP="-Wl,--start-group" END_GROUP="-Wl,--end-group" INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose" # gold may not support --sort-common (yet) -SORT_COMMON=`check_cc "-Wl,--sort-common" ""` +SORT_COMMON="-Wl,--sort-common" +if ! check_cc "-Wl,--sort-common"; then + echo "Your linker does not support --sort-common" + SORT_COMMON="" +fi # Static linking against glibc produces buggy executables # (glibc does not cope well with ld --gc-sections). # See sources.redhat.com/bugzilla/show_bug.cgi?id=3400 # Note that glibc is unsuitable for static linking anyway. # We are removing -Wl,--gc-sections from link command line. -GC_SECTIONS=`( -. ./.config -if test x"$CONFIG_STATIC" = x"y"; then - check_libc_is_glibc "" "-Wl,--gc-sections" -else - echo "-Wl,--gc-sections" +GC_SECTIONS="-Wl,--gc-sections" +if (. ./.config && test x"$CONFIG_STATIC" = x"y") then + if check_libc_is_glibc; then + echo "Static linking against glibc, can't use --gc-sections" +# GC_SECTIONS="" + fi fi -)` - # The --gc-sections option is not supported by older versions of ld if test -n "$GC_SECTIONS"; then - GC_SECTIONS=`check_cc "$GC_SECTIONS" ""` + if ! check_cc "$GC_SECTIONS"; then + echo "Your linker does not support $GC_SECTIONS" + GC_SECTIONS="" + fi fi # Sanitize lib list (dups, extra spaces etc) diff --git a/testsuite/sort.tests b/testsuite/sort.tests index c4b223464..39c7af738 100755 --- a/testsuite/sort.tests +++ b/testsuite/sort.tests @@ -106,6 +106,42 @@ a/a:a a:b " "" +testing "glibc build sort" "sort -t. -k 1,1 -k 2n,2n -k 3 input" "\ +GLIBC_2.1 +GLIBC_2.1.1 +GLIBC_2.2 +GLIBC_2.2.1 +GLIBC_2.10 +GLIBC_2.20 +GLIBC_2.21 +" "\ +GLIBC_2.21 +GLIBC_2.1.1 +GLIBC_2.2.1 +GLIBC_2.2 +GLIBC_2.20 +GLIBC_2.10 +GLIBC_2.1 +" "" + +testing "glibc build sort unique" "sort -u -t. -k 1,1 -k 2n,2n -k 3 input" "\ +GLIBC_2.1 +GLIBC_2.1.1 +GLIBC_2.2 +GLIBC_2.2.1 +GLIBC_2.10 +GLIBC_2.20 +GLIBC_2.21 +" "\ +GLIBC_2.10 +GLIBC_2.2.1 +GLIBC_2.1.1 +GLIBC_2.20 +GLIBC_2.2 +GLIBC_2.1 +GLIBC_2.21 +" "" + testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\ a c " "\