From 935d855b47978395b1b007da83a2493ead709ebb Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 5 Apr 2017 11:20:22 +0200 Subject: [PATCH] util: indicate truncated Unix socket path in UTI_SockaddrToString() Specify the maximum length of the path in the snprintf() format to avoid a new gcc warning (-Wformat-truncation). If the path doesn't fit in the buffer, indicate with the '>' symbol that it was truncated. The function is used only for debug messages. --- test/unit/util.c | 17 ++++++++++++++++- util.c | 8 ++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/test/unit/util.c b/test/unit/util.c index 5cd9badd..43f6214e 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 a7610c5b..c336e36f 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]"); -- 2.47.3