aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0003-d85d261e-to-2abb70c3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0003-d85d261e-to-2abb70c3.patch')
-rw-r--r--main/musl/0003-d85d261e-to-2abb70c3.patch540
1 files changed, 0 insertions, 540 deletions
diff --git a/main/musl/0003-d85d261e-to-2abb70c3.patch b/main/musl/0003-d85d261e-to-2abb70c3.patch
deleted file mode 100644
index 0ceecf5eb5..0000000000
--- a/main/musl/0003-d85d261e-to-2abb70c3.patch
+++ /dev/null
@@ -1,540 +0,0 @@
-diff --git a/include/netdb.h b/include/netdb.h
-index dfc70e2..703a4b2 100644
---- a/include/netdb.h
-+++ b/include/netdb.h
-@@ -41,7 +41,7 @@ struct addrinfo
- #define NI_NOFQDN 0x04
- #define NI_NAMEREQD 0x08
- #define NI_DGRAM 0x10
--/*#define NI_NUMERICSCOPE */
-+#define NI_NUMERICSCOPE 0x100
-
- #define EAI_BADFLAGS -1
- #define EAI_NONAME -2
-diff --git a/src/network/dn_expand.c b/src/network/dn_expand.c
-index 96adf37..849df19 100644
---- a/src/network/dn_expand.c
-+++ b/src/network/dn_expand.c
-@@ -4,10 +4,11 @@
- int __dn_expand(const unsigned char *base, const unsigned char *end, const unsigned char *src, char *dest, int space)
- {
- const unsigned char *p = src;
-- int len = -1, j;
-- if (space > 256) space = 256;
-+ char *dend = dest + (space > 254 ? 254 : space);
-+ int len = -1, i, j;
- if (p==end || !*p) return -1;
-- for (;;) {
-+ /* detect reference loop using an iteration counter */
-+ for (i=0; i < end-base; i+=2) {
- if (*p & 0xc0) {
- if (p+1==end) return -1;
- j = ((p[0] & 0x3f) << 8) | p[1];
-@@ -16,7 +17,7 @@ int __dn_expand(const unsigned char *base, const unsigned char *end, const unsig
- p = base+j;
- } else if (*p) {
- j = *p+1;
-- if (j>=end-p || j>space) return -1;
-+ if (j>=end-p || j>dend-dest) return -1;
- while (--j) *dest++ = *++p;
- *dest++ = *++p ? '.' : 0;
- } else {
-@@ -24,6 +25,7 @@ int __dn_expand(const unsigned char *base, const unsigned char *end, const unsig
- return len;
- }
- }
-+ return -1;
- }
-
- weak_alias(__dn_expand, dn_expand);
-diff --git a/src/network/ent.c b/src/network/ent.c
-index 4c2f24b..ececdc4 100644
---- a/src/network/ent.c
-+++ b/src/network/ent.c
-@@ -16,11 +16,3 @@ void endhostent(void)
- weak_alias(sethostent, setnetent);
- weak_alias(gethostent, getnetent);
- weak_alias(endhostent, endnetent);
--
--weak_alias(sethostent, setservent);
--weak_alias(gethostent, getservent);
--weak_alias(endhostent, endservent);
--
--weak_alias(sethostent, setprotoent);
--weak_alias(gethostent, getprotoent);
--weak_alias(endhostent, endprotoent);
-diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
-index 70b6cfd..d991344 100644
---- a/src/network/getaddrinfo.c
-+++ b/src/network/getaddrinfo.c
-@@ -105,6 +105,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
- case AF_INET6:
- out[k].sa.sin6.sin6_family = AF_INET6;
- out[k].sa.sin6.sin6_port = htons(ports[j].port);
-+ out[k].sa.sin6.sin6_scope_id = addrs[i].scopeid;
- memcpy(&out[k].sa.sin6.sin6_addr, &addrs[i].addr, 16);
- break;
- }
-diff --git a/src/network/getnameinfo.c b/src/network/getnameinfo.c
-index dfcf6ed..588ed76 100644
---- a/src/network/getnameinfo.c
-+++ b/src/network/getnameinfo.c
-@@ -5,6 +5,10 @@
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-+#include <net/if.h>
-+#include <ctype.h>
-+#include "lookup.h"
-+#include "stdio_impl.h"
-
- int __dns_parse(const unsigned char *, int, int (*)(void *, int, const void *, int, const void *), void *);
- int __dn_expand(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
-@@ -14,6 +18,16 @@ int __res_send(const unsigned char *, int, unsigned char *, int);
- #define PTR_MAX (64 + sizeof ".in-addr.arpa")
- #define RR_PTR 12
-
-+static char *itoa(char *p, unsigned x) {
-+ p += 3*sizeof(int);
-+ *--p = 0;
-+ do {
-+ *--p = '0' + x % 10;
-+ x /= 10;
-+ } while (x);
-+ return p;
-+}
-+
- static void mkptr4(char *s, const unsigned char *ip)
- {
- sprintf(s, "%d.%d.%d.%d.in-addr.arpa",
-@@ -31,6 +45,72 @@ static void mkptr6(char *s, const unsigned char *ip)
- strcpy(s, "ip6.arpa");
- }
-
-+static void reverse_hosts(char *buf, const unsigned char *a, unsigned scopeid, int family)
-+{
-+ char line[512], *p, *z;
-+ unsigned char _buf[1032], atmp[16];
-+ struct address iplit;
-+ FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf);
-+ if (!f) return;
-+ if (family == AF_INET) {
-+ memcpy(atmp+12, a, 4);
-+ memcpy(atmp, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
-+ a = atmp;
-+ }
-+ while (fgets(line, sizeof line, f)) {
-+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
-+
-+ for (p=line; *p && !isspace(*p); p++);
-+ *p++ = 0;
-+ if (__lookup_ipliteral(&iplit, line, AF_UNSPEC)<=0)
-+ continue;
-+
-+ if (iplit.family == AF_INET) {
-+ memcpy(iplit.addr+12, iplit.addr, 4);
-+ memcpy(iplit.addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
-+ iplit.scopeid = 0;
-+ }
-+
-+ if (memcmp(a, iplit.addr, 16) || iplit.scopeid != scopeid)
-+ continue;
-+
-+ for (; *p && isspace(*p); p++);
-+ for (z=p; *z && !isspace(*z); z++);
-+ *z = 0;
-+ if (z-p < 256) {
-+ memcpy(buf, p, z-p+1);
-+ break;
-+ }
-+ }
-+ __fclose_ca(f);
-+}
-+
-+static void reverse_services(char *buf, int port, int dgram)
-+{
-+ unsigned long svport;
-+ char line[128], *p, *z;
-+ unsigned char _buf[1032];
-+ FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
-+ if (!f) return;
-+ while (fgets(line, sizeof line, f)) {
-+ if ((p=strchr(line, '#'))) *p++='\n', *p=0;
-+
-+ for (p=line; *p && !isspace(*p); p++);
-+ if (!p) continue;
-+ *p++ = 0;
-+ svport = strtoul(p, &z, 10);
-+
-+ if (svport != port || z==p) continue;
-+ if (dgram && strncmp(z, "/udp", 4)) continue;
-+ if (!dgram && strncmp(z, "/tcp", 4)) continue;
-+ if (p-line > 32) continue;
-+
-+ memcpy(buf, line, p-line);
-+ break;
-+ }
-+ __fclose_ca(f);
-+}
-+
- static int dns_parse_callback(void *c, int rr, const void *data, int len, const void *packet)
- {
- char tmp[256];
-@@ -48,15 +128,17 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
- int flags)
- {
- char ptr[PTR_MAX];
-- char buf[256];
-+ char buf[256], num[3*sizeof(int)+1];
- int af = sa->sa_family;
- unsigned char *a;
-+ unsigned scopeid;
-
- switch (af) {
- case AF_INET:
- a = (void *)&((struct sockaddr_in *)sa)->sin_addr;
- if (sl != sizeof(struct sockaddr_in)) return EAI_FAMILY;
- mkptr4(ptr, a);
-+ scopeid = 0;
- break;
- case AF_INET6:
- a = (void *)&((struct sockaddr_in6 *)sa)->sin6_addr;
-@@ -65,6 +147,7 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
- mkptr6(ptr, a);
- else
- mkptr4(ptr, a+12);
-+ scopeid = ((struct sockaddr_in6 *)sa)->sin6_scope_id;
- break;
- default:
- return EAI_FAMILY;
-@@ -73,6 +156,9 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
- if (node && nodelen) {
- buf[0] = 0;
- if (!(flags & NI_NUMERICHOST)) {
-+ reverse_hosts(buf, a, scopeid, af);
-+ }
-+ if (!*buf && !(flags & NI_NUMERICHOST)) {
- unsigned char query[18+PTR_MAX], reply[512];
- int qlen = __res_mkquery(0, ptr, 1, RR_PTR,
- 0, 0, 0, query, sizeof query);
-@@ -84,16 +170,33 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
- if (!*buf) {
- if (flags & NI_NAMEREQD) return EAI_NONAME;
- inet_ntop(af, a, buf, sizeof buf);
-+ if (scopeid) {
-+ char *p = 0, tmp[IF_NAMESIZE+1];
-+ if (!(flags & NI_NUMERICSCOPE) &&
-+ (IN6_IS_ADDR_LINKLOCAL(a) ||
-+ IN6_IS_ADDR_MC_LINKLOCAL(a)))
-+ p = if_indextoname(scopeid, tmp+1);
-+ if (!p)
-+ p = itoa(num, scopeid);
-+ *--p = '%';
-+ strcat(buf, p);
-+ }
- }
- if (strlen(buf) >= nodelen) return EAI_OVERFLOW;
- strcpy(node, buf);
- }
-
- if (serv && servlen) {
-- if (snprintf(buf, sizeof buf, "%d",
-- ntohs(((struct sockaddr_in *)sa)->sin_port))>=servlen)
-+ char *p = buf;
-+ int port = ntohs(((struct sockaddr_in *)sa)->sin_port);
-+ buf[0] = 0;
-+ if (!(flags & NI_NUMERICSERV))
-+ reverse_services(buf, port, flags & NI_DGRAM);
-+ if (!*p)
-+ p = itoa(num, port);
-+ if (strlen(p) >= servlen)
- return EAI_OVERFLOW;
-- strcpy(serv, buf);
-+ strcpy(serv, p);
- }
-
- return 0;
-diff --git a/src/network/if_nametoindex.c b/src/network/if_nametoindex.c
-index fb4a147..cb6ec05 100644
---- a/src/network/if_nametoindex.c
-+++ b/src/network/if_nametoindex.c
-@@ -14,5 +14,5 @@ unsigned if_nametoindex(const char *name)
- strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
- r = ioctl(fd, SIOCGIFINDEX, &ifr);
- __syscall(SYS_close, fd);
-- return r < 0 ? r : ifr.ifr_ifindex;
-+ return r < 0 ? 0 : ifr.ifr_ifindex;
- }
-diff --git a/src/network/lookup.h b/src/network/lookup.h
-index 82c969e..19c9e48 100644
---- a/src/network/lookup.h
-+++ b/src/network/lookup.h
-@@ -22,5 +22,6 @@ struct service {
-
- int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int flags);
- int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, int flags);
-+int __lookup_ipliteral(struct address buf[static 1], const char *name, int family);
-
- #endif
-diff --git a/src/network/lookup_ipliteral.c b/src/network/lookup_ipliteral.c
-new file mode 100644
-index 0000000..7bcb85f
---- /dev/null
-+++ b/src/network/lookup_ipliteral.c
-@@ -0,0 +1,52 @@
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <netdb.h>
-+#include <net/if.h>
-+#include <arpa/inet.h>
-+#include <limits.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <ctype.h>
-+#include "lookup.h"
-+
-+int __inet_aton(const char *, struct in_addr *);
-+
-+int __lookup_ipliteral(struct address buf[static 1], const char *name, int family)
-+{
-+ struct in_addr a4;
-+ struct in6_addr a6;
-+ if (family != AF_INET6 && __inet_aton(name, &a4)>0) {
-+ memcpy(&buf[0].addr, &a4, sizeof a4);
-+ buf[0].family = AF_INET;
-+ buf[0].scopeid = 0;
-+ return 1;
-+ }
-+ if (family != AF_INET) {
-+ char tmp[64];
-+ char *p = strchr(name, '%'), *z;
-+ unsigned long long scopeid;
-+ if (p && p-name < 64) {
-+ memcpy(tmp, name, p-name);
-+ tmp[p-name] = 0;
-+ name = tmp;
-+ }
-+ if (inet_pton(AF_INET6, name, &a6)<=0) return 0;
-+ memcpy(&buf[0].addr, &a6, sizeof a6);
-+ buf[0].family = AF_INET6;
-+ if (p) {
-+ if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
-+ else z = p-1;
-+ if (*z) {
-+ if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
-+ !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
-+ return EAI_NONAME;
-+ scopeid = if_nametoindex(p);
-+ if (!scopeid) return EAI_NONAME;
-+ }
-+ if (scopeid > UINT_MAX) return EAI_NONAME;
-+ buf[0].scopeid = scopeid;
-+ }
-+ return 1;
-+ }
-+ return 0;
-+}
-diff --git a/src/network/lookup_name.c b/src/network/lookup_name.c
-index 0292093..68b172b 100644
---- a/src/network/lookup_name.c
-+++ b/src/network/lookup_name.c
-@@ -1,6 +1,7 @@
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
-+#include <net/if.h>
- #include <arpa/inet.h>
- #include <ctype.h>
- #include <stdlib.h>
-@@ -13,7 +14,7 @@
- static int is_valid_hostname(const char *host)
- {
- const unsigned char *s;
-- if (strnlen(host, 256)-1 > 254 || mbstowcs(0, host, 0) > 255) return 0;
-+ if (strnlen(host, 254)-1 >= 253 || mbstowcs(0, host, 0) == -1) return 0;
- for (s=(void *)host; *s>=0x80 || *s=='.' || *s=='-' || isalnum(*s); s++);
- return !*s;
- }
-@@ -36,23 +37,9 @@ static int name_from_null(struct address buf[static 2], const char *name, int fa
- return cnt;
- }
-
--int __inet_aton(const char *, struct in_addr *);
--
- static int name_from_numeric(struct address buf[static 1], const char *name, int family)
- {
-- struct in_addr a4;
-- struct in6_addr a6;
-- if (family != AF_INET6 && __inet_aton(name, &a4)>0) {
-- memcpy(&buf[0].addr, &a4, sizeof a4);
-- buf[0].family = AF_INET;
-- return 1;
-- }
-- if (family != AF_INET && inet_pton(AF_INET6, name, &a6)>0) {
-- memcpy(&buf[0].addr, &a6, sizeof a6);
-- buf[0].family = AF_INET6;
-- return 1;
-- }
-- return 0;
-+ return __lookup_ipliteral(buf, name, family);
- }
-
- static int name_from_hosts(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family)
-@@ -110,11 +97,13 @@ static int dns_parse_callback(void *c, int rr, const void *data, int len, const
- case RR_A:
- if (len != 4) return -1;
- ctx->addrs[ctx->cnt].family = AF_INET;
-+ ctx->addrs[ctx->cnt].scopeid = 0;
- memcpy(ctx->addrs[ctx->cnt++].addr, data, 4);
- break;
- case RR_AAAA:
- if (len != 16) return -1;
- ctx->addrs[ctx->cnt].family = AF_INET6;
-+ ctx->addrs[ctx->cnt].scopeid = 0;
- memcpy(ctx->addrs[ctx->cnt++].addr, data, 16);
- break;
- case RR_CNAME:
-@@ -164,7 +153,7 @@ int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], c
- *canon = 0;
- if (name) {
- size_t l;
-- if ((l = strnlen(name, 256))-1 > 254)
-+ if ((l = strnlen(name, 254))-1 >= 253)
- return EAI_NONAME;
- memcpy(canon, name, l+1);
- }
-@@ -179,10 +168,10 @@ int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], c
-
- /* Try each backend until there's at least one result. */
- cnt = name_from_null(buf, name, family, flags);
-- if (cnt<=0) cnt = name_from_numeric(buf, name, family);
-- if (cnt<=0 && !(flags & AI_NUMERICHOST)) {
-+ if (!cnt) cnt = name_from_numeric(buf, name, family);
-+ if (!cnt && !(flags & AI_NUMERICHOST)) {
- cnt = name_from_hosts(buf, canon, name, family);
-- if (cnt<=0) cnt = name_from_dns(buf, canon, name, family);
-+ if (!cnt) cnt = name_from_dns(buf, canon, name, family);
- }
- if (cnt<=0) return cnt ? cnt : EAI_NONAME;
-
-@@ -204,7 +193,6 @@ int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], c
- if (buf[i].family != AF_INET) continue;
- memcpy(buf[i].addr+12, buf[i].addr, 4);
- memcpy(buf[i].addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
-- buf[i].scopeid = 0;
- buf[i].family = AF_INET6;
- }
- }
-diff --git a/src/network/res_mkquery.c b/src/network/res_mkquery.c
-index f7e4e9c..7c49709 100644
---- a/src/network/res_mkquery.c
-+++ b/src/network/res_mkquery.c
-@@ -10,9 +10,9 @@ int __res_mkquery(int op, const char *dname, int class, int type,
- int id, i, j;
- unsigned char q[280];
- struct timespec ts;
-- size_t l = strnlen(dname, 256);
-+ size_t l = strnlen(dname, 254);
-
-- if (l-1>=254 || buflen<18+l || op>15u || class>255u || type>255u)
-+ if (l-1>=253 || buflen<18+l || op>15u || class>255u || type>255u)
- return -1;
-
- /* Construct query template - ID will be filled later */
-diff --git a/src/network/res_msend.c b/src/network/res_msend.c
-index a5b7793..5192b4d 100644
---- a/src/network/res_msend.c
-+++ b/src/network/res_msend.c
-@@ -12,6 +12,7 @@
- #include <pthread.h>
- #include "stdio_impl.h"
- #include "syscall.h"
-+#include "lookup.h"
-
- static void cleanup(void *p)
- {
-@@ -47,6 +48,7 @@ int __res_msend(int nqueries, const unsigned char *const *queries,
- int cs;
- struct pollfd pfd;
- unsigned long t0, t1, t2;
-+ struct address iplit;
-
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
-
-@@ -76,13 +78,18 @@ int __res_msend(int nqueries, const unsigned char *const *queries,
- for (z=s; *z && !isspace(*z); z++);
- *z=0;
-
-- if (inet_pton(AF_INET, s, &ns[nns].sin.sin_addr)>0) {
-- ns[nns].sin.sin_port = htons(53);
-- ns[nns++].sin.sin_family = AF_INET;
-- } else if (inet_pton(AF_INET6, s, &ns[nns].sin6.sin6_addr)>0) {
-- sl = sizeof sa.sin6;
-- ns[nns].sin6.sin6_port = htons(53);
-- ns[nns++].sin6.sin6_family = family = AF_INET6;
-+ if (__lookup_ipliteral(&iplit, s, AF_UNSPEC)>0) {
-+ if (iplit.family == AF_INET) {
-+ memcpy(&ns[nns].sin.sin_addr, iplit.addr, 4);
-+ ns[nns].sin.sin_port = htons(53);
-+ ns[nns++].sin.sin_family = AF_INET;
-+ } else {
-+ sl = sizeof sa.sin6;
-+ memcpy(&ns[nns].sin6.sin6_addr, iplit.addr, 16);
-+ ns[nns].sin6.sin6_port = htons(53);
-+ ns[nns].sin6.sin6_scope_id = iplit.scopeid;
-+ ns[nns++].sin6.sin6_family = family = AF_INET6;
-+ }
- }
- }
- if (f) __fclose_ca(f);
-diff --git a/src/network/res_querydomain.c b/src/network/res_querydomain.c
-index c746dbe..8ba31f4 100644
---- a/src/network/res_querydomain.c
-+++ b/src/network/res_querydomain.c
-@@ -3,10 +3,10 @@
-
- int res_querydomain(const char *name, const char *domain, int class, int type, unsigned char *dest, int len)
- {
-- char tmp[256];
-- size_t nl = strnlen(name, 256);
-- size_t dl = strnlen(domain, 256);
-- if (nl+dl+1 > 255) return -1;
-+ char tmp[254];
-+ size_t nl = strnlen(name, 254);
-+ size_t dl = strnlen(domain, 254);
-+ if (nl+dl+1 > 253) return -1;
- memcpy(tmp, name, nl);
- tmp[nl] = '.';
- memcpy(tmp+nl+1, domain, dl+1);
-diff --git a/src/stdio/vasprintf.c b/src/stdio/vasprintf.c
-index 68b7246..08251bc 100644
---- a/src/stdio/vasprintf.c
-+++ b/src/stdio/vasprintf.c
-@@ -3,26 +3,13 @@
- #include <stdarg.h>
- #include <stdlib.h>
-
--#define GUESS 240U
--
- int vasprintf(char **s, const char *fmt, va_list ap)
- {
- va_list ap2;
-- char *a;
-- int l=GUESS;
--
-- if (!(a=malloc(GUESS))) return -1;
--
- va_copy(ap2, ap);
-- l=vsnprintf(a, GUESS, fmt, ap2);
-+ int l = vsnprintf(0, 0, fmt, ap2);
- va_end(ap2);
-
-- if (l<GUESS) {
-- char *b = realloc(a, l+1U);
-- *s = b ? b : a;
-- return l;
-- }
-- free(a);
- if (l<0 || !(*s=malloc(l+1U))) return -1;
- return vsnprintf(*s, l+1U, fmt, ap);
- }