summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2015-10-24 02:29:00 +0200
committerDenys Vlasenko2015-10-24 02:29:00 +0200
commit5c23f2566c1d26c62024cc2c78ca5aad4c99dd33 (patch)
treed0d6dfadf3831123ae0b3cf44f28b01d94ea4111
parent7ab00a0de9cfeeacff70a74402808d225ba07397 (diff)
downloadbusybox-5c23f2566c1d26c62024cc2c78ca5aad4c99dd33.zip
busybox-5c23f2566c1d26c62024cc2c78ca5aad4c99dd33.tar.gz
Apply post-1.24.0 patches, bump version to 1.24.11_24_1
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--Makefile2
-rw-r--r--coreutils/sort.c20
-rw-r--r--networking/ftpd.c17
-rw-r--r--networking/httpd.c25
-rwxr-xr-xscripts/trylink59
-rwxr-xr-xtestsuite/sort.tests36
6 files changed, 122 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index efb6d46..ea9dd3d 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 36f0254..c2e8bb8 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 7735b72..8345ae6 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 00169c3..ed15fd8 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 48c487b..357aa62 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 <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)
diff --git a/testsuite/sort.tests b/testsuite/sort.tests
index c4b2234..39c7af7 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
" "\