summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorGordon Ross <gwr@nexenta.com>2015-05-29 15:14:19 -0400
committerGordon Ross <gwr@nexenta.com>2015-10-04 11:58:43 -0400
commit49b5df1eac768235abeb210f61310e88b7d172b6 (patch)
tree5aca9ad9f15a873e1e21455656a962974a70cadd /usr/src
parenta851ffc82d02870137b4065c395d79bec1172c32 (diff)
downloadillumos-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.c21
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_negotiate.c4
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_session.c38
-rw-r--r--usr/src/uts/common/smbsrv/smb_ktypes.h3
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' */