Skip to content

Commit 39ab0bb

Browse files
jukkarfabiobaltieri
authored andcommitted
net: sockets: Fix getsockname() for TCP
The local address used for established TCP socket needs to be dig out from TCP internals and not from context->local. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
1 parent c6c021b commit 39ab0bb

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

subsys/net/lib/sockets/sockets.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3484,6 +3484,7 @@ int zsock_getsockname_ctx(struct net_context *ctx, struct sockaddr *addr,
34843484
socklen_t *addrlen)
34853485
{
34863486
socklen_t newlen = 0;
3487+
int ret;
34873488

34883489
if (IS_ENABLED(CONFIG_NET_IPV4) && ctx->local.family == AF_INET) {
34893490
struct sockaddr_in addr4 = { 0 };
@@ -3492,27 +3493,33 @@ int zsock_getsockname_ctx(struct net_context *ctx, struct sockaddr *addr,
34923493
SET_ERRNO(-EINVAL);
34933494
}
34943495

3495-
addr4.sin_family = AF_INET;
3496-
addr4.sin_port = net_sin_ptr(&ctx->local)->sin_port;
3497-
memcpy(&addr4.sin_addr, net_sin_ptr(&ctx->local)->sin_addr,
3498-
sizeof(struct in_addr));
34993496
newlen = sizeof(struct sockaddr_in);
35003497

3498+
ret = net_context_get_local_addr(ctx,
3499+
(struct sockaddr *)&addr4,
3500+
&newlen);
3501+
if (ret < 0) {
3502+
SET_ERRNO(-ret);
3503+
}
3504+
35013505
memcpy(addr, &addr4, MIN(*addrlen, newlen));
3502-
} else if (IS_ENABLED(CONFIG_NET_IPV6) &&
3503-
ctx->local.family == AF_INET6) {
3506+
3507+
} else if (IS_ENABLED(CONFIG_NET_IPV6) && ctx->local.family == AF_INET6) {
35043508
struct sockaddr_in6 addr6 = { 0 };
35053509

35063510
if (net_sin6_ptr(&ctx->local)->sin6_addr == NULL) {
35073511
SET_ERRNO(-EINVAL);
35083512
}
35093513

3510-
addr6.sin6_family = AF_INET6;
3511-
addr6.sin6_port = net_sin6_ptr(&ctx->local)->sin6_port;
3512-
memcpy(&addr6.sin6_addr, net_sin6_ptr(&ctx->local)->sin6_addr,
3513-
sizeof(struct in6_addr));
35143514
newlen = sizeof(struct sockaddr_in6);
35153515

3516+
ret = net_context_get_local_addr(ctx,
3517+
(struct sockaddr *)&addr6,
3518+
&newlen);
3519+
if (ret < 0) {
3520+
SET_ERRNO(-ret);
3521+
}
3522+
35163523
memcpy(addr, &addr6, MIN(*addrlen, newlen));
35173524
} else {
35183525
SET_ERRNO(-EINVAL);

0 commit comments

Comments
 (0)