gethostname.c: change to report ENAMETOOLONG error when buflen is less
change to behaviour the same as glibc for the check about buflen
Change-Id: I98265a8fe441df6fed2527686f89b087364ca53d
Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
diff --git a/libc/Android.mk b/libc/Android.mk
index 893738a..345a1f3 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -43,7 +43,6 @@
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 @@
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 5d3d7d9..962fea1 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 <errno.h>
-#include <unistd.h>
#include <string.h>
#include <sys/utsname.h>
+#include <unistd.h>
-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<size_t>(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 a5b92f8..19d4017 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -482,21 +482,23 @@
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";
}