diff --git a/libc/Android.mk b/libc/Android.mk index 893738ae0..345a1f3f0 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -43,7 +43,6 @@ libc_common_src_files := \ bionic/ether_aton.c \ bionic/ether_ntoa.c \ bionic/fts.c \ - bionic/gethostname.c \ bionic/getpriority.c \ bionic/if_indextoname.c \ bionic/if_nametoindex.c \ @@ -120,6 +119,7 @@ libc_bionic_src_files := \ bionic/getauxval.cpp \ bionic/getcwd.cpp \ bionic/getentropy_linux.c \ + bionic/gethostname.cpp \ bionic/getpgrp.cpp \ bionic/getpid.cpp \ bionic/gettid.cpp \ diff --git a/libc/bionic/gethostname.c b/libc/bionic/gethostname.cpp similarity index 78% rename from libc/bionic/gethostname.c rename to libc/bionic/gethostname.cpp index 5d3d7d962..962fea1b1 100644 --- a/libc/bionic/gethostname.c +++ b/libc/bionic/gethostname.cpp @@ -25,27 +25,24 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ + #include -#include #include #include +#include -int gethostname(char* buff, size_t buflen) -{ - struct utsname name; - int result = 0; +int gethostname(char* buf, size_t n) { + struct utsname name; + if (uname(&name) == -1) { + return -1; + } - result = uname(&name); - if (result != -1) - { - int namelen = strlen(name.nodename); + size_t name_length = static_cast(strlen(name.nodename) + 1); + if (name_length > n) { + errno = ENAMETOOLONG; + return -1; + } - if ((int)buflen < namelen+1) { - errno = EINVAL; - result = -1; - } else { - memcpy( buff, name.nodename, namelen+1 ); - } - } - return result; + memcpy(buf, name.nodename, name_length); + return 0; } diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index a5b92f8e0..19d401773 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -482,21 +482,23 @@ TEST(unistd, sethostname) { TEST(unistd, gethostname) { char hostname[HOST_NAME_MAX + 1]; - memset(hostname, 0, sizeof(hostname)); + // Can we get the hostname with a big buffer? ASSERT_EQ(0, gethostname(hostname, HOST_NAME_MAX)); + + // Can we get the hostname with a right-sized buffer? + errno = 0; + ASSERT_EQ(0, gethostname(hostname, strlen(hostname) + 1)); + + // Does uname(2) agree? utsname buf; ASSERT_EQ(0, uname(&buf)); ASSERT_EQ(0, strncmp(hostname, buf.nodename, SYS_NMLN)); ASSERT_GT(strlen(hostname), 0U); + // Do we correctly detect truncation? errno = 0; ASSERT_EQ(-1, gethostname(hostname, strlen(hostname))); ASSERT_EQ(ENAMETOOLONG, errno); - - errno = 0; - ASSERT_EQ(0, gethostname(hostname, -2)); - ASSERT_EQ(0, errno); - GTEST_LOG_(INFO) << "hostname=" << hostname << "\n"; }