Loading fs/ksmbd/smb2pdu.c +12 −10 Original line number Original line Diff line number Diff line Loading @@ -7241,15 +7241,10 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, struct sockaddr_storage_rsp *sockaddr_storage; struct sockaddr_storage_rsp *sockaddr_storage; unsigned int flags; unsigned int flags; unsigned long long speed; unsigned long long speed; struct sockaddr_in6 *csin6 = (struct sockaddr_in6 *)&conn->peer_addr; rtnl_lock(); rtnl_lock(); for_each_netdev(&init_net, netdev) { for_each_netdev(&init_net, netdev) { if (out_buf_len < bool ipv4_set = false; nbytes + sizeof(struct network_interface_info_ioctl_rsp)) { rtnl_unlock(); return -ENOSPC; } if (netdev->type == ARPHRD_LOOPBACK) if (netdev->type == ARPHRD_LOOPBACK) continue; continue; Loading @@ -7257,6 +7252,12 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, flags = dev_get_flags(netdev); flags = dev_get_flags(netdev); if (!(flags & IFF_RUNNING)) if (!(flags & IFF_RUNNING)) continue; continue; ipv6_retry: if (out_buf_len < nbytes + sizeof(struct network_interface_info_ioctl_rsp)) { rtnl_unlock(); return -ENOSPC; } nii_rsp = (struct network_interface_info_ioctl_rsp *) nii_rsp = (struct network_interface_info_ioctl_rsp *) &rsp->Buffer[nbytes]; &rsp->Buffer[nbytes]; Loading Loading @@ -7289,8 +7290,7 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, nii_rsp->SockAddr_Storage; nii_rsp->SockAddr_Storage; memset(sockaddr_storage, 0, 128); memset(sockaddr_storage, 0, 128); if (conn->peer_addr.ss_family == PF_INET || if (!ipv4_set) { ipv6_addr_v4mapped(&csin6->sin6_addr)) { struct in_device *idev; struct in_device *idev; sockaddr_storage->Family = cpu_to_le16(INTERNETWORK); sockaddr_storage->Family = cpu_to_le16(INTERNETWORK); Loading @@ -7301,6 +7301,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, continue; continue; sockaddr_storage->addr4.IPv4address = sockaddr_storage->addr4.IPv4address = idev_ipv4_address(idev); idev_ipv4_address(idev); nbytes += sizeof(struct network_interface_info_ioctl_rsp); ipv4_set = true; goto ipv6_retry; } else { } else { struct inet6_dev *idev6; struct inet6_dev *idev6; struct inet6_ifaddr *ifa; struct inet6_ifaddr *ifa; Loading @@ -7322,10 +7325,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, break; break; } } sockaddr_storage->addr6.ScopeId = 0; sockaddr_storage->addr6.ScopeId = 0; } nbytes += sizeof(struct network_interface_info_ioctl_rsp); nbytes += sizeof(struct network_interface_info_ioctl_rsp); } } } rtnl_unlock(); rtnl_unlock(); /* zero if this is last one */ /* zero if this is last one */ Loading Loading
fs/ksmbd/smb2pdu.c +12 −10 Original line number Original line Diff line number Diff line Loading @@ -7241,15 +7241,10 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, struct sockaddr_storage_rsp *sockaddr_storage; struct sockaddr_storage_rsp *sockaddr_storage; unsigned int flags; unsigned int flags; unsigned long long speed; unsigned long long speed; struct sockaddr_in6 *csin6 = (struct sockaddr_in6 *)&conn->peer_addr; rtnl_lock(); rtnl_lock(); for_each_netdev(&init_net, netdev) { for_each_netdev(&init_net, netdev) { if (out_buf_len < bool ipv4_set = false; nbytes + sizeof(struct network_interface_info_ioctl_rsp)) { rtnl_unlock(); return -ENOSPC; } if (netdev->type == ARPHRD_LOOPBACK) if (netdev->type == ARPHRD_LOOPBACK) continue; continue; Loading @@ -7257,6 +7252,12 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, flags = dev_get_flags(netdev); flags = dev_get_flags(netdev); if (!(flags & IFF_RUNNING)) if (!(flags & IFF_RUNNING)) continue; continue; ipv6_retry: if (out_buf_len < nbytes + sizeof(struct network_interface_info_ioctl_rsp)) { rtnl_unlock(); return -ENOSPC; } nii_rsp = (struct network_interface_info_ioctl_rsp *) nii_rsp = (struct network_interface_info_ioctl_rsp *) &rsp->Buffer[nbytes]; &rsp->Buffer[nbytes]; Loading Loading @@ -7289,8 +7290,7 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, nii_rsp->SockAddr_Storage; nii_rsp->SockAddr_Storage; memset(sockaddr_storage, 0, 128); memset(sockaddr_storage, 0, 128); if (conn->peer_addr.ss_family == PF_INET || if (!ipv4_set) { ipv6_addr_v4mapped(&csin6->sin6_addr)) { struct in_device *idev; struct in_device *idev; sockaddr_storage->Family = cpu_to_le16(INTERNETWORK); sockaddr_storage->Family = cpu_to_le16(INTERNETWORK); Loading @@ -7301,6 +7301,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, continue; continue; sockaddr_storage->addr4.IPv4address = sockaddr_storage->addr4.IPv4address = idev_ipv4_address(idev); idev_ipv4_address(idev); nbytes += sizeof(struct network_interface_info_ioctl_rsp); ipv4_set = true; goto ipv6_retry; } else { } else { struct inet6_dev *idev6; struct inet6_dev *idev6; struct inet6_ifaddr *ifa; struct inet6_ifaddr *ifa; Loading @@ -7322,10 +7325,9 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn, break; break; } } sockaddr_storage->addr6.ScopeId = 0; sockaddr_storage->addr6.ScopeId = 0; } nbytes += sizeof(struct network_interface_info_ioctl_rsp); nbytes += sizeof(struct network_interface_info_ioctl_rsp); } } } rtnl_unlock(); rtnl_unlock(); /* zero if this is last one */ /* zero if this is last one */ Loading