summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authorsbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-20 00:09:56 +0000
committersbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-20 00:09:56 +0000
commit17be4a36a7fb77e324ec771dc43de76a53f6f02b (patch)
tree283e5ade61be376fa9b0e01d7eaed64e5b6483fc /native_client_sdk
parenta20aa5a9d6d68b1ffc72ee628e21a8d60c00fce2 (diff)
downloadchromium_src-17be4a36a7fb77e324ec771dc43de76a53f6f02b.zip
chromium_src-17be4a36a7fb77e324ec771dc43de76a53f6f02b.tar.gz
chromium_src-17be4a36a7fb77e324ec771dc43de76a53f6f02b.tar.bz2
[NaCl SDK] nacl_io: Fix bug in getaddrinfo() where service is "0"
Add a test for this case. TEST=unit tests BUG=386220 R=binji@chromium.org, bradnelson@google.com Review URL: https://codereview.chromium.org/344833005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278543 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
-rw-r--r--native_client_sdk/src/libraries/nacl_io/host_resolver.cc7
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc30
2 files changed, 35 insertions, 2 deletions
diff --git a/native_client_sdk/src/libraries/nacl_io/host_resolver.cc b/native_client_sdk/src/libraries/nacl_io/host_resolver.cc
index b8100a7..c16fbcb 100644
--- a/native_client_sdk/src/libraries/nacl_io/host_resolver.cc
+++ b/native_client_sdk/src/libraries/nacl_io/host_resolver.cc
@@ -2,9 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+#endif
+
#include "nacl_io/host_resolver.h"
#include <assert.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -231,7 +236,7 @@ int HostResolver::getaddrinfo(const char* node,
if (service != NULL) {
char* cp;
port = strtol(service, &cp, 10);
- if (port > 0 && port <= 65535 && *cp == '\0') {
+ if (port >= 0 && port <= UINT16_MAX && *cp == '\0') {
port = htons(port);
} else {
return EAI_SERVICE;
diff --git a/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc b/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
index fab3ec5..3aaec27 100644
--- a/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
+++ b/native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc
@@ -89,7 +89,7 @@ TEST_F(HostResolverTest, Getaddrinfo_Numeric) {
struct sockaddr_in* in;
struct addrinfo hints;
- // Numberic only
+ // Numeric only
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
@@ -107,6 +107,34 @@ TEST_F(HostResolverTest, Getaddrinfo_Numeric) {
ki_freeaddrinfo(ai);
}
+TEST_F(HostResolverTest, Getaddrinfo_NumericService) {
+ struct addrinfo* ai = NULL;
+ struct sockaddr_in* in;
+ struct addrinfo hints;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+
+ ASSERT_EQ(0, ki_getaddrinfo("1.2.3.4", "0", &hints, &ai));
+ ASSERT_NE(NULL_INFO, ai);
+ ASSERT_NE(NULL_ADDR, ai->ai_addr);
+ in = (struct sockaddr_in*)ai->ai_addr;
+ uint16_t expected_port = htons(0);
+ ASSERT_EQ(expected_port, in->sin_port);
+ ASSERT_EQ(NULL_INFO, ai->ai_next);
+ ki_freeaddrinfo(ai);
+
+ ASSERT_EQ(0, ki_getaddrinfo("1.2.3.4", "65000", &hints, &ai));
+ ASSERT_NE(NULL_INFO, ai);
+ ASSERT_NE(NULL_ADDR, ai->ai_addr);
+ in = (struct sockaddr_in*)ai->ai_addr;
+ expected_port = htons(65000);
+ ASSERT_EQ(expected_port, in->sin_port);
+ ASSERT_EQ(NULL_INFO, ai->ai_next);
+ ki_freeaddrinfo(ai);
+}
+
TEST_F(HostResolverTest, Getaddrinfo_MissingPPAPI) {
// Verify that full lookups fail due to lack of PPAPI interfaces
struct addrinfo* ai = NULL;