mirror of
https://gitee.com/openharmony/kernel_linux
synced 2025-04-07 17:42:15 +00:00
[CIFS] Add worker function for Get ACL cifs style
Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
94bc2be31a
commit
0a4b92c05e
@ -1,7 +1,9 @@
|
|||||||
Version 1.40
|
Version 1.40
|
||||||
------------
|
------------
|
||||||
Use fsuid (fsgid) more consistently instead of uid (gid). Improve performance
|
Use fsuid (fsgid) more consistently instead of uid (gid). Improve performance
|
||||||
of readpages by eliminating one extra memcpy.
|
of readpages by eliminating one extra memcpy. Allow update of file size
|
||||||
|
from remote server even if file is open for write as long as mount is
|
||||||
|
directio.
|
||||||
|
|
||||||
Version 1.39
|
Version 1.39
|
||||||
------------
|
------------
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#define CIFS_MOUNT_POSIX_PATHS 0x40 /* Negotiate posix pathnames if possible. */
|
#define CIFS_MOUNT_POSIX_PATHS 0x40 /* Negotiate posix pathnames if possible. */
|
||||||
#define CIFS_MOUNT_UNX_EMUL 0x80 /* Network compat with SFUnix emulation */
|
#define CIFS_MOUNT_UNX_EMUL 0x80 /* Network compat with SFUnix emulation */
|
||||||
#define CIFS_MOUNT_NO_BRL 0x100 /* No sending byte range locks to srv */
|
#define CIFS_MOUNT_NO_BRL 0x100 /* No sending byte range locks to srv */
|
||||||
|
#define CIFS_MOUNT_CIFS_ACL 0x200 /* send ACL requests to non-POSIX srv */
|
||||||
|
|
||||||
struct cifs_sb_info {
|
struct cifs_sb_info {
|
||||||
struct cifsTconInfo *tcon; /* primary mount */
|
struct cifsTconInfo *tcon; /* primary mount */
|
||||||
|
@ -233,6 +233,8 @@ struct cifsTconInfo {
|
|||||||
atomic_t num_hardlinks;
|
atomic_t num_hardlinks;
|
||||||
atomic_t num_symlinks;
|
atomic_t num_symlinks;
|
||||||
atomic_t num_locks;
|
atomic_t num_locks;
|
||||||
|
atomic_t num_acl_get;
|
||||||
|
atomic_t num_acl_set;
|
||||||
#ifdef CONFIG_CIFS_STATS2
|
#ifdef CONFIG_CIFS_STATS2
|
||||||
unsigned long long time_writes;
|
unsigned long long time_writes;
|
||||||
unsigned long long time_reads;
|
unsigned long long time_reads;
|
||||||
|
@ -528,7 +528,7 @@ typedef union smb_com_session_setup_andx {
|
|||||||
/* STRING PrimaryDomain */
|
/* STRING PrimaryDomain */
|
||||||
/* STRING NativeOS */
|
/* STRING NativeOS */
|
||||||
/* STRING NativeLanMan */
|
/* STRING NativeLanMan */
|
||||||
} __attribute__((packed)) old_req; /* pre-NTLM (LANMAN2.1) request format */
|
} __attribute__((packed)) old_req; /* pre-NTLM (LANMAN2.1) req format */
|
||||||
|
|
||||||
struct { /* default (NTLM) response format */
|
struct { /* default (NTLM) response format */
|
||||||
struct smb_hdr hdr; /* wct = 3 */
|
struct smb_hdr hdr; /* wct = 3 */
|
||||||
@ -540,7 +540,7 @@ typedef union smb_com_session_setup_andx {
|
|||||||
unsigned char NativeOS[1]; /* followed by */
|
unsigned char NativeOS[1]; /* followed by */
|
||||||
/* unsigned char * NativeLanMan; */
|
/* unsigned char * NativeLanMan; */
|
||||||
/* unsigned char * PrimaryDomain; */
|
/* unsigned char * PrimaryDomain; */
|
||||||
} __attribute__((packed)) old_resp; /* pre-NTLM (LANMAN2.1) response format */
|
} __attribute__((packed)) old_resp; /* pre-NTLM (LANMAN2.1) response */
|
||||||
} __attribute__((packed)) SESSION_SETUP_ANDX;
|
} __attribute__((packed)) SESSION_SETUP_ANDX;
|
||||||
|
|
||||||
#define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux"
|
#define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux"
|
||||||
@ -1007,10 +1007,49 @@ typedef struct smb_com_setattr_rsp {
|
|||||||
|
|
||||||
/* empty wct response to setattr */
|
/* empty wct response to setattr */
|
||||||
|
|
||||||
/***************************************************/
|
/*******************************************************/
|
||||||
/* NT Transact structure defintions follow */
|
/* NT Transact structure defintions follow */
|
||||||
/* Currently only ioctl and notify are implemented */
|
/* Currently only ioctl, acl (get security descriptor) */
|
||||||
/***************************************************/
|
/* and notify are implemented */
|
||||||
|
/*******************************************************/
|
||||||
|
typedef struct smb_com_ntransact_req {
|
||||||
|
struct smb_hdr hdr; /* wct >= 19 */
|
||||||
|
__u8 MaxSetupCount;
|
||||||
|
__u16 Reserved;
|
||||||
|
__le32 TotalParameterCount;
|
||||||
|
__le32 TotalDataCount;
|
||||||
|
__le32 MaxParameterCount;
|
||||||
|
__le32 MaxDataCount;
|
||||||
|
__le32 ParameterCount;
|
||||||
|
__le32 ParameterOffset;
|
||||||
|
__le32 DataCount;
|
||||||
|
__le32 DataOffset;
|
||||||
|
__u8 SetupCount; /* four setup words follow subcommand */
|
||||||
|
/* SNIA spec incorrectly included spurious pad here */
|
||||||
|
__le16 SubCommand; /* 2 = IOCTL/FSCTL */
|
||||||
|
/* SetupCount words follow then */
|
||||||
|
__le16 ByteCount;
|
||||||
|
__u8 Pad[3];
|
||||||
|
__u8 Parms[0];
|
||||||
|
} __attribute__((packed)) NTRANSACT_REQ;
|
||||||
|
|
||||||
|
typedef struct smb_com_ntransact_rsp {
|
||||||
|
struct smb_hdr hdr; /* wct = 18 */
|
||||||
|
__u8 Reserved[3];
|
||||||
|
__le32 TotalParameterCount;
|
||||||
|
__le32 TotalDataCount;
|
||||||
|
__le32 ParameterCount;
|
||||||
|
__le32 ParameterOffset;
|
||||||
|
__le32 ParameterDisplacement;
|
||||||
|
__le32 DataCount;
|
||||||
|
__le32 DataOffset;
|
||||||
|
__le32 DataDisplacement;
|
||||||
|
__u8 SetupCount; /* 0 */
|
||||||
|
__u16 ByteCount;
|
||||||
|
/* __u8 Pad[3]; */
|
||||||
|
/* parms and data follow */
|
||||||
|
} __attribute__((packed)) NTRANSACT_RSP;
|
||||||
|
|
||||||
typedef struct smb_com_transaction_ioctl_req {
|
typedef struct smb_com_transaction_ioctl_req {
|
||||||
struct smb_hdr hdr; /* wct = 23 */
|
struct smb_hdr hdr; /* wct = 23 */
|
||||||
__u8 MaxSetupCount;
|
__u8 MaxSetupCount;
|
||||||
@ -1028,8 +1067,8 @@ typedef struct smb_com_transaction_ioctl_req {
|
|||||||
__le16 SubCommand; /* 2 = IOCTL/FSCTL */
|
__le16 SubCommand; /* 2 = IOCTL/FSCTL */
|
||||||
__le32 FunctionCode;
|
__le32 FunctionCode;
|
||||||
__u16 Fid;
|
__u16 Fid;
|
||||||
__u8 IsFsctl; /* 1 = File System Control, 0 = device control (IOCTL)*/
|
__u8 IsFsctl; /* 1 = File System Control 0 = device control (IOCTL) */
|
||||||
__u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS share)*/
|
__u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS) */
|
||||||
__le16 ByteCount;
|
__le16 ByteCount;
|
||||||
__u8 Pad[3];
|
__u8 Pad[3];
|
||||||
__u8 Data[1];
|
__u8 Data[1];
|
||||||
@ -1049,9 +1088,35 @@ typedef struct smb_com_transaction_ioctl_rsp {
|
|||||||
__u8 SetupCount; /* 1 */
|
__u8 SetupCount; /* 1 */
|
||||||
__le16 ReturnedDataLen;
|
__le16 ReturnedDataLen;
|
||||||
__u16 ByteCount;
|
__u16 ByteCount;
|
||||||
__u8 Pad[3];
|
|
||||||
} __attribute__((packed)) TRANSACT_IOCTL_RSP;
|
} __attribute__((packed)) TRANSACT_IOCTL_RSP;
|
||||||
|
|
||||||
|
#define CIFS_ACL_OWNER 1
|
||||||
|
#define CIFS_ACL_GROUP 2
|
||||||
|
#define CIFS_ACL_DACL 4
|
||||||
|
#define CIFS_ACL_SACL 8
|
||||||
|
|
||||||
|
typedef struct smb_com_transaction_qsec_req {
|
||||||
|
struct smb_hdr hdr; /* wct = 19 */
|
||||||
|
__u8 MaxSetupCount;
|
||||||
|
__u16 Reserved;
|
||||||
|
__le32 TotalParameterCount;
|
||||||
|
__le32 TotalDataCount;
|
||||||
|
__le32 MaxParameterCount;
|
||||||
|
__le32 MaxDataCount;
|
||||||
|
__le32 ParameterCount;
|
||||||
|
__le32 ParameterOffset;
|
||||||
|
__le32 DataCount;
|
||||||
|
__le32 DataOffset;
|
||||||
|
__u8 SetupCount; /* no setup words follow subcommand */
|
||||||
|
/* SNIA spec incorrectly included spurious pad here */
|
||||||
|
__le16 SubCommand; /* 6 = QUERY_SECURITY_DESC */
|
||||||
|
__le16 ByteCount; /* bcc = 3 + 8 */
|
||||||
|
__u8 Pad[3];
|
||||||
|
__u16 Fid;
|
||||||
|
__u16 Reserved2;
|
||||||
|
__le32 AclFlags;
|
||||||
|
} __attribute__((packed)) QUERY_SEC_DESC_REQ;
|
||||||
|
|
||||||
typedef struct smb_com_transaction_change_notify_req {
|
typedef struct smb_com_transaction_change_notify_req {
|
||||||
struct smb_hdr hdr; /* wct = 23 */
|
struct smb_hdr hdr; /* wct = 23 */
|
||||||
__u8 MaxSetupCount;
|
__u8 MaxSetupCount;
|
||||||
@ -1076,6 +1141,8 @@ typedef struct smb_com_transaction_change_notify_req {
|
|||||||
/* __u8 Data[1];*/
|
/* __u8 Data[1];*/
|
||||||
} __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ;
|
} __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ;
|
||||||
|
|
||||||
|
/* BB eventually change to use generic ntransact rsp struct
|
||||||
|
and validation routine */
|
||||||
typedef struct smb_com_transaction_change_notify_rsp {
|
typedef struct smb_com_transaction_change_notify_rsp {
|
||||||
struct smb_hdr hdr; /* wct = 18 */
|
struct smb_hdr hdr; /* wct = 18 */
|
||||||
__u8 Reserved[3];
|
__u8 Reserved[3];
|
||||||
|
@ -299,6 +299,9 @@ extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
|
|||||||
const char *fileName, const char * ea_name,
|
const char *fileName, const char * ea_name,
|
||||||
const void * ea_value, const __u16 ea_value_len,
|
const void * ea_value, const __u16 ea_value_len,
|
||||||
const struct nls_table *nls_codepage, int remap_special_chars);
|
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||||
|
extern int CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon,
|
||||||
|
__u16 fid, char *acl_inf, const int buflen,
|
||||||
|
const int acl_type /* ACCESS vs. DEFAULT */);
|
||||||
extern int CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
extern int CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
||||||
const unsigned char *searchName,
|
const unsigned char *searchName,
|
||||||
char *acl_inf, const int buflen,const int acl_type,
|
char *acl_inf, const int buflen,const int acl_type,
|
||||||
|
@ -1926,6 +1926,90 @@ querySymLinkRetry:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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_ntransact(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,
|
||||||
|
int * pdatalen, int * pparmlen)
|
||||||
|
{
|
||||||
|
char * end_of_smb;
|
||||||
|
__u32 data_count, data_offset, parm_count, parm_offset;
|
||||||
|
struct smb_com_ntransact_rsp * pSMBr;
|
||||||
|
|
||||||
|
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) ends after end of smb %p start %p",
|
||||||
|
*ppdata, data_count, (data_count + *ppdata), end_of_smb, pSMBr)); /* BB FIXME */
|
||||||
|
return -EINVAL;
|
||||||
|
} else if(parm_count + data_count > pSMBr->ByteCount) {
|
||||||
|
cFYI(1,("parm count and data count larger than SMB"));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
||||||
const unsigned char *searchName,
|
const unsigned char *searchName,
|
||||||
@ -1948,7 +2032,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|||||||
pSMB->TotalDataCount = 0;
|
pSMB->TotalDataCount = 0;
|
||||||
pSMB->MaxParameterCount = cpu_to_le32(2);
|
pSMB->MaxParameterCount = cpu_to_le32(2);
|
||||||
/* BB find exact data count max from sess structure BB */
|
/* BB find exact data count max from sess structure BB */
|
||||||
pSMB->MaxDataCount = cpu_to_le32(4000);
|
pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
|
||||||
|
MAX_CIFS_HDR_SIZE) & 0xFFFFFF00);
|
||||||
pSMB->MaxSetupCount = 4;
|
pSMB->MaxSetupCount = 4;
|
||||||
pSMB->Reserved = 0;
|
pSMB->Reserved = 0;
|
||||||
pSMB->ParameterOffset = 0;
|
pSMB->ParameterOffset = 0;
|
||||||
@ -1975,7 +2060,9 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
|
|||||||
rc = -EIO; /* bad smb */
|
rc = -EIO; /* bad smb */
|
||||||
else {
|
else {
|
||||||
if(data_count && (data_count < 2048)) {
|
if(data_count && (data_count < 2048)) {
|
||||||
char * end_of_smb = pSMBr->ByteCount + (char *)&pSMBr->ByteCount;
|
char * end_of_smb = 2 /* sizeof byte count */ +
|
||||||
|
pSMBr->ByteCount +
|
||||||
|
(char *)&pSMBr->ByteCount;
|
||||||
|
|
||||||
struct reparse_data * reparse_buf = (struct reparse_data *)
|
struct reparse_data * reparse_buf = (struct reparse_data *)
|
||||||
((char *)&pSMBr->hdr.Protocol + data_offset);
|
((char *)&pSMBr->hdr.Protocol + data_offset);
|
||||||
@ -2219,6 +2306,7 @@ queryAclRetry:
|
|||||||
|
|
||||||
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|
||||||
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
||||||
|
cifs_stats_inc(&tcon->num_acl_get);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
cFYI(1, ("Send error in Query POSIX ACL = %d", rc));
|
cFYI(1, ("Send error in Query POSIX ACL = %d", rc));
|
||||||
} else {
|
} else {
|
||||||
@ -2406,6 +2494,87 @@ GetExtAttrOut:
|
|||||||
|
|
||||||
#endif /* CONFIG_POSIX */
|
#endif /* CONFIG_POSIX */
|
||||||
|
|
||||||
|
/* Convert CIFS ACL to POSIX form */
|
||||||
|
static int parse_sec_desc(struct sec_desc * psec_desc, int acl_len)
|
||||||
|
{
|
||||||
|
CHECK ON OTHER COMPUTER TO SEE IF FORMAT ENCODED IN CIFSPDU.H ALREADY
|
||||||
|
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,
|
||||||
|
/* BB fix up return info */ char *acl_inf, const int buflen,
|
||||||
|
const int acl_type /* ACCESS/DEFAULT not sure implication */)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
int buf_type = 0;
|
||||||
|
QUERY_SEC_DESC_REQ * pSMB;
|
||||||
|
struct kvec iov[1];
|
||||||
|
|
||||||
|
cFYI(1, ("GetCifsACL"));
|
||||||
|
|
||||||
|
rc = smb_init_ntransact(NT_TRANSACT_QUERY_SECURITY_DESC, 0,
|
||||||
|
8 /* parm len */, tcon, (void **) &pSMB);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
pSMB->MaxParameterCount = cpu_to_le32(4);
|
||||||
|
/* BB TEST with big acls that might need to be e.g. larger than 16K */
|
||||||
|
pSMB->MaxSetupCount = 0;
|
||||||
|
pSMB->Fid = fid; /* file handle always le */
|
||||||
|
pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP |
|
||||||
|
CIFS_ACL_DACL);
|
||||||
|
pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */
|
||||||
|
pSMB->hdr.smb_buf_length += 11;
|
||||||
|
iov[0].iov_base = (char *)pSMB;
|
||||||
|
iov[0].iov_len = pSMB->hdr.smb_buf_length + 4;
|
||||||
|
|
||||||
|
rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, 0);
|
||||||
|
cifs_stats_inc(&tcon->num_acl_get);
|
||||||
|
if (rc) {
|
||||||
|
cFYI(1, ("Send error in QuerySecDesc = %d", rc));
|
||||||
|
} else { /* decode response */
|
||||||
|
struct sec_desc * psec_desc;
|
||||||
|
__le32 * parm;
|
||||||
|
int parm_len;
|
||||||
|
int data_len;
|
||||||
|
int acl_len;
|
||||||
|
struct smb_com_ntransact_rsp * pSMBr;
|
||||||
|
|
||||||
|
/* validate_nttransact */
|
||||||
|
rc = validate_ntransact(iov[0].iov_base, (char **)&parm,
|
||||||
|
(char **)&psec_desc,
|
||||||
|
&parm_len, &data_len);
|
||||||
|
|
||||||
|
if(rc)
|
||||||
|
goto qsec_out;
|
||||||
|
pSMBr = (struct smb_com_ntransact_rsp *)iov[0].iov_base;
|
||||||
|
|
||||||
|
cERROR(1,("smb %p parm %p data %p",pSMBr,parm,psec_desc)); /* BB removeme BB */
|
||||||
|
|
||||||
|
if (le32_to_cpu(pSMBr->ParameterCount) != 4) {
|
||||||
|
rc = -EIO; /* bad smb */
|
||||||
|
goto qsec_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BB check that data area is minimum length and as big as acl_len */
|
||||||
|
|
||||||
|
acl_len = le32_to_cpu(*(__le32 *)parm);
|
||||||
|
/* BB check if(acl_len > bufsize) */
|
||||||
|
|
||||||
|
parse_sec_desc(psec_desc, acl_len);
|
||||||
|
}
|
||||||
|
qsec_out:
|
||||||
|
if(buf_type == CIFS_SMALL_BUFFER)
|
||||||
|
cifs_small_buf_release(iov[0].iov_base);
|
||||||
|
else if(buf_type == CIFS_LARGE_BUFFER)
|
||||||
|
cifs_buf_release(iov[0].iov_base);
|
||||||
|
cifs_small_buf_release(pSMB);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Legacy Query Path Information call for lookup to old servers such
|
/* Legacy Query Path Information call for lookup to old servers such
|
||||||
as Win9x/WinME */
|
as Win9x/WinME */
|
||||||
int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
||||||
@ -4304,7 +4473,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
struct smb_com_transaction_change_notify_req * pSMB = NULL;
|
struct smb_com_transaction_change_notify_req * pSMB = NULL;
|
||||||
struct smb_com_transaction_change_notify_rsp * pSMBr = NULL;
|
struct smb_com_ntransaction_change_notify_rsp * pSMBr = NULL;
|
||||||
struct dir_notify_req *dnotify_req;
|
struct dir_notify_req *dnotify_req;
|
||||||
int bytes_returned;
|
int bytes_returned;
|
||||||
|
|
||||||
@ -4319,6 +4488,10 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
|||||||
pSMB->MaxParameterCount = cpu_to_le32(2);
|
pSMB->MaxParameterCount = cpu_to_le32(2);
|
||||||
/* BB find exact data count max from sess structure BB */
|
/* BB find exact data count max from sess structure BB */
|
||||||
pSMB->MaxDataCount = 0; /* same in little endian or be */
|
pSMB->MaxDataCount = 0; /* same in little endian or be */
|
||||||
|
/* BB VERIFY verify which is correct for above BB */
|
||||||
|
pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
|
||||||
|
MAX_CIFS_HDR_SIZE) & 0xFFFFFF00);
|
||||||
|
|
||||||
pSMB->MaxSetupCount = 4;
|
pSMB->MaxSetupCount = 4;
|
||||||
pSMB->Reserved = 0;
|
pSMB->Reserved = 0;
|
||||||
pSMB->ParameterOffset = 0;
|
pSMB->ParameterOffset = 0;
|
||||||
|
@ -76,6 +76,7 @@ struct smb_vol {
|
|||||||
unsigned setuids:1;
|
unsigned setuids:1;
|
||||||
unsigned noperm:1;
|
unsigned noperm:1;
|
||||||
unsigned no_psx_acl:1; /* set if posix acl support should be disabled */
|
unsigned no_psx_acl:1; /* set if posix acl support should be disabled */
|
||||||
|
unsigned cifs_acl:1;
|
||||||
unsigned no_xattr:1; /* set if xattr (EA) support should be disabled*/
|
unsigned no_xattr:1; /* set if xattr (EA) support should be disabled*/
|
||||||
unsigned server_ino:1; /* use inode numbers from server ie UniqueId */
|
unsigned server_ino:1; /* use inode numbers from server ie UniqueId */
|
||||||
unsigned direct_io:1;
|
unsigned direct_io:1;
|
||||||
@ -1159,6 +1160,10 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
|
|||||||
vol->server_ino = 1;
|
vol->server_ino = 1;
|
||||||
} else if (strnicmp(data, "noserverino",9) == 0) {
|
} else if (strnicmp(data, "noserverino",9) == 0) {
|
||||||
vol->server_ino = 0;
|
vol->server_ino = 0;
|
||||||
|
} else if (strnicmp(data, "cifsacl",7) == 0) {
|
||||||
|
vol->cifs_acl = 1;
|
||||||
|
} else if (strnicmp(data, "nocifsacl", 9) == 0) {
|
||||||
|
vol->cifs_acl = 0;
|
||||||
} else if (strnicmp(data, "acl",3) == 0) {
|
} else if (strnicmp(data, "acl",3) == 0) {
|
||||||
vol->no_psx_acl = 0;
|
vol->no_psx_acl = 0;
|
||||||
} else if (strnicmp(data, "noacl",5) == 0) {
|
} else if (strnicmp(data, "noacl",5) == 0) {
|
||||||
@ -1806,6 +1811,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
|
|||||||
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
|
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
|
||||||
if(volume_info.nobrl)
|
if(volume_info.nobrl)
|
||||||
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
|
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
|
||||||
|
if(volume_info.cifs_acl)
|
||||||
|
cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
|
||||||
|
|
||||||
if(volume_info.direct_io) {
|
if(volume_info.direct_io) {
|
||||||
cFYI(1,("mounting share using direct i/o"));
|
cFYI(1,("mounting share using direct i/o"));
|
||||||
|
@ -489,7 +489,6 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
|
|||||||
receive_len, xid));
|
receive_len, xid));
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
} else { /* rcvd frame is ok */
|
} else { /* rcvd frame is ok */
|
||||||
|
|
||||||
if (midQ->resp_buf &&
|
if (midQ->resp_buf &&
|
||||||
(midQ->midState == MID_RESPONSE_RECEIVED)) {
|
(midQ->midState == MID_RESPONSE_RECEIVED)) {
|
||||||
|
|
||||||
|
@ -254,7 +254,8 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
|
|||||||
rc = CIFSSMBQueryEA(xid,pTcon,full_path,ea_name,ea_value,
|
rc = CIFSSMBQueryEA(xid,pTcon,full_path,ea_name,ea_value,
|
||||||
buf_size, cifs_sb->local_nls,
|
buf_size, cifs_sb->local_nls,
|
||||||
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||||
} else if(strncmp(ea_name,POSIX_ACL_XATTR_ACCESS,strlen(POSIX_ACL_XATTR_ACCESS)) == 0) {
|
} else if(strncmp(ea_name,POSIX_ACL_XATTR_ACCESS,
|
||||||
|
strlen(POSIX_ACL_XATTR_ACCESS)) == 0) {
|
||||||
#ifdef CONFIG_CIFS_POSIX
|
#ifdef CONFIG_CIFS_POSIX
|
||||||
if(sb->s_flags & MS_POSIXACL)
|
if(sb->s_flags & MS_POSIXACL)
|
||||||
rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
|
rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
|
||||||
@ -262,10 +263,27 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
|
|||||||
cifs_sb->local_nls,
|
cifs_sb->local_nls,
|
||||||
cifs_sb->mnt_cifs_flags &
|
cifs_sb->mnt_cifs_flags &
|
||||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||||
|
/* else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
|
||||||
|
__u16 fid;
|
||||||
|
int oplock = FALSE;
|
||||||
|
rc = CIFSSMBOpen(xid, pTcon, full_path,
|
||||||
|
FILE_OPEN, GENERIC_READ, 0, &fid,
|
||||||
|
&oplock, NULL, cifs_sb->local_nls,
|
||||||
|
cifs_sb->mnt_cifs_flags &
|
||||||
|
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||||
|
if(rc == 0) {
|
||||||
|
rc = CIFSSMBGetCIFSACL(xid, pTcon, fid,
|
||||||
|
ea_value, buf_size,
|
||||||
|
ACL_TYPE_ACCESS);
|
||||||
|
CIFSSMBClose(xid, pTcon, fid)
|
||||||
|
}
|
||||||
|
} */ /* BB enable after fixing up return data */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
cFYI(1,("query POSIX ACL not supported yet"));
|
cFYI(1,("query POSIX ACL not supported yet"));
|
||||||
#endif /* CONFIG_CIFS_POSIX */
|
#endif /* CONFIG_CIFS_POSIX */
|
||||||
} else if(strncmp(ea_name,POSIX_ACL_XATTR_DEFAULT,strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) {
|
} else if(strncmp(ea_name,POSIX_ACL_XATTR_DEFAULT,
|
||||||
|
strlen(POSIX_ACL_XATTR_DEFAULT)) == 0) {
|
||||||
#ifdef CONFIG_CIFS_POSIX
|
#ifdef CONFIG_CIFS_POSIX
|
||||||
if(sb->s_flags & MS_POSIXACL)
|
if(sb->s_flags & MS_POSIXACL)
|
||||||
rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
|
rc = CIFSSMBGetPosixACL(xid, pTcon, full_path,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user