diff options
Diffstat (limited to 'system/musl/amalgamation.patch')
-rw-r--r-- | system/musl/amalgamation.patch | 362 |
1 files changed, 245 insertions, 117 deletions
diff --git a/system/musl/amalgamation.patch b/system/musl/amalgamation.patch index e53290e21..5918c3be6 100644 --- a/system/musl/amalgamation.patch +++ b/system/musl/amalgamation.patch @@ -1,5 +1,14 @@ +diff --git a/compat/time32/timespec_get_time32.c b/compat/time32/timespec_get_time32.c +index e9ca94cb..b39b12ee 100644 +--- a/compat/time32/timespec_get_time32.c ++++ b/compat/time32/timespec_get_time32.c +@@ -1,3 +1,4 @@ ++#define _BSD_SOURCE + #include "time32.h" + #include <time.h> + #include <errno.h> diff --git a/include/stdlib.h b/include/stdlib.h -index 42ca8336..4bbaded0 100644 +index 194c2033..5734b1f0 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -39,14 +39,18 @@ void *malloc (size_t); @@ -37,8 +46,20 @@ index 42ca8336..4bbaded0 100644 int mkostemps (char *, int, int); void *valloc (size_t); void *memalign(size_t, size_t); +diff --git a/include/sys/time.h b/include/sys/time.h +index cdc67ef6..fd773896 100644 +--- a/include/sys/time.h ++++ b/include/sys/time.h +@@ -13,6 +13,7 @@ int gettimeofday (struct timeval *__restrict, void *__restrict); + #define ITIMER_REAL 0 + #define ITIMER_VIRTUAL 1 + #define ITIMER_PROF 2 ++#define __USE_TIME_BITS64 1 + + struct itimerval { + struct timeval it_interval; diff --git a/include/time.h b/include/time.h -index 672b3fc3..c5946dd0 100644 +index 5494df18..2412fe22 100644 --- a/include/time.h +++ b/include/time.h @@ -58,11 +58,14 @@ struct tm *gmtime (const time_t *); @@ -48,7 +69,7 @@ index 672b3fc3..c5946dd0 100644 -int timespec_get(struct timespec *, int); -#define CLOCKS_PER_SEC 1000000L -+#if __STDC_VERSION__ >= 201112L ++#if __STDC_VERSION__ >= 201112L || defined(_BSD_SOURCE) || defined(_GNU_SOURCE) +int timespec_get(struct timespec *, int); #define TIME_UTC 1 @@ -58,11 +79,58 @@ index 672b3fc3..c5946dd0 100644 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ +@@ -137,7 +140,10 @@ __REDIR(mktime, __mktime64); + __REDIR(gmtime, __gmtime64); + __REDIR(localtime, __localtime64); + __REDIR(ctime, __ctime64); ++# if __STDC_VERSION__ >= 201112L || defined(_BSD_SOURCE) \ ++ || defined(_GNU_SOURCE) + __REDIR(timespec_get, __timespec_get_time64); ++# endif + #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ + || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ + || defined(_BSD_SOURCE) diff --git a/include/unistd.h b/include/unistd.h -index 9485da7a..1bdd3292 100644 +index 7bcbff94..6fd67160 100644 --- a/include/unistd.h +++ b/include/unistd.h -@@ -274,6 +274,7 @@ int eaccess(const char *, int); +@@ -33,16 +33,23 @@ extern "C" { + #include <bits/alltypes.h> + + int pipe(int [2]); +-int pipe2(int [2], int); + int close(int); +-int posix_close(int, int); + int dup(int); + int dup2(int, int); +-int dup3(int, int, int); + off_t lseek(int, off_t, int); + int fsync(int); + int fdatasync(int); + ++#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \ ++ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 > 700) \ ++ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 > 200809L) ++int pipe2(int [2], int); ++int dup3(int, int, int); ++int posix_close(int, int); ++ ++#define POSIX_CLOSE_RESTART 0 ++#endif ++ + ssize_t read(int, void *, size_t); + ssize_t write(int, const void *, size_t); + ssize_t pread(int, void *, size_t, off_t); +@@ -202,8 +209,6 @@ ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned); + #define off64_t off_t + #endif + +-#define POSIX_CLOSE_RESTART 0 +- + #define _XOPEN_VERSION 700 + #define _XOPEN_UNIX 1 + #define _XOPEN_ENH_I18N 1 +@@ -276,6 +281,7 @@ ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned); #define _PC_ALLOC_SIZE_MIN 18 #define _PC_SYMLINK_MAX 19 #define _PC_2_SYMLINKS 20 @@ -70,7 +138,7 @@ index 9485da7a..1bdd3292 100644 #define _SC_ARG_MAX 0 #define _SC_CHILD_MAX 1 -@@ -417,6 +418,7 @@ int eaccess(const char *, int); +@@ -419,6 +425,7 @@ ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned); #define _SC_XOPEN_STREAMS 246 #define _SC_THREAD_ROBUST_PRIO_INHERIT 247 #define _SC_THREAD_ROBUST_PRIO_PROTECT 248 @@ -78,7 +146,7 @@ index 9485da7a..1bdd3292 100644 #define _CS_PATH 0 #define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS 1 -@@ -459,6 +461,8 @@ int eaccess(const char *, int); +@@ -461,6 +468,8 @@ ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned); #define _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS 1147 #define _CS_V6_ENV 1148 #define _CS_V7_ENV 1149 @@ -103,18 +171,20 @@ index 02cb1aa2..8f870a69 100644 return 0; } diff --git a/src/conf/fpathconf.c b/src/conf/fpathconf.c -index e6aca5cf..b6a9d63e 100644 +index e6aca5cf..83e47e87 100644 --- a/src/conf/fpathconf.c +++ b/src/conf/fpathconf.c -@@ -4,7 +4,7 @@ +@@ -4,8 +4,8 @@ long fpathconf(int fd, int name) { - static const short values[] = { +- [_PC_LINK_MAX] = _POSIX_LINK_MAX, + static const long values[] = { - [_PC_LINK_MAX] = _POSIX_LINK_MAX, ++ [_PC_LINK_MAX] = -1, [_PC_MAX_CANON] = _POSIX_MAX_CANON, [_PC_MAX_INPUT] = _POSIX_MAX_INPUT, + [_PC_NAME_MAX] = NAME_MAX, @@ -25,7 +25,8 @@ long fpathconf(int fd, int name) [_PC_REC_XFER_ALIGN] = 4096, [_PC_ALLOC_SIZE_MIN] = 4096, @@ -126,7 +196,7 @@ index e6aca5cf..b6a9d63e 100644 if (name >= sizeof(values)/sizeof(values[0])) { errno = EINVAL; diff --git a/src/conf/sysconf.c b/src/conf/sysconf.c -index 45ef1c16..483e1635 100644 +index 3baaed32..04369596 100644 --- a/src/conf/sysconf.c +++ b/src/conf/sysconf.c @@ -165,6 +165,7 @@ long sysconf(int name) @@ -138,10 +208,10 @@ index 45ef1c16..483e1635 100644 if (name >= sizeof(values)/sizeof(values[0]) || !values[name]) { diff --git a/src/locale/setlocale.c b/src/locale/setlocale.c -index 40bc7ece..4d51cdfe 100644 +index 2bc7b500..4a601eaf 100644 --- a/src/locale/setlocale.c +++ b/src/locale/setlocale.c -@@ -11,6 +11,8 @@ char *setlocale(int cat, const char *name) +@@ -14,6 +14,8 @@ char *setlocale(int cat, const char *name) if ((unsigned)cat > LC_ALL) return 0; @@ -150,6 +220,24 @@ index 40bc7ece..4d51cdfe 100644 LOCK(lock); /* For LC_ALL, setlocale is required to return a string which +diff --git a/src/misc/forkpty.c b/src/misc/forkpty.c +index caf13adb..43494b96 100644 +--- a/src/misc/forkpty.c ++++ b/src/misc/forkpty.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <pty.h> + #include <utmp.h> + #include <unistd.h> +diff --git a/src/misc/wordexp.c b/src/misc/wordexp.c +index db83a69f..be9cb6d5 100644 +--- a/src/misc/wordexp.c ++++ b/src/misc/wordexp.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <wordexp.h> + #include <unistd.h> + #include <stdio.h> diff --git a/src/process/execlp.c b/src/process/execlp.c index 5eed886e..f6da398b 100644 --- a/src/process/execlp.c @@ -202,18 +290,18 @@ index 00000000..180bb2aa + return execv("/bin/sh", nargv); +} diff --git a/src/process/execvp.c b/src/process/execvp.c -index 2dddeddb..fdd0ca48 100644 +index ef3b9dd5..5e6255f7 100644 --- a/src/process/execvp.c +++ b/src/process/execvp.c -@@ -6,6 +6,7 @@ - #include "libc.h" +@@ -5,6 +5,7 @@ + #include <limits.h> extern char **__environ; +extern int __execsh(const char *, char *const []); int __execvpe(const char *file, char *const argv[], char *const envp[]) { -@@ -56,7 +57,12 @@ int __execvpe(const char *file, char *const argv[], char *const envp[]) +@@ -54,7 +55,12 @@ int __execvpe(const char *file, char *const argv[], char *const envp[]) int execvp(const char *file, char *const argv[]) { @@ -228,10 +316,10 @@ index 2dddeddb..fdd0ca48 100644 weak_alias(__execvpe, execvpe); diff --git a/src/process/system.c b/src/process/system.c -index 9135b815..aa01e13b 100644 +index 5af59b80..3f61d278 100644 --- a/src/process/system.c +++ b/src/process/system.c -@@ -19,7 +19,9 @@ int system(const char *cmd) +@@ -18,7 +18,9 @@ int system(const char *cmd) pthread_testcancel(); @@ -242,11 +330,20 @@ index 9135b815..aa01e13b 100644 sigaction(SIGINT, &sa, &oldint); sigaction(SIGQUIT, &sa, &oldquit); +diff --git a/src/stdio/popen.c b/src/stdio/popen.c +index 92cb57ee..70c5d6ec 100644 +--- a/src/stdio/popen.c ++++ b/src/stdio/popen.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <fcntl.h> + #include <unistd.h> + #include <errno.h> diff --git a/src/thread/pthread_attr_setinheritsched.c b/src/thread/pthread_attr_setinheritsched.c -index e540e846..4115e2fe 100644 +index ca264be7..fbfff6f8 100644 --- a/src/thread/pthread_attr_setinheritsched.c +++ b/src/thread/pthread_attr_setinheritsched.c -@@ -23,7 +23,7 @@ void *__start_sched(void *p) +@@ -3,7 +3,7 @@ int pthread_attr_setinheritsched(pthread_attr_t *a, int inherit) { @@ -267,19 +364,37 @@ index 46b520c0..933bdb38 100644 + return ENOTSUP; } } +diff --git a/src/time/strftime.c b/src/time/strftime.c +index cc53d536..98caa1f6 100644 +--- a/src/time/strftime.c ++++ b/src/time/strftime.c +@@ -95,6 +95,8 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * + case 'H': + val = tm->tm_hour; + goto number; ++ case 'l': ++ def_pad = ' '; + case 'I': + val = tm->tm_hour; + if (!val) val = 12; diff --git a/src/time/timespec_get.c b/src/time/timespec_get.c -index 03c5a77b..c423b825 100644 +index 40ea9c1c..e396da09 100644 --- a/src/time/timespec_get.c +++ b/src/time/timespec_get.c -@@ -6,7 +6,7 @@ int __clock_gettime(clockid_t, struct timespec *); - * are considered erroneous. */ - int timespec_get(struct timespec * ts, int base) - { -- if (base != TIME_UTC) return 0; -+ if (base != 1) return 0; - int ret = __clock_gettime(CLOCK_REALTIME, ts); - return ret < 0 ? 0 : base; - } +@@ -1,3 +1,4 @@ ++#define _BSD_SOURCE + #include <time.h> + + /* There is no other implemented value than TIME_UTC; all other values +diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c +index 76bbd4c7..0b4564f9 100644 +--- a/src/unistd/faccessat.c ++++ b/src/unistd/faccessat.c +@@ -1,3 +1,4 @@ ++#define _GNU_SOURCE + #include <unistd.h> + #include <fcntl.h> + #include <sys/wait.h> diff --git a/src/unistd/getcwd.c b/src/unistd/getcwd.c index f407ffe0..4fd3a60c 100644 --- a/src/unistd/getcwd.c @@ -297,92 +412,105 @@ index f407ffe0..4fd3a60c 100644 if (ret == 0 || buf[0] != '/') { errno = ENOENT; return 0; -diff --git a/src/conf/fpathconf.c b/src/conf/fpathconf.c -index b6a9d63e..83e47e87 100644 ---- a/src/conf/fpathconf.c -+++ b/src/conf/fpathconf.c -@@ -5,7 +5,7 @@ - long fpathconf(int fd, int name) - { - static const long values[] = { -- [_PC_LINK_MAX] = _POSIX_LINK_MAX, -+ [_PC_LINK_MAX] = -1, - [_PC_MAX_CANON] = _POSIX_MAX_CANON, - [_PC_MAX_INPUT] = _POSIX_MAX_INPUT, - [_PC_NAME_MAX] = NAME_MAX, -diff --git a/include/unistd.h b/include/unistd.h -index 1bdd3292..cdb16c19 100644 ---- a/include/unistd.h -+++ b/include/unistd.h -@@ -33,16 +33,23 @@ extern "C" { - #include <bits/alltypes.h> - - int pipe(int [2]); --int pipe2(int [2], int); - int close(int); --int posix_close(int, int); - int dup(int); - int dup2(int, int); --int dup3(int, int, int); - off_t lseek(int, off_t, int); - int fsync(int); - int fdatasync(int); +diff --git a/src/unistd/renameat.c b/src/unistd/renameat.c +index c3b40a25..6af5aed6 100644 +--- a/src/unistd/renameat.c ++++ b/src/unistd/renameat.c +@@ -1,11 +1,93 @@ ++#include <errno.h> ++#include <fcntl.h> ++#include <libgen.h> ++#include <limits.h> + #include <stdio.h> ++#include <string.h> ++#include <sys/stat.h> ++#include <sys/types.h> ++#include <unistd.h> + #include "syscall.h" -+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \ -+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 > 700) \ -+ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE+0 > 200809L) -+int pipe2(int [2], int); -+int dup3(int, int, int); -+int posix_close(int, int); ++static inline int test_symlink_dirness(int fd, const char *pathname) ++{ ++ struct stat statbuf; ++ if (fstatat(fd, pathname, &statbuf, AT_SYMLINK_NOFOLLOW) == -1) { ++ return 1; ++ } ++ if (S_ISLNK(statbuf.st_mode)) { ++ if (fstatat(fd, pathname, &statbuf, 0) == -1) return 1; + -+#define POSIX_CLOSE_RESTART 0 -+#endif ++ if (S_ISDIR(statbuf.st_mode)) return 0; ++ else { ++ errno = ENOTDIR; ++ return -1; ++ } ++ } ++ return 1; ++} + - ssize_t read(int, void *, size_t); - ssize_t write(int, const void *, size_t); - ssize_t pread(int, void *, size_t, off_t); -@@ -200,8 +207,6 @@ int eaccess(const char *, int); - #define off64_t off_t - #endif - --#define POSIX_CLOSE_RESTART 0 -- - #define _XOPEN_VERSION 700 - #define _XOPEN_UNIX 1 - #define _XOPEN_ENH_I18N 1 -diff --git a/src/misc/forkpty.c b/src/misc/forkpty.c -index caf13adb..047eb7d6 100644 ---- a/src/misc/forkpty.c -+++ b/src/misc/forkpty.c -@@ -1,3 +1,4 @@ -+#define _GNU_SOURCE - #include <pty.h> - #include <utmp.h> - #include <unistd.h> -diff --git a/src/misc/wordexp.c b/src/misc/wordexp.c -index db83a69f..1ae03f9f 100644 ---- a/src/misc/wordexp.c -+++ b/src/misc/wordexp.c -@@ -1,3 +1,4 @@ -+#define _GNU_SOURCE - #include <wordexp.h> - #include <unistd.h> - #include <stdio.h> -diff --git a/src/stdio/popen.c b/src/stdio/popen.c -index 92cb57ee..1ff9e0d9 100644 ---- a/src/stdio/popen.c -+++ b/src/stdio/popen.c -@@ -1,3 +1,4 @@ -+#define _GNU_SOURCE - #include <fcntl.h> - #include <unistd.h> - #include <errno.h> -diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c -index 76bbd4c7..d5e70608 100644 ---- a/src/unistd/faccessat.c -+++ b/src/unistd/faccessat.c -@@ -1,3 +1,4 @@ -+#define _GNU_SOURCE - #include <unistd.h> - #include <fcntl.h> - #include <sys/wait.h> + int renameat(int oldfd, const char *old, int newfd, const char *new) + { +-#ifdef SYS_renameat ++ char old_copy[PATH_MAX+1], new_copy[PATH_MAX+1]; ++ char *base; ++ size_t old_size, new_size; ++ struct stat oldstat, newstat; ++ int r; ++ ++ if ((old_size = strlen(old)) > PATH_MAX || \ ++ (new_size = strlen(new)) > PATH_MAX) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ ++ if (old_size == 0 || new_size == 0) { ++ errno = ENOENT; ++ return -1; ++ } ++ ++ /* Test equality of old and new. ++ If they both resolve to the same dentry, we do nothing. */ ++ if (fstatat(oldfd, old, &oldstat, AT_SYMLINK_NOFOLLOW) == 0 && \ ++ fstatat(newfd, new, &newstat, AT_SYMLINK_NOFOLLOW) == 0 && \ ++ oldstat.st_dev == newstat.st_dev && \ ++ oldstat.st_ino == newstat.st_ino) return 0; ++ ++ strcpy(old_copy, old); ++ strcpy(new_copy, new); ++ ++ base = basename(old_copy); ++ strncpy(old_copy, base, sizeof(old_copy)); ++ base = basename(new_copy); ++ strncpy(new_copy, base, sizeof(new_copy)); ++ ++ if (strcmp(old_copy, ".") == 0 || strcmp(old_copy, "..") == 0 || ++ strcmp(new_copy, ".") == 0 || strcmp(new_copy, "..") == 0) { ++ errno = EINVAL; ++ return -1; ++ } ++ ++ /* The Linux kernel will fail when attempting to rename a symlink of a ++ directory with a trailing slash. We therefore have to handle this ++ case ourselves. */ ++ if (old[old_size - 1] == '/') { ++ /* Calling stat(2) on a symlink to a dir with the trailing ++ slash causes stat(2) to return the actual directory instead ++ of the symlink itself. */ ++ strcpy(old_copy, old); ++ old_copy[old_size - 1] = '\0'; ++ r = test_symlink_dirness(oldfd, old_copy); ++ if (r == 0) old = old_copy; ++ else if (r == -1) return -1; ++ } ++ ++ if (new[new_size - 1] == '/') { ++ strcpy(new_copy, new); ++ new_copy[new_size - 1] = '\0'; ++ r = test_symlink_dirness(newfd, new_copy); ++ if (r == 0) new = new_copy; ++ else if (r == -1) return -1; ++ } ++ + return syscall(SYS_renameat, oldfd, old, newfd, new); +-#else +- return syscall(SYS_renameat2, oldfd, old, newfd, new, 0); +-#endif + } |