summaryrefslogtreecommitdiff
path: root/ext/socket/raddrinfo.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-14 10:11:01 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-14 10:11:01 +0000
commit2f8d3280e0bbbf6d964d84ab4ae9456a1e8e8eb0 (patch)
tree60ce42aa5876ecbcf9f07326d67172d06212dbc7 /ext/socket/raddrinfo.c
parent11aa7c9604055b252c5d84c6b8cb5e95be7bfafa (diff)
* ext/socket/raddrinfo.c (parse_numeric_port): Detect
port overflow. (numeric_getaddrinfo): Use parse_numeric_port. numeric_getaddrinfo fails if port is too big now. This makes rb_getaddrinfo invokes the real getaddrinfo() on such condition. This change is related to [ruby-core:69355] [Bug #11179]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50890 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/raddrinfo.c')
-rw-r--r--ext/socket/raddrinfo.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c
index caa08fe..370ea69 100644
--- a/ext/socket/raddrinfo.c
+++ b/ext/socket/raddrinfo.c
@@ -154,6 +154,32 @@ struct getaddrinfo_arg
struct addrinfo **res;
};
+static int
+parse_numeric_port(const char *service, int *portp)
+{
+ unsigned long u;
+
+ if (!service) {
+ *portp = 0;
+ return 1;
+ }
+
+ if (strspn(service, "0123456789") != strlen(service))
+ return 0;
+
+ errno = 0;
+ u = STRTOUL(service, NULL, 10);
+ if (errno)
+ return 0;
+
+ if (0x10000 <= u)
+ return 0;
+
+ *portp = u;
+
+ return 1;
+}
+
static void *
nogvl_getaddrinfo(void *arg)
{
@@ -181,7 +207,9 @@ numeric_getaddrinfo(const char *node, const char *service,
# define inet_pton(f,s,d) rb_w32_inet_pton(f,s,d)
# endif
- if (node && (!service || strspn(service, "0123456789") == strlen(service))) {
+ int port;
+
+ if (node && parse_numeric_port(service, &port)) {
static const struct {
int socktype;
int protocol;
@@ -191,7 +219,6 @@ numeric_getaddrinfo(const char *node, const char *service,
{ SOCK_RAW, 0 }
};
struct addrinfo *ai = NULL;
- int port = service ? (unsigned short)atoi(service): 0;
int hint_family = hints ? hints->ai_family : PF_UNSPEC;
int hint_socktype = hints ? hints->ai_socktype : 0;
int hint_protocol = hints ? hints->ai_protocol : 0;