diff options
author | Gordon Ross <gwr@nexenta.com> | 2015-05-29 15:14:19 -0400 |
---|---|---|
committer | Gordon Ross <gwr@nexenta.com> | 2015-10-04 11:58:43 -0400 |
commit | 49b5df1eac768235abeb210f61310e88b7d172b6 (patch) | |
tree | 5aca9ad9f15a873e1e21455656a962974a70cadd /usr/src | |
parent | a851ffc82d02870137b4065c395d79bec1172c32 (diff) | |
download | illumos-gate-49b5df1eac768235abeb210f61310e88b7d172b6.tar.gz |
6026 Zero-padded IP address strings returned by SMB
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/common/smbsrv/smb_inet.c | 21 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_negotiate.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_session.c | 38 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_ktypes.h | 3 |
4 files changed, 27 insertions, 39 deletions
diff --git a/usr/src/common/smbsrv/smb_inet.c b/usr/src/common/smbsrv/smb_inet.c index 2d56870fda..db3a38fa50 100644 --- a/usr/src/common/smbsrv/smb_inet.c +++ b/usr/src/common/smbsrv/smb_inet.c @@ -104,8 +104,25 @@ smb_inet_ntop(smb_inaddr_t *addr, char *buf, int size) /* Lint avoidance. */ #if !defined(_KERNEL) size_t sz = (size_t)size; -#else +#else /* _KERNEL */ int sz = size; -#endif + + /* + * Until uts/common/inet/ip/inet_ntop.c is fixed so it + * no longer uses leading zeros printing IPv4 addresses, + * we need to handle IPv4 ourselves. If we leave the + * leading zeros, Windows clients get errors trying to + * resolve those address strings to names. After: + * https://www.illumos.org/issues/5980 is fixed, + * this work-around can be removed. + */ + if (addr->a_family == AF_INET) { + uint8_t *p = (void *) &addr->a_ipv4; + (void) snprintf(buf, size, "%d.%d.%d.%d", + p[0], p[1], p[2], p[3]); + return (buf); + } +#endif /* _KERNEL */ + return ((char *)inet_ntop(addr->a_family, addr, buf, sz)); } diff --git a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c index 46bd2964ad..d774c07b48 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c +++ b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c @@ -284,7 +284,6 @@ smb_com_negotiate(smb_request_t *sr) uint16_t secmode; uint16_t rawmode = 0; uint32_t sesskey; - char ipaddr_buf[INET6_ADDRSTRLEN]; char *nbdomain; uint8_t *wcbuf; int wclen; @@ -334,9 +333,6 @@ smb_com_negotiate(smb_request_t *sr) (negprot->ni_capabilities & CAP_INFOLEVEL_PASSTHRU) ? "enabled" : "disabled"); - (void) smb_inet_ntop(&sr->session->ipaddr, ipaddr_buf, - SMB_IPSTRLEN(sr->session->ipaddr.a_family)); - switch (negprot->ni_dialect) { case PC_NETWORK_PROGRAM_1_0: /* core */ (void) ksocket_setsockopt(sr->session->sock, SOL_SOCKET, diff --git a/usr/src/uts/common/fs/smbsrv/smb_session.c b/usr/src/uts/common/fs/smbsrv/smb_session.c index 0ce893970d..d084a3f29b 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_session.c +++ b/usr/src/uts/common/fs/smbsrv/smb_session.c @@ -51,7 +51,6 @@ static smb_user_t *smb_session_lookup_user(smb_session_t *, char *, char *); static smb_tree_t *smb_session_get_tree(smb_session_t *, smb_tree_t *); static void smb_session_logoff(smb_session_t *); static void smb_request_init_command_mbuf(smb_request_t *sr); -void dump_smb_inaddr(smb_inaddr_t *ipaddr); static void smb_session_genkey(smb_session_t *); void @@ -290,8 +289,8 @@ smb_session_xprt_gethdr(smb_session_t *session, smb_xprt_t *ret_hdr) ret_hdr->xh_type = buf[0]; if (ret_hdr->xh_type != 0) { - cmn_err(CE_WARN, "invalid type (%u)", ret_hdr->xh_type); - dump_smb_inaddr(&session->ipaddr); + cmn_err(CE_WARN, "invalid NBT type (%u) from %s", + ret_hdr->xh_type, session->ip_addr_str); return (EPROTO); } @@ -302,7 +301,6 @@ smb_session_xprt_gethdr(smb_session_t *session, smb_xprt_t *ret_hdr) default: cmn_err(CE_WARN, "invalid port %u", session->s_local_port); - dump_smb_inaddr(&session->ipaddr); return (EPROTO); } @@ -339,7 +337,6 @@ smb_session_xprt_puthdr(smb_session_t *session, smb_xprt_t *hdr, default: cmn_err(CE_WARN, "invalid port %u", session->s_local_port); - dump_smb_inaddr(&session->ipaddr); return (-1); } @@ -688,6 +685,8 @@ smb_session_create(ksocket_t new_so, uint16_t port, smb_server_t *sv, session->local_ipaddr.a_family = family; session->s_local_port = port; session->sock = new_so; + (void) smb_inet_ntop(&session->ipaddr, + session->ip_addr_str, INET6_ADDRSTRLEN); if (port == IPPORT_NETBIOS_SSN) smb_server_inc_nbt_sess(sv); else @@ -1253,12 +1252,6 @@ smb_session_logoff(smb_session_t *session) void smb_session_getclient(smb_session_t *sn, char *buf, size_t buflen) { - char ipbuf[INET6_ADDRSTRLEN]; - smb_inaddr_t *ipaddr; - - ASSERT(sn); - ASSERT(buf); - ASSERT(buflen); *buf = '\0'; @@ -1267,9 +1260,7 @@ smb_session_getclient(smb_session_t *sn, char *buf, size_t buflen) return; } - ipaddr = &sn->ipaddr; - if (smb_inet_ntop(ipaddr, ipbuf, SMB_IPSTRLEN(ipaddr->a_family))) - (void) strlcpy(buf, ipbuf, buflen); + (void) strlcpy(buf, sn->ip_addr_str, buflen); } /* @@ -1285,19 +1276,13 @@ smb_session_getclient(smb_session_t *sn, char *buf, size_t buflen) boolean_t smb_session_isclient(smb_session_t *sn, const char *client) { - char buf[INET6_ADDRSTRLEN]; - smb_inaddr_t *ipaddr; client += strspn(client, "\\"); if (smb_strcasecmp(client, sn->workstation, 0) == 0) return (B_TRUE); - ipaddr = &sn->ipaddr; - if (smb_inet_ntop(ipaddr, buf, SMB_IPSTRLEN(ipaddr->a_family)) == NULL) - return (B_FALSE); - - if (smb_strcasecmp(client, buf, 0) == 0) + if (smb_strcasecmp(client, sn->ip_addr_str, 0) == 0) return (B_TRUE); return (B_FALSE); @@ -1390,17 +1375,6 @@ smb_request_free(smb_request_t *sr) kmem_cache_free(smb_cache_request, sr); } -void -dump_smb_inaddr(smb_inaddr_t *ipaddr) -{ - char ipstr[INET6_ADDRSTRLEN]; - - if (smb_inet_ntop(ipaddr, ipstr, SMB_IPSTRLEN(ipaddr->a_family))) - cmn_err(CE_WARN, "error ipstr=%s", ipstr); - else - cmn_err(CE_WARN, "error converting ip address"); -} - boolean_t smb_session_oplocks_enable(smb_session_t *session) { diff --git a/usr/src/uts/common/smbsrv/smb_ktypes.h b/usr/src/uts/common/smbsrv/smb_ktypes.h index 64f96db9bd..79ee5e1ece 100644 --- a/usr/src/uts/common/smbsrv/smb_ktypes.h +++ b/usr/src/uts/common/smbsrv/smb_ktypes.h @@ -906,7 +906,6 @@ typedef struct smb_session { uint16_t s_local_port; smb_inaddr_t ipaddr; smb_inaddr_t local_ipaddr; - char workstation[SMB_PI_MAX_HOST]; int dialect; int native_os; int native_lm; @@ -944,6 +943,8 @@ typedef struct smb_session { int outpipe_datalen; int outpipe_cookie; smb_srqueue_t *s_srqueue; + char ip_addr_str[INET6_ADDRSTRLEN]; + char workstation[SMB_PI_MAX_HOST]; } smb_session_t; #define SMB_USER_MAGIC 0x55534552 /* 'USER' */ |