diff options
author | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-20 00:09:56 +0000 |
---|---|---|
committer | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-20 00:09:56 +0000 |
commit | 17be4a36a7fb77e324ec771dc43de76a53f6f02b (patch) | |
tree | 283e5ade61be376fa9b0e01d7eaed64e5b6483fc /native_client_sdk | |
parent | a20aa5a9d6d68b1ffc72ee628e21a8d60c00fce2 (diff) | |
download | chromium_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.cc | 7 | ||||
-rw-r--r-- | native_client_sdk/src/tests/nacl_io_test/host_resolver_test.cc | 30 |
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; |