mirror of
https://github.com/sheumann/hush.git
synced 2024-06-08 16:29:32 +00:00
Apply post-1.24.0 patches, bump version to 1.24.1
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7ab00a0de9
commit
5c23f2566c
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 1
|
VERSION = 1
|
||||||
PATCHLEVEL = 24
|
PATCHLEVEL = 24
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 1
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Unnamed
|
NAME = Unnamed
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,9 @@ static struct sort_key {
|
||||||
|
|
||||||
static char *get_key(char *str, struct sort_key *key, int flags)
|
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;
|
unsigned i;
|
||||||
|
|
||||||
/* Special case whole string, so we don't have to make a copy */
|
/* 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;
|
end = len;
|
||||||
/* Loop through fields */
|
/* Loop through fields */
|
||||||
else {
|
else {
|
||||||
|
unsigned char ch = 0;
|
||||||
|
|
||||||
end = 0;
|
end = 0;
|
||||||
for (i = 1; i < key->range[2*j] + j; i++) {
|
for (i = 1; i < key->range[2*j] + j; i++) {
|
||||||
if (key_separator) {
|
if (key_separator) {
|
||||||
/* Skip body of key and separator */
|
/* Skip body of key and separator */
|
||||||
while (str[end]) {
|
while ((ch = str[end]) != '\0') {
|
||||||
if (str[end++] == key_separator)
|
end++;
|
||||||
|
if (ch == key_separator)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -136,7 +141,7 @@ static char *get_key(char *str, struct sort_key *key, int flags)
|
||||||
while (isspace(str[end]))
|
while (isspace(str[end]))
|
||||||
end++;
|
end++;
|
||||||
/* Skip body of key */
|
/* Skip body of key */
|
||||||
while (str[end]) {
|
while (str[end] != '\0') {
|
||||||
if (isspace(str[end]))
|
if (isspace(str[end]))
|
||||||
break;
|
break;
|
||||||
end++;
|
end++;
|
||||||
|
@ -144,8 +149,13 @@ static char *get_key(char *str, struct sort_key *key, int flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Remove last delim: "abc:def:" => "abc:def" */
|
/* 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--;
|
end--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!j) start = end;
|
if (!j) start = end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1223,11 +1223,26 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
|
||||||
#endif
|
#endif
|
||||||
argv += optind;
|
argv += optind;
|
||||||
if (argv[0]) {
|
if (argv[0]) {
|
||||||
|
const char *basedir = argv[0];
|
||||||
#if !BB_MMU
|
#if !BB_MMU
|
||||||
G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY);
|
G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY);
|
||||||
close_on_exec_on(G.root_fd);
|
close_on_exec_on(G.root_fd);
|
||||||
#endif
|
#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
|
#if ENABLE_FEATURE_FTP_AUTHENTICATION
|
||||||
|
|
|
@ -967,19 +967,30 @@ static void send_headers(int responseNum)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (responseNum == HTTP_MOVED_TEMPORARILY) {
|
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,
|
found_moved_temporarily,
|
||||||
(g_query ? "?" : ""),
|
(g_query ? "?" : ""),
|
||||||
(g_query ? g_query : ""));
|
(g_query ? g_query : ""));
|
||||||
|
if (len > IOBUF_SIZE-3)
|
||||||
|
len = IOBUF_SIZE-3;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_FEATURE_HTTPD_ERROR_PAGES
|
#if ENABLE_FEATURE_HTTPD_ERROR_PAGES
|
||||||
if (error_page && access(error_page, R_OK) == 0) {
|
if (error_page && access(error_page, R_OK) == 0) {
|
||||||
strcat(iobuf, "\r\n");
|
iobuf[len++] = '\r';
|
||||||
len += 2;
|
iobuf[len++] = '\n';
|
||||||
|
if (DEBUG) {
|
||||||
if (DEBUG)
|
iobuf[len] = '\0';
|
||||||
fprintf(stderr, "headers: '%s'\n", iobuf);
|
fprintf(stderr, "headers: '%s'\n", iobuf);
|
||||||
|
}
|
||||||
full_write(STDOUT_FILENO, iobuf, len);
|
full_write(STDOUT_FILENO, iobuf, len);
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
fprintf(stderr, "writing error page: '%s'\n", error_page);
|
fprintf(stderr, "writing error page: '%s'\n", error_page);
|
||||||
|
@ -1021,8 +1032,10 @@ static void send_headers(int responseNum)
|
||||||
responseNum, responseString,
|
responseNum, responseString,
|
||||||
responseNum, responseString, infoString);
|
responseNum, responseString, infoString);
|
||||||
}
|
}
|
||||||
if (DEBUG)
|
if (DEBUG) {
|
||||||
|
iobuf[len] = '\0';
|
||||||
fprintf(stderr, "headers: '%s'\n", iobuf);
|
fprintf(stderr, "headers: '%s'\n", iobuf);
|
||||||
|
}
|
||||||
if (full_write(STDOUT_FILENO, iobuf, len) != len) {
|
if (full_write(STDOUT_FILENO, iobuf, len) != len) {
|
||||||
if (verbose > 1)
|
if (verbose > 1)
|
||||||
bb_perror_msg("error");
|
bb_perror_msg("error");
|
||||||
|
|
|
@ -47,18 +47,22 @@ try() {
|
||||||
|
|
||||||
check_cc() {
|
check_cc() {
|
||||||
local tempname="$(mktemp)"
|
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! :(
|
# Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :(
|
||||||
# "-xc": C language. "/dev/null" is an empty source file.
|
# Was using "-xc /dev/null", but we need a valid C program.
|
||||||
if $CC $CPPFLAGS $CFLAGS $1 -shared -xc /dev/null -o "$tempname".o >/dev/null 2>&1; then
|
# "eval" may be needed if CFLAGS can contain
|
||||||
echo "$1";
|
# '... -D"BB_VER=KBUILD_STR(1.N.M)" ...'
|
||||||
else
|
# and we need shell to process quotes!
|
||||||
echo "$2";
|
$CC $CFLAGS $1 "$tempname".c -o "$tempname" >/dev/null 2>&1
|
||||||
fi
|
r=$?
|
||||||
rm -f "$tempname" "$tempname".o
|
rm -f "$tempname" "$tempname".c "$tempname".o
|
||||||
|
return $r
|
||||||
}
|
}
|
||||||
|
|
||||||
check_libc_is_glibc() {
|
check_libc_is_glibc() {
|
||||||
local tempname="$(mktemp)"
|
local tempname="$(mktemp)"
|
||||||
|
local r
|
||||||
echo "\
|
echo "\
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
/* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */
|
/* Apparently uclibc defines __GLIBC__ (compat trick?). Oh well. */
|
||||||
|
@ -66,12 +70,10 @@ check_libc_is_glibc() {
|
||||||
syntax error here
|
syntax error here
|
||||||
#endif
|
#endif
|
||||||
" >"$tempname".c
|
" >"$tempname".c
|
||||||
if $CC $CPPFLAGS $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1; then
|
! $CC $CFLAGS "$tempname".c -c -o "$tempname".o >/dev/null 2>&1
|
||||||
echo "$2";
|
r=$?
|
||||||
else
|
rm -f "$tempname" "$tempname".c "$tempname".o
|
||||||
echo "$1";
|
return $r
|
||||||
fi
|
|
||||||
rm -f "$tempname" "$tempname".[co]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXE="$1"
|
EXE="$1"
|
||||||
|
@ -83,32 +85,41 @@ A_FILES="$6"
|
||||||
LDLIBS="$7"
|
LDLIBS="$7"
|
||||||
|
|
||||||
# The --sort-section option is not supported by older versions of ld
|
# 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"
|
START_GROUP="-Wl,--start-group"
|
||||||
END_GROUP="-Wl,--end-group"
|
END_GROUP="-Wl,--end-group"
|
||||||
INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose"
|
INFO_OPTS="-Wl,--warn-common -Wl,-Map,$EXE.map -Wl,--verbose"
|
||||||
|
|
||||||
# gold may not support --sort-common (yet)
|
# 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
|
# Static linking against glibc produces buggy executables
|
||||||
# (glibc does not cope well with ld --gc-sections).
|
# (glibc does not cope well with ld --gc-sections).
|
||||||
# See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
|
# See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
|
||||||
# Note that glibc is unsuitable for static linking anyway.
|
# Note that glibc is unsuitable for static linking anyway.
|
||||||
# We are removing -Wl,--gc-sections from link command line.
|
# We are removing -Wl,--gc-sections from link command line.
|
||||||
GC_SECTIONS=`(
|
GC_SECTIONS="-Wl,--gc-sections"
|
||||||
. ./.config
|
if (. ./.config && test x"$CONFIG_STATIC" = x"y") then
|
||||||
if test x"$CONFIG_STATIC" = x"y"; then
|
if check_libc_is_glibc; then
|
||||||
check_libc_is_glibc "" "-Wl,--gc-sections"
|
echo "Static linking against glibc, can't use --gc-sections"
|
||||||
else
|
# GC_SECTIONS=""
|
||||||
echo "-Wl,--gc-sections"
|
fi
|
||||||
fi
|
fi
|
||||||
)`
|
|
||||||
|
|
||||||
# The --gc-sections option is not supported by older versions of ld
|
# The --gc-sections option is not supported by older versions of ld
|
||||||
if test -n "$GC_SECTIONS"; then
|
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
|
fi
|
||||||
|
|
||||||
# Sanitize lib list (dups, extra spaces etc)
|
# Sanitize lib list (dups, extra spaces etc)
|
||||||
|
|
|
@ -106,6 +106,42 @@ a/a:a
|
||||||
a:b
|
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" "\
|
testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\
|
||||||
a c
|
a c
|
||||||
" "\
|
" "\
|
||||||
|
|
Loading…
Reference in New Issue
Block a user