aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0067-don-t-treat-numeric-port-strings-as-servent-records-.patch
diff options
context:
space:
mode:
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-.patch73
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
+