diff options
author | Peer Dampmann <peer.dampmann@nexenta.com> | 2014-02-24 19:03:12 -0800 |
---|---|---|
committer | Gordon Ross <gwr@nexenta.com> | 2015-11-06 12:20:56 -0500 |
commit | b24e356b384ccc80805e7150979de2373d44347c (patch) | |
tree | 9a4ed5a8ddbc2ccc887514200052110b27d04760 | |
parent | 08e9b2df0318952b8677b4feb62b4ec784f28101 (diff) | |
download | illumos-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.c | 11 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_common_open.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_dispatch.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c | 6 | ||||
-rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_pathname.c | 19 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_fsops.h | 6 | ||||
-rw-r--r-- | usr/src/uts/common/sys/pathname.h | 1 |
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); |