diff --git a/test/unit/util.c b/test/unit/util.c index 5cd9bad..43f6214 100644 --- a/test/unit/util.c +++ b/test/unit/util.c @@ -4,10 +4,11 @@ void test_unit(void) { NTP_int64 ntp_ts, ntp_fuzz; struct timespec ts, ts2; + struct sockaddr_un sun; double x, y; Float f; int i, j, c; - char buf[16]; + char buf[16], *s; for (i = -31; i < 31; i++) { x = pow(2.0, i); @@ -145,4 +146,18 @@ void test_unit(void) { c++; } TEST_CHECK(c > 46000 && c < 48000); + + for (i = 1; i < 2 * BUFFER_LENGTH; i++) { + sun.sun_family = AF_UNIX; + for (j = 0; j + 1 < i && j + 1 < sizeof (sun.sun_path); j++) + sun.sun_path[j] = 'A' + j % 26; + sun.sun_path[j] = '\0'; + s = UTI_SockaddrToString((struct sockaddr *)&sun); + if (i <= BUFFER_LENGTH) { + TEST_CHECK(!strcmp(s, sun.sun_path)); + } else { + TEST_CHECK(!strncmp(s, sun.sun_path, BUFFER_LENGTH - 2)); + TEST_CHECK(s[BUFFER_LENGTH - 2] == '>'); + } + } } diff --git a/util.c b/util.c index a7610c5..c336e36 100644 --- a/util.c +++ b/util.c @@ -558,7 +558,7 @@ char *UTI_SockaddrToString(struct sockaddr *sa) { unsigned short port; IPAddr ip; - char *result; + char *result, *sun_path; result = NEXT_BUFFER; @@ -571,7 +571,11 @@ char *UTI_SockaddrToString(struct sockaddr *sa) snprintf(result, BUFFER_LENGTH, "%s:%hu", UTI_IPToString(&ip), port); break; case AF_UNIX: - snprintf(result, BUFFER_LENGTH, "%s", ((struct sockaddr_un *)sa)->sun_path); + sun_path = ((struct sockaddr_un *)sa)->sun_path; + snprintf(result, BUFFER_LENGTH, "%.*s", BUFFER_LENGTH - 1, sun_path); + /* Indicate truncated path */ + if (strlen(sun_path) >= BUFFER_LENGTH) + result[BUFFER_LENGTH - 2] = '>'; break; default: snprintf(result, BUFFER_LENGTH, "[UNKNOWN]");