@@ -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