diff options
Diffstat (limited to 'main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch')
-rw-r--r-- | main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch b/main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch new file mode 100644 index 0000000000..8e5fd0068e --- /dev/null +++ b/main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch @@ -0,0 +1,73 @@ +From 565dbee24d4bf55728be1c274fca1e7f3196fd73 Mon Sep 17 00:00:00 2001 +From: Rich Felker <dalias@aerifal.cx> +Date: Wed, 6 Sep 2017 21:42:15 -0400 +Subject: [PATCH 25/30] don't treat numeric port strings as servent records in + getservby*() + +some applications use getservbyport to find port numbers that are not +assigned to a service; if getservbyport always succeeds with a numeric +string as the result, they fail to find any available ports. + +POSIX doesn't seem to mandate the behavior one way or another. it +specifies an abstract service database, which an implementation could +define to include numeric port strings, but it makes more sense to +align behavior with traditional implementations. + +based on patch by A. Wilcox. the original patch only changed +getservbyport[_r]. to maintain a consistent view of the "service +database", I have also modified getservbyname[_r] to exclude numeric +port strings. +--- + src/network/getservbyname_r.c | 6 ++++++ + src/network/getservbyport_r.c | 4 ++++ + 2 files changed, 10 insertions(+) + +diff --git a/src/network/getservbyname_r.c b/src/network/getservbyname_r.c +index ad3d6164..cad6317a 100644 +--- a/src/network/getservbyname_r.c ++++ b/src/network/getservbyname_r.c +@@ -5,6 +5,7 @@ + #include <inttypes.h> + #include <errno.h> + #include <string.h> ++#include <stdlib.h> + #include "lookup.h" + + #define ALIGN (sizeof(struct { char a; char *b; }) - sizeof(char *)) +@@ -17,6 +18,11 @@ int getservbyname_r(const char *name, const char *prots, + + *res = 0; + ++ /* Don't treat numeric port number strings as service records. */ ++ char *end = ""; ++ strtoul(name, &end, 10); ++ if (!*end) return ENOENT; ++ + /* Align buffer */ + align = -(uintptr_t)buf & ALIGN-1; + if (buflen < 2*sizeof(char *)+align) +diff --git a/src/network/getservbyport_r.c b/src/network/getservbyport_r.c +index 0ae0e415..b7f21c6b 100644 +--- a/src/network/getservbyport_r.c ++++ b/src/network/getservbyport_r.c +@@ -5,6 +5,7 @@ + #include <inttypes.h> + #include <errno.h> + #include <string.h> ++#include <stdlib.h> + + int getservbyport_r(int port, const char *prots, + struct servent *se, char *buf, size_t buflen, struct servent **res) +@@ -51,6 +52,9 @@ int getservbyport_r(int port, const char *prots, + break; + } + ++ /* A numeric port string is not a service record. */ ++ if (strtol(buf, 0, 10)==ntohs(port)) return ENOENT; ++ + *res = se; + return 0; + } +-- +2.13.3 + |