mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
cifs: fix use of CONFIG_CIFS_ACL
Some of the code under CONFIG_CIFS_ACL is dependent upon code under CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that dependency. Move more of the ACL code out from under CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL. Also move find_readable_file out from other any sort of Kconfig option and make it a function normally compiled in. Reported-and-Acked-by: Randy Dunlap <randy.dunlap@oracle.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
ebb27386ff
commit
79df1baeec
@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o
|
||||
cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \
|
||||
link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \
|
||||
md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \
|
||||
readdir.o ioctl.o sess.o export.o cifsacl.o
|
||||
readdir.o ioctl.o sess.o export.o
|
||||
|
||||
cifs-$(CONFIG_CIFS_ACL) += cifsacl.o
|
||||
|
||||
cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o
|
||||
|
||||
|
@ -30,8 +30,6 @@
|
||||
#include "cifs_debug.h"
|
||||
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
|
||||
static struct cifs_wksid wksidarr[NUM_WK_SIDS] = {
|
||||
{{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"},
|
||||
{{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"},
|
||||
@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode)
|
||||
|
||||
return rc;
|
||||
}
|
||||
#endif /* CONFIG_CIFS_EXPERIMENTAL */
|
||||
|
@ -74,11 +74,7 @@ struct cifs_wksid {
|
||||
char sidname[SIDNAMELENGTH];
|
||||
} __attribute__((packed));
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
|
||||
extern int match_sid(struct cifs_sid *);
|
||||
extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *);
|
||||
|
||||
#endif /* CONFIG_CIFS_EXPERIMENTAL */
|
||||
|
||||
#endif /* _CIFSACL_H */
|
||||
|
@ -79,9 +79,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb,
|
||||
struct TCP_Server_Info *);
|
||||
extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof);
|
||||
extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool);
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool);
|
||||
#endif
|
||||
extern unsigned int smbCalcSize(struct smb_hdr *ptr);
|
||||
extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr);
|
||||
extern int decode_negTokenInit(unsigned char *security_blob, int length,
|
||||
|
@ -2478,95 +2478,6 @@ querySymLinkRetry:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
/* Initialize NT TRANSACT SMB into small smb request buffer.
|
||||
This assumes that all NT TRANSACTS that we init here have
|
||||
total parm and data under about 400 bytes (to fit in small cifs
|
||||
buffer size), which is the case so far, it easily fits. NB:
|
||||
Setup words themselves and ByteCount
|
||||
MaxSetupCount (size of returned setup area) and
|
||||
MaxParameterCount (returned parms size) must be set by caller */
|
||||
static int
|
||||
smb_init_nttransact(const __u16 sub_command, const int setup_count,
|
||||
const int parm_len, struct cifsTconInfo *tcon,
|
||||
void **ret_buf)
|
||||
{
|
||||
int rc;
|
||||
__u32 temp_offset;
|
||||
struct smb_com_ntransact_req *pSMB;
|
||||
|
||||
rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon,
|
||||
(void **)&pSMB);
|
||||
if (rc)
|
||||
return rc;
|
||||
*ret_buf = (void *)pSMB;
|
||||
pSMB->Reserved = 0;
|
||||
pSMB->TotalParameterCount = cpu_to_le32(parm_len);
|
||||
pSMB->TotalDataCount = 0;
|
||||
pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
|
||||
MAX_CIFS_HDR_SIZE) & 0xFFFFFF00);
|
||||
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
||||
pSMB->DataCount = pSMB->TotalDataCount;
|
||||
temp_offset = offsetof(struct smb_com_ntransact_req, Parms) +
|
||||
(setup_count * 2) - 4 /* for rfc1001 length itself */;
|
||||
pSMB->ParameterOffset = cpu_to_le32(temp_offset);
|
||||
pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len);
|
||||
pSMB->SetupCount = setup_count; /* no need to le convert byte fields */
|
||||
pSMB->SubCommand = cpu_to_le16(sub_command);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_ntransact(char *buf, char **ppparm, char **ppdata,
|
||||
__u32 *pparmlen, __u32 *pdatalen)
|
||||
{
|
||||
char *end_of_smb;
|
||||
__u32 data_count, data_offset, parm_count, parm_offset;
|
||||
struct smb_com_ntransact_rsp *pSMBr;
|
||||
|
||||
*pdatalen = 0;
|
||||
*pparmlen = 0;
|
||||
|
||||
if (buf == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pSMBr = (struct smb_com_ntransact_rsp *)buf;
|
||||
|
||||
/* ByteCount was converted from little endian in SendReceive */
|
||||
end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
|
||||
(char *)&pSMBr->ByteCount;
|
||||
|
||||
data_offset = le32_to_cpu(pSMBr->DataOffset);
|
||||
data_count = le32_to_cpu(pSMBr->DataCount);
|
||||
parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
|
||||
parm_count = le32_to_cpu(pSMBr->ParameterCount);
|
||||
|
||||
*ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset;
|
||||
*ppdata = (char *)&pSMBr->hdr.Protocol + data_offset;
|
||||
|
||||
/* should we also check that parm and data areas do not overlap? */
|
||||
if (*ppparm > end_of_smb) {
|
||||
cFYI(1, "parms start after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (parm_count + *ppparm > end_of_smb) {
|
||||
cFYI(1, "parm end after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (*ppdata > end_of_smb) {
|
||||
cFYI(1, "data starts after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (data_count + *ppdata > end_of_smb) {
|
||||
cFYI(1, "data %p + count %d (%p) past smb end %p start %p",
|
||||
*ppdata, data_count, (data_count + *ppdata),
|
||||
end_of_smb, pSMBr);
|
||||
return -EINVAL;
|
||||
} else if (parm_count + data_count > pSMBr->ByteCount) {
|
||||
cFYI(1, "parm count and data count larger than SMB");
|
||||
return -EINVAL;
|
||||
}
|
||||
*pdatalen = data_count;
|
||||
*pparmlen = parm_count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
const unsigned char *searchName,
|
||||
@ -3056,7 +2967,97 @@ GetExtAttrOut:
|
||||
|
||||
#endif /* CONFIG_POSIX */
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
#ifdef CONFIG_CIFS_ACL
|
||||
/*
|
||||
* Initialize NT TRANSACT SMB into small smb request buffer. This assumes that
|
||||
* all NT TRANSACTS that we init here have total parm and data under about 400
|
||||
* bytes (to fit in small cifs buffer size), which is the case so far, it
|
||||
* easily fits. NB: Setup words themselves and ByteCount MaxSetupCount (size of
|
||||
* returned setup area) and MaxParameterCount (returned parms size) must be set
|
||||
* by caller
|
||||
*/
|
||||
static int
|
||||
smb_init_nttransact(const __u16 sub_command, const int setup_count,
|
||||
const int parm_len, struct cifsTconInfo *tcon,
|
||||
void **ret_buf)
|
||||
{
|
||||
int rc;
|
||||
__u32 temp_offset;
|
||||
struct smb_com_ntransact_req *pSMB;
|
||||
|
||||
rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon,
|
||||
(void **)&pSMB);
|
||||
if (rc)
|
||||
return rc;
|
||||
*ret_buf = (void *)pSMB;
|
||||
pSMB->Reserved = 0;
|
||||
pSMB->TotalParameterCount = cpu_to_le32(parm_len);
|
||||
pSMB->TotalDataCount = 0;
|
||||
pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
|
||||
MAX_CIFS_HDR_SIZE) & 0xFFFFFF00);
|
||||
pSMB->ParameterCount = pSMB->TotalParameterCount;
|
||||
pSMB->DataCount = pSMB->TotalDataCount;
|
||||
temp_offset = offsetof(struct smb_com_ntransact_req, Parms) +
|
||||
(setup_count * 2) - 4 /* for rfc1001 length itself */;
|
||||
pSMB->ParameterOffset = cpu_to_le32(temp_offset);
|
||||
pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len);
|
||||
pSMB->SetupCount = setup_count; /* no need to le convert byte fields */
|
||||
pSMB->SubCommand = cpu_to_le16(sub_command);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
validate_ntransact(char *buf, char **ppparm, char **ppdata,
|
||||
__u32 *pparmlen, __u32 *pdatalen)
|
||||
{
|
||||
char *end_of_smb;
|
||||
__u32 data_count, data_offset, parm_count, parm_offset;
|
||||
struct smb_com_ntransact_rsp *pSMBr;
|
||||
|
||||
*pdatalen = 0;
|
||||
*pparmlen = 0;
|
||||
|
||||
if (buf == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pSMBr = (struct smb_com_ntransact_rsp *)buf;
|
||||
|
||||
/* ByteCount was converted from little endian in SendReceive */
|
||||
end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
|
||||
(char *)&pSMBr->ByteCount;
|
||||
|
||||
data_offset = le32_to_cpu(pSMBr->DataOffset);
|
||||
data_count = le32_to_cpu(pSMBr->DataCount);
|
||||
parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
|
||||
parm_count = le32_to_cpu(pSMBr->ParameterCount);
|
||||
|
||||
*ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset;
|
||||
*ppdata = (char *)&pSMBr->hdr.Protocol + data_offset;
|
||||
|
||||
/* should we also check that parm and data areas do not overlap? */
|
||||
if (*ppparm > end_of_smb) {
|
||||
cFYI(1, "parms start after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (parm_count + *ppparm > end_of_smb) {
|
||||
cFYI(1, "parm end after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (*ppdata > end_of_smb) {
|
||||
cFYI(1, "data starts after end of smb");
|
||||
return -EINVAL;
|
||||
} else if (data_count + *ppdata > end_of_smb) {
|
||||
cFYI(1, "data %p + count %d (%p) past smb end %p start %p",
|
||||
*ppdata, data_count, (data_count + *ppdata),
|
||||
end_of_smb, pSMBr);
|
||||
return -EINVAL;
|
||||
} else if (parm_count + data_count > pSMBr->ByteCount) {
|
||||
cFYI(1, "parm count and data count larger than SMB");
|
||||
return -EINVAL;
|
||||
}
|
||||
*pdatalen = data_count;
|
||||
*pparmlen = parm_count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get Security Descriptor (by handle) from remote server for a file or dir */
|
||||
int
|
||||
CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid,
|
||||
@ -3214,7 +3215,7 @@ setCifsAclRetry:
|
||||
return (rc);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CIFS_EXPERIMENTAL */
|
||||
#endif /* CONFIG_CIFS_ACL */
|
||||
|
||||
/* Legacy Query Path Information call for lookup to old servers such
|
||||
as Win9x/WinME */
|
||||
|
@ -1108,7 +1108,6 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file,
|
||||
return total_written;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
|
||||
bool fsuid_only)
|
||||
{
|
||||
@ -1142,7 +1141,6 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
|
||||
spin_unlock(&cifs_file_list_lock);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
|
||||
bool fsuid_only)
|
||||
|
@ -686,7 +686,7 @@ int cifs_get_inode_info(struct inode **pinode,
|
||||
cFYI(1, "cifs_sfu_type failed: %d", tmprc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
#ifdef CONFIG_CIFS_ACL
|
||||
/* fill in 0777 bits from ACL */
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
|
||||
rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path,
|
||||
@ -697,7 +697,7 @@ int cifs_get_inode_info(struct inode **pinode,
|
||||
goto cgii_exit;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_CIFS_ACL */
|
||||
|
||||
/* fill in remaining high mode bits e.g. SUID, VTX */
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
|
||||
@ -2122,7 +2122,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
|
||||
|
||||
if (attrs->ia_valid & ATTR_MODE) {
|
||||
rc = 0;
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
#ifdef CONFIG_CIFS_ACL
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
|
||||
rc = mode_to_cifs_acl(inode, full_path, mode);
|
||||
if (rc) {
|
||||
@ -2131,7 +2131,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
|
||||
goto cifs_setattr_exit;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
#endif /* CONFIG_CIFS_ACL */
|
||||
if (((mode & S_IWUGO) == 0) &&
|
||||
(cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user