From 50ac971840bcc9d82b82de08a6a524c4fcbd2480 Mon Sep 17 00:00:00 2001 From: Old-Ding Date: Mon, 6 Jul 2026 05:25:10 +0800 Subject: [PATCH] examples: fix local socket address lengths The udgram and ustream examples used sizeof(CONFIG_EXAMPLES_*_ADDR) as the pathname length and then added another NUL byte to the sockaddr length. That made the maximum address length one byte larger than struct sockaddr_un, and ustream also wrote a terminator at sun_path[UNIX_PATH_MAX]. Track the pathname length with strnlen(), copy with room for the terminator, and pass sizeof(sa_family_t) + addrlen + 1 to the socket calls. Signed-off-by: Old-Ding --- examples/udgram/udgram_client.c | 8 ++------ examples/udgram/udgram_server.c | 8 ++------ examples/ustream/ustream_client.c | 9 ++------- examples/ustream/ustream_server.c | 9 ++------- 4 files changed, 8 insertions(+), 26 deletions(-) diff --git a/examples/udgram/udgram_client.c b/examples/udgram/udgram_client.c index f60abedf619..3b6f96cfde5 100644 --- a/examples/udgram/udgram_client.c +++ b/examples/udgram/udgram_client.c @@ -91,14 +91,10 @@ int main(int argc, FAR char *argv[]) /* Set up the server address */ - addrlen = sizeof(CONFIG_EXAMPLES_UDGRAM_ADDR); - if (addrlen > UNIX_PATH_MAX) - { - addrlen = UNIX_PATH_MAX; - } + addrlen = strnlen(CONFIG_EXAMPLES_UDGRAM_ADDR, UNIX_PATH_MAX - 1); server.sun_family = AF_LOCAL; - strlcpy(server.sun_path, CONFIG_EXAMPLES_UDGRAM_ADDR, addrlen); + strlcpy(server.sun_path, CONFIG_EXAMPLES_UDGRAM_ADDR, addrlen + 1); addrlen += sizeof(sa_family_t) + 1; diff --git a/examples/udgram/udgram_server.c b/examples/udgram/udgram_server.c index 49674ff3619..116a227ec1e 100644 --- a/examples/udgram/udgram_server.c +++ b/examples/udgram/udgram_server.c @@ -93,14 +93,10 @@ int main(int argc, FAR char *argv[]) /* Bind the socket to a local address */ - addrlen = sizeof(CONFIG_EXAMPLES_UDGRAM_ADDR); - if (addrlen > UNIX_PATH_MAX) - { - addrlen = UNIX_PATH_MAX; - } + addrlen = strnlen(CONFIG_EXAMPLES_UDGRAM_ADDR, UNIX_PATH_MAX - 1); server.sun_family = AF_LOCAL; - strlcpy(server.sun_path, CONFIG_EXAMPLES_UDGRAM_ADDR, addrlen); + strlcpy(server.sun_path, CONFIG_EXAMPLES_UDGRAM_ADDR, addrlen + 1); addrlen += sizeof(sa_family_t) + 1; diff --git a/examples/ustream/ustream_client.c b/examples/ustream/ustream_client.c index c7e69a56b34..2871f1a93d5 100644 --- a/examples/ustream/ustream_client.c +++ b/examples/ustream/ustream_client.c @@ -80,15 +80,10 @@ int main(int argc, FAR char *argv[]) /* Connect the socket to the server */ - addrlen = sizeof(CONFIG_EXAMPLES_USTREAM_ADDR); - if (addrlen > UNIX_PATH_MAX) - { - addrlen = UNIX_PATH_MAX; - } + addrlen = strnlen(CONFIG_EXAMPLES_USTREAM_ADDR, UNIX_PATH_MAX - 1); myaddr.sun_family = AF_LOCAL; - strlcpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen); - myaddr.sun_path[addrlen] = '\0'; + strlcpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen + 1); printf("client: Connecting to %s...\n", CONFIG_EXAMPLES_USTREAM_ADDR); addrlen += sizeof(sa_family_t) + 1; diff --git a/examples/ustream/ustream_server.c b/examples/ustream/ustream_server.c index 8f6fffe406c..fb420113233 100644 --- a/examples/ustream/ustream_server.c +++ b/examples/ustream/ustream_server.c @@ -80,15 +80,10 @@ int main(int argc, char *argv[]) /* Bind the socket to a local address */ - addrlen = sizeof(CONFIG_EXAMPLES_USTREAM_ADDR); - if (addrlen > UNIX_PATH_MAX) - { - addrlen = UNIX_PATH_MAX; - } + addrlen = strnlen(CONFIG_EXAMPLES_USTREAM_ADDR, UNIX_PATH_MAX - 1); myaddr.sun_family = AF_LOCAL; - strlcpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen); - myaddr.sun_path[addrlen] = '\0'; + strlcpy(myaddr.sun_path, CONFIG_EXAMPLES_USTREAM_ADDR, addrlen + 1); addrlen += sizeof(sa_family_t) + 1; ret = bind(listensd, (struct sockaddr *)&myaddr, addrlen);