Apply post-1.24.0 patches, bump version to 1.24.1 1_24_1
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 24 Oct 2015 00:29:00 +0000 (02:29 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 24 Oct 2015 00:29:00 +0000 (02:29 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Makefile
coreutils/sort.c
networking/ftpd.c
networking/httpd.c
scripts/trylink
testsuite/sort.tests

index efb6d46b3b3bd5a4fb3f15cd6d82bbab2add681c..ea9dd3db47df82e9b155ac639a74a4d85fa39f9e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 24
-SUBLEVEL = 0
+SUBLEVEL = 1
 EXTRAVERSION =
 NAME = Unnamed
 
index 36f02543b7fb9fc951a899e37a37ce80d07c94d6..c2e8bb8de3e3ab84ed703c2bf486f7542776cfe2 100644 (file)
@@ -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;
        }
index 7735b723322bd194f58b78bdd3a4b7147f6d64f3..8345ae67c112ad3c4eb874d2e0af8541a73dc6e0 100644 (file)
@@ -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
index 00169c36d2fef25f628fcd3b628c1fcc2b8f5200..ed15fd8834ed9fff43679ff6ddc2e1310080771b 100644 (file)
@@ -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");
index 48c487bcd30f92f3029bf7f18a704da15a498264..357aa62771799163b15c732906ed911d79cc1083 100755 (executable)
@@ -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 <stdlib.h>
        /* 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)
index c4b22346421e7ccefcd6d1204a233bfd36906be1..39c7af7389553347a518fb235eff0a6b270a5337 100755 (executable)
@@ -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
 " "\