summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeer Dampmann <peer.dampmann@nexenta.com>2014-02-24 19:03:12 -0800
committerGordon Ross <gwr@nexenta.com>2015-11-06 12:20:56 -0500
commitb24e356b384ccc80805e7150979de2373d44347c (patch)
tree9a4ed5a8ddbc2ccc887514200052110b27d04760
parent08e9b2df0318952b8677b4feb62b4ec784f28101 (diff)
downloadillumos-joyent-b24e356b384ccc80805e7150979de2373d44347c.tar.gz
6398 SMB should support path names longer than 1024
Reviewed by: Gordon Ross <gwr@nexenta.com> Approved by: Garrett D'Amore <garrett@damore.org>
-rw-r--r--usr/src/uts/common/fs/pathname.c11
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_common_open.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_dispatch.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c6
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_pathname.c19
-rw-r--r--usr/src/uts/common/smbsrv/smb_fsops.h6
-rw-r--r--usr/src/uts/common/sys/pathname.h1
7 files changed, 30 insertions, 17 deletions
diff --git a/usr/src/uts/common/fs/pathname.c b/usr/src/uts/common/fs/pathname.c
index 82d2e36973..323489d67e 100644
--- a/usr/src/uts/common/fs/pathname.c
+++ b/usr/src/uts/common/fs/pathname.c
@@ -37,8 +37,6 @@
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
@@ -74,9 +72,14 @@
void
pn_alloc(struct pathname *pnp)
{
- pnp->pn_path = pnp->pn_buf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ pn_alloc_sz(pnp, MAXPATHLEN);
+}
+void
+pn_alloc_sz(struct pathname *pnp, size_t sz)
+{
+ pnp->pn_path = pnp->pn_buf = kmem_alloc(sz, KM_SLEEP);
pnp->pn_pathlen = 0;
- pnp->pn_bufsize = MAXPATHLEN;
+ pnp->pn_bufsize = sz;
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_common_open.c b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
index 91f9a51bab..ebd4169853 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_common_open.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
@@ -396,7 +396,7 @@ smb_open_subr(smb_request_t *sr)
if (!smb_pathname_validate(sr, pn))
return (sr->smb_error.status);
- if (strlen(pn->pn_path) >= MAXPATHLEN) {
+ if (strlen(pn->pn_path) >= SMB_MAXPATHLEN) {
smbsr_error(sr, 0, ERRSRV, ERRfilespecs);
return (NT_STATUS_NAME_TOO_LONG);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
index da874155ff..e9890c768a 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
@@ -967,6 +967,8 @@ static const struct {
{ EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
{ EXDEV, ERRSRV, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE },
{ EREMOTE, ERRSRV, ERRbadpath, NT_STATUS_PATH_NOT_COVERED},
+ { ENAMETOOLONG, ERRDOS, ERROR_INVALID_NAME,
+ NT_STATUS_OBJECT_NAME_INVALID },
{ EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED },
{ ESTALE, ERRDOS, ERRbadfid, NT_STATUS_INVALID_HANDLE },
{ EBADF, ERRDOS, ERRbadfid, NT_STATUS_INVALID_HANDLE },
diff --git a/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c b/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c
index 037c1373b5..d9ed7a9234 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
*/
/*
@@ -192,8 +192,8 @@ smb_pre_nt_create_andx(smb_request_t *sr)
if (rc == 0) {
if (NameLength == 0) {
op->fqi.fq_path.pn_path = "\\";
- } else if (NameLength >= MAXPATHLEN) {
- smbsr_error(sr, NT_STATUS_OBJECT_PATH_NOT_FOUND,
+ } else if (NameLength >= SMB_MAXPATHLEN) {
+ smbsr_error(sr, NT_STATUS_OBJECT_NAME_INVALID,
ERRDOS, ERROR_PATH_NOT_FOUND);
rc = -1;
} else {
diff --git a/usr/src/uts/common/fs/smbsrv/smb_pathname.c b/usr/src/uts/common/fs/smbsrv/smb_pathname.c
index 2e4f2e1911..23dc6d0e82 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_pathname.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_pathname.c
@@ -184,10 +184,11 @@ smb_pathname_reduce(
if (*path == '\0')
return (ENOENT);
- usepath = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ usepath = kmem_alloc(SMB_MAXPATHLEN, KM_SLEEP);
- if ((len = strlcpy(usepath, path, MAXPATHLEN)) >= MAXPATHLEN) {
- kmem_free(usepath, MAXPATHLEN);
+ len = strlcpy(usepath, path, SMB_MAXPATHLEN);
+ if (len >= SMB_MAXPATHLEN) {
+ kmem_free(usepath, SMB_MAXPATHLEN);
return (ENAMETOOLONG);
}
@@ -205,9 +206,9 @@ smb_pathname_reduce(
local_root_node = root_node;
if (SMB_TREE_IS_DFSROOT(sr) && (sr->smb_flg2 & SMB_FLAGS2_DFS)) {
- err = smb_pathname_dfs_preprocess(sr, usepath, MAXPATHLEN);
+ err = smb_pathname_dfs_preprocess(sr, usepath, SMB_MAXPATHLEN);
if (err != 0) {
- kmem_free(usepath, MAXPATHLEN);
+ kmem_free(usepath, SMB_MAXPATHLEN);
return (err);
}
len = strlen(usepath);
@@ -232,11 +233,11 @@ smb_pathname_reduce(
(void) strcanon(usepath, "/");
- (void) pn_alloc(&ppn);
+ (void) pn_alloc_sz(&ppn, SMB_MAXPATHLEN);
if ((err = pn_set(&ppn, usepath)) != 0) {
(void) pn_free(&ppn);
- kmem_free(usepath, MAXPATHLEN);
+ kmem_free(usepath, SMB_MAXPATHLEN);
if (vss_cur_node != NULL)
(void) smb_node_release(vss_cur_node);
if (vss_root_node != NULL)
@@ -268,7 +269,7 @@ smb_pathname_reduce(
}
(void) pn_free(&ppn);
- kmem_free(usepath, MAXPATHLEN);
+ kmem_free(usepath, SMB_MAXPATHLEN);
/*
* Prevent traversal to another file system if mount point
@@ -366,7 +367,7 @@ smb_pathname(smb_request_t *sr, char *path, int flags,
if (dir_node)
*dir_node = NULL;
- (void) pn_alloc(&upn);
+ (void) pn_alloc_sz(&upn, SMB_MAXPATHLEN);
if ((err = pn_set(&upn, path)) != 0) {
(void) pn_free(&upn);
diff --git a/usr/src/uts/common/smbsrv/smb_fsops.h b/usr/src/uts/common/smbsrv/smb_fsops.h
index 5722c4e24a..cbe6111e55 100644
--- a/usr/src/uts/common/smbsrv/smb_fsops.h
+++ b/usr/src/uts/common/smbsrv/smb_fsops.h
@@ -121,6 +121,12 @@ int smb_fsop_frlock(smb_node_t *, smb_lock_t *, boolean_t, cred_t *);
#define SMB_ABE 0x00000008
#define SMB_CASE_SENSITIVE 0x00000010
+/*
+ * Increased MAXPATHLEN for SMB. Essentially, we want to allow a
+ * share path up to MAXPATHLEN plus a relative path of MAXPATHLEN.
+ */
+#define SMB_MAXPATHLEN (2 * MAXPATHLEN)
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/sys/pathname.h b/usr/src/uts/common/sys/pathname.h
index db978c1ea9..e92814ad4b 100644
--- a/usr/src/uts/common/sys/pathname.h
+++ b/usr/src/uts/common/sys/pathname.h
@@ -67,6 +67,7 @@ typedef struct pathname {
#define pn_pathleft(pnp) ((pnp)->pn_pathlen)
extern void pn_alloc(struct pathname *);
+extern void pn_alloc_sz(struct pathname *, size_t);
extern int pn_get(char *, enum uio_seg, struct pathname *);
extern int pn_get_buf(char *, enum uio_seg, struct pathname *,
void *, size_t);