[CIFS] more whitespace cleanup
Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
6dc0f87e35
commit
790fe579f5
@ -98,7 +98,7 @@ cifs_read_super(struct super_block *sb, void *data,
|
|||||||
|
|
||||||
/* BB should we make this contingent on mount parm? */
|
/* BB should we make this contingent on mount parm? */
|
||||||
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
||||||
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info),GFP_KERNEL);
|
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
|
||||||
cifs_sb = CIFS_SB(sb);
|
cifs_sb = CIFS_SB(sb);
|
||||||
if (cifs_sb == NULL)
|
if (cifs_sb == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -117,9 +117,10 @@ cifs_read_super(struct super_block *sb, void *data,
|
|||||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||||
if (experimEnabled != 0)
|
if (experimEnabled != 0)
|
||||||
sb->s_export_op = &cifs_export_ops;
|
sb->s_export_op = &cifs_export_ops;
|
||||||
#endif /* EXPERIMENTAL */
|
#endif /* EXPERIMENTAL */
|
||||||
/* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512)
|
/* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512)
|
||||||
sb->s_blocksize = cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */
|
sb->s_blocksize =
|
||||||
|
cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */
|
||||||
#ifdef CONFIG_CIFS_QUOTA
|
#ifdef CONFIG_CIFS_QUOTA
|
||||||
sb->s_qcop = &cifs_quotactl_ops;
|
sb->s_qcop = &cifs_quotactl_ops;
|
||||||
#endif
|
#endif
|
||||||
@ -164,10 +165,10 @@ cifs_put_super(struct super_block *sb)
|
|||||||
cFYI(1, ("In cifs_put_super"));
|
cFYI(1, ("In cifs_put_super"));
|
||||||
cifs_sb = CIFS_SB(sb);
|
cifs_sb = CIFS_SB(sb);
|
||||||
if (cifs_sb == NULL) {
|
if (cifs_sb == NULL) {
|
||||||
cFYI(1,("Empty cifs superblock info passed to unmount"));
|
cFYI(1, ("Empty cifs superblock info passed to unmount"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rc = cifs_umount(sb, cifs_sb);
|
rc = cifs_umount(sb, cifs_sb);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
cERROR(1, ("cifs_umount failed with return code %d", rc));
|
cERROR(1, ("cifs_umount failed with return code %d", rc));
|
||||||
}
|
}
|
||||||
@ -180,7 +181,7 @@ static int
|
|||||||
cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct super_block *sb = dentry->d_sb;
|
struct super_block *sb = dentry->d_sb;
|
||||||
int xid;
|
int xid;
|
||||||
int rc = -EOPNOTSUPP;
|
int rc = -EOPNOTSUPP;
|
||||||
struct cifs_sb_info *cifs_sb;
|
struct cifs_sb_info *cifs_sb;
|
||||||
struct cifsTconInfo *pTcon;
|
struct cifsTconInfo *pTcon;
|
||||||
@ -193,7 +194,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||||||
buf->f_type = CIFS_MAGIC_NUMBER;
|
buf->f_type = CIFS_MAGIC_NUMBER;
|
||||||
|
|
||||||
/* instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO */
|
/* instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO */
|
||||||
buf->f_namelen = PATH_MAX; /* PATH_MAX may be too long - it would
|
buf->f_namelen = PATH_MAX; /* PATH_MAX may be too long - it would
|
||||||
presumably be total path, but note
|
presumably be total path, but note
|
||||||
that some servers (includinng Samba 3)
|
that some servers (includinng Samba 3)
|
||||||
have a shorter maximum path */
|
have a shorter maximum path */
|
||||||
@ -217,8 +218,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||||||
bypassed it because we detected that this was an older LANMAN sess */
|
bypassed it because we detected that this was an older LANMAN sess */
|
||||||
if (rc)
|
if (rc)
|
||||||
rc = SMBOldQFSInfo(xid, pTcon, buf);
|
rc = SMBOldQFSInfo(xid, pTcon, buf);
|
||||||
/*
|
/* int f_type;
|
||||||
int f_type;
|
|
||||||
__fsid_t f_fsid;
|
__fsid_t f_fsid;
|
||||||
int f_namelen; */
|
int f_namelen; */
|
||||||
/* BB get from info in tcon struct at mount time call to QFSAttrInfo */
|
/* BB get from info in tcon struct at mount time call to QFSAttrInfo */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* fs/cifs/misc.c
|
* fs/cifs/misc.c
|
||||||
*
|
*
|
||||||
* Copyright (C) International Business Machines Corp., 2002,2005
|
* Copyright (C) International Business Machines Corp., 2002,2007
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
@ -49,7 +49,7 @@ _GetXid(void)
|
|||||||
GlobalTotalActiveXid++;
|
GlobalTotalActiveXid++;
|
||||||
if (GlobalTotalActiveXid > GlobalMaxActiveXid)
|
if (GlobalTotalActiveXid > GlobalMaxActiveXid)
|
||||||
GlobalMaxActiveXid = GlobalTotalActiveXid; /* keep high water mark for number of simultaneous vfs ops in our filesystem */
|
GlobalMaxActiveXid = GlobalTotalActiveXid; /* keep high water mark for number of simultaneous vfs ops in our filesystem */
|
||||||
if(GlobalTotalActiveXid > 65000)
|
if (GlobalTotalActiveXid > 65000)
|
||||||
cFYI(1,("warning: more than 65000 requests active"));
|
cFYI(1,("warning: more than 65000 requests active"));
|
||||||
xid = GlobalCurrentXid++;
|
xid = GlobalCurrentXid++;
|
||||||
spin_unlock(&GlobalMid_Lock);
|
spin_unlock(&GlobalMid_Lock);
|
||||||
@ -60,7 +60,7 @@ void
|
|||||||
_FreeXid(unsigned int xid)
|
_FreeXid(unsigned int xid)
|
||||||
{
|
{
|
||||||
spin_lock(&GlobalMid_Lock);
|
spin_lock(&GlobalMid_Lock);
|
||||||
/* if(GlobalTotalActiveXid == 0)
|
/* if (GlobalTotalActiveXid == 0)
|
||||||
BUG(); */
|
BUG(); */
|
||||||
GlobalTotalActiveXid--;
|
GlobalTotalActiveXid--;
|
||||||
spin_unlock(&GlobalMid_Lock);
|
spin_unlock(&GlobalMid_Lock);
|
||||||
@ -242,7 +242,7 @@ __u16 GetNextMid(struct TCP_Server_Info *server)
|
|||||||
__u16 last_mid;
|
__u16 last_mid;
|
||||||
int collision;
|
int collision;
|
||||||
|
|
||||||
if(server == NULL)
|
if (server == NULL)
|
||||||
return mid;
|
return mid;
|
||||||
|
|
||||||
spin_lock(&GlobalMid_Lock);
|
spin_lock(&GlobalMid_Lock);
|
||||||
@ -260,7 +260,7 @@ __u16 GetNextMid(struct TCP_Server_Info *server)
|
|||||||
struct mid_q_entry *mid_entry;
|
struct mid_q_entry *mid_entry;
|
||||||
|
|
||||||
collision = 0;
|
collision = 0;
|
||||||
if(server->CurrentMid == 0)
|
if (server->CurrentMid == 0)
|
||||||
server->CurrentMid++;
|
server->CurrentMid++;
|
||||||
|
|
||||||
list_for_each(tmp, &server->pending_mid_q) {
|
list_for_each(tmp, &server->pending_mid_q) {
|
||||||
@ -273,7 +273,7 @@ __u16 GetNextMid(struct TCP_Server_Info *server)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(collision == 0) {
|
if (collision == 0) {
|
||||||
mid = server->CurrentMid;
|
mid = server->CurrentMid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -325,7 +325,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
|
|||||||
/* Uid is not converted */
|
/* Uid is not converted */
|
||||||
buffer->Uid = treeCon->ses->Suid;
|
buffer->Uid = treeCon->ses->Suid;
|
||||||
buffer->Mid = GetNextMid(treeCon->ses->server);
|
buffer->Mid = GetNextMid(treeCon->ses->server);
|
||||||
if(multiuser_mount != 0) {
|
if (multiuser_mount != 0) {
|
||||||
/* For the multiuser case, there are few obvious technically */
|
/* For the multiuser case, there are few obvious technically */
|
||||||
/* possible mechanisms to match the local linux user (uid) */
|
/* possible mechanisms to match the local linux user (uid) */
|
||||||
/* to a valid remote smb user (smb_uid): */
|
/* to a valid remote smb user (smb_uid): */
|
||||||
@ -350,13 +350,13 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
|
|||||||
/* BB Add support for establishing new tCon and SMB Session */
|
/* BB Add support for establishing new tCon and SMB Session */
|
||||||
/* with userid/password pairs found on the smb session */
|
/* with userid/password pairs found on the smb session */
|
||||||
/* for other target tcp/ip addresses BB */
|
/* for other target tcp/ip addresses BB */
|
||||||
if(current->fsuid != treeCon->ses->linux_uid) {
|
if (current->fsuid != treeCon->ses->linux_uid) {
|
||||||
cFYI(1,("Multiuser mode and UID did not match tcon uid"));
|
cFYI(1,("Multiuser mode and UID did not match tcon uid"));
|
||||||
read_lock(&GlobalSMBSeslock);
|
read_lock(&GlobalSMBSeslock);
|
||||||
list_for_each(temp_item, &GlobalSMBSessionList) {
|
list_for_each(temp_item, &GlobalSMBSessionList) {
|
||||||
ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList);
|
ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList);
|
||||||
if(ses->linux_uid == current->fsuid) {
|
if (ses->linux_uid == current->fsuid) {
|
||||||
if(ses->server == treeCon->ses->server) {
|
if (ses->server == treeCon->ses->server) {
|
||||||
cFYI(1,("found matching uid substitute right smb_uid"));
|
cFYI(1,("found matching uid substitute right smb_uid"));
|
||||||
buffer->Uid = ses->Suid;
|
buffer->Uid = ses->Suid;
|
||||||
break;
|
break;
|
||||||
@ -374,8 +374,8 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
|
|||||||
buffer->Flags2 |= SMBFLG2_DFS;
|
buffer->Flags2 |= SMBFLG2_DFS;
|
||||||
if (treeCon->nocase)
|
if (treeCon->nocase)
|
||||||
buffer->Flags |= SMBFLG_CASELESS;
|
buffer->Flags |= SMBFLG_CASELESS;
|
||||||
if((treeCon->ses) && (treeCon->ses->server))
|
if ((treeCon->ses) && (treeCon->ses->server))
|
||||||
if(treeCon->ses->server->secMode &
|
if (treeCon->ses->server->secMode &
|
||||||
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
|
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
|
||||||
buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
|
buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
|
||||||
}
|
}
|
||||||
@ -392,11 +392,11 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid)
|
|||||||
and that the message ids match */
|
and that the message ids match */
|
||||||
if ((*(__le32 *) smb->Protocol == cpu_to_le32(0x424d53ff)) &&
|
if ((*(__le32 *) smb->Protocol == cpu_to_le32(0x424d53ff)) &&
|
||||||
(mid == smb->Mid)) {
|
(mid == smb->Mid)) {
|
||||||
if(smb->Flags & SMBFLG_RESPONSE)
|
if (smb->Flags & SMBFLG_RESPONSE)
|
||||||
return 0;
|
return 0;
|
||||||
else {
|
else {
|
||||||
/* only one valid case where server sends us request */
|
/* only one valid case where server sends us request */
|
||||||
if(smb->Command == SMB_COM_LOCKING_ANDX)
|
if (smb->Command == SMB_COM_LOCKING_ANDX)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
cERROR(1, ("Rcvd Request not response"));
|
cERROR(1, ("Rcvd Request not response"));
|
||||||
@ -458,16 +458,16 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
|
|||||||
return 1;
|
return 1;
|
||||||
clc_len = smbCalcSize_LE(smb);
|
clc_len = smbCalcSize_LE(smb);
|
||||||
|
|
||||||
if(4 + len != length) {
|
if (4 + len != length) {
|
||||||
cERROR(1, ("Length read does not match RFC1001 length %d",len));
|
cERROR(1, ("Length read does not match RFC1001 length %d",len));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (4 + len != clc_len) {
|
if (4 + len != clc_len) {
|
||||||
/* check if bcc wrapped around for large read responses */
|
/* check if bcc wrapped around for large read responses */
|
||||||
if((len > 64 * 1024) && (len > clc_len)) {
|
if ((len > 64 * 1024) && (len > clc_len)) {
|
||||||
/* check if lengths match mod 64K */
|
/* check if lengths match mod 64K */
|
||||||
if(((4 + len) & 0xFFFF) == (clc_len & 0xFFFF))
|
if (((4 + len) & 0xFFFF) == (clc_len & 0xFFFF))
|
||||||
return 0; /* bcc wrapped */
|
return 0; /* bcc wrapped */
|
||||||
}
|
}
|
||||||
cFYI(1, ("Calculated size %d vs length %d mismatch for mid %d",
|
cFYI(1, ("Calculated size %d vs length %d mismatch for mid %d",
|
||||||
@ -483,7 +483,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
|
|||||||
but server says length is 0x21 bytes too long as if the server
|
but server says length is 0x21 bytes too long as if the server
|
||||||
forget to reset the smb rfc1001 length when it reset the
|
forget to reset the smb rfc1001 length when it reset the
|
||||||
wct and bcc to minimum size and drop the t2 parms and data */
|
wct and bcc to minimum size and drop the t2 parms and data */
|
||||||
if((4+len > clc_len) && (len <= clc_len + 512))
|
if ((4+len > clc_len) && (len <= clc_len + 512))
|
||||||
return 0;
|
return 0;
|
||||||
else {
|
else {
|
||||||
cERROR(1, ("RFC1001 size %d bigger than SMB for Mid=%d",
|
cERROR(1, ("RFC1001 size %d bigger than SMB for Mid=%d",
|
||||||
@ -503,13 +503,13 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
|||||||
struct cifsFileInfo *netfile;
|
struct cifsFileInfo *netfile;
|
||||||
|
|
||||||
cFYI(1,("Checking for oplock break or dnotify response"));
|
cFYI(1,("Checking for oplock break or dnotify response"));
|
||||||
if((pSMB->hdr.Command == SMB_COM_NT_TRANSACT) &&
|
if ((pSMB->hdr.Command == SMB_COM_NT_TRANSACT) &&
|
||||||
(pSMB->hdr.Flags & SMBFLG_RESPONSE)) {
|
(pSMB->hdr.Flags & SMBFLG_RESPONSE)) {
|
||||||
struct smb_com_transaction_change_notify_rsp * pSMBr =
|
struct smb_com_transaction_change_notify_rsp * pSMBr =
|
||||||
(struct smb_com_transaction_change_notify_rsp *)buf;
|
(struct smb_com_transaction_change_notify_rsp *)buf;
|
||||||
struct file_notify_information * pnotify;
|
struct file_notify_information * pnotify;
|
||||||
__u32 data_offset = 0;
|
__u32 data_offset = 0;
|
||||||
if(pSMBr->ByteCount > sizeof(struct file_notify_information)) {
|
if (pSMBr->ByteCount > sizeof(struct file_notify_information)) {
|
||||||
data_offset = le32_to_cpu(pSMBr->DataOffset);
|
data_offset = le32_to_cpu(pSMBr->DataOffset);
|
||||||
|
|
||||||
pnotify = (struct file_notify_information *)
|
pnotify = (struct file_notify_information *)
|
||||||
@ -520,15 +520,15 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
|||||||
sizeof(struct smb_hdr)+60); */
|
sizeof(struct smb_hdr)+60); */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if(pSMBr->hdr.Status.CifsError) {
|
if (pSMBr->hdr.Status.CifsError) {
|
||||||
cFYI(1,("notify err 0x%d",pSMBr->hdr.Status.CifsError));
|
cFYI(1,("notify err 0x%d",pSMBr->hdr.Status.CifsError));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if(pSMB->hdr.Command != SMB_COM_LOCKING_ANDX)
|
if (pSMB->hdr.Command != SMB_COM_LOCKING_ANDX)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if(pSMB->hdr.Flags & SMBFLG_RESPONSE) {
|
if (pSMB->hdr.Flags & SMBFLG_RESPONSE) {
|
||||||
/* no sense logging error on invalid handle on oplock
|
/* no sense logging error on invalid handle on oplock
|
||||||
break - harmless race between close request and oplock
|
break - harmless race between close request and oplock
|
||||||
break response is expected from time to time writing out
|
break response is expected from time to time writing out
|
||||||
@ -544,11 +544,11 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
|||||||
return FALSE; /* on valid oplock brk we get "request" */
|
return FALSE; /* on valid oplock brk we get "request" */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(pSMB->hdr.WordCount != 8)
|
if (pSMB->hdr.WordCount != 8)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
cFYI(1,(" oplock type 0x%d level 0x%d",pSMB->LockType,pSMB->OplockLevel));
|
cFYI(1,(" oplock type 0x%d level 0x%d",pSMB->LockType,pSMB->OplockLevel));
|
||||||
if(!(pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE))
|
if (!(pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* look up tcon based on tid & uid */
|
/* look up tcon based on tid & uid */
|
||||||
@ -560,14 +560,14 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
|||||||
list_for_each(tmp1,&tcon->openFileList){
|
list_for_each(tmp1,&tcon->openFileList){
|
||||||
netfile = list_entry(tmp1,struct cifsFileInfo,
|
netfile = list_entry(tmp1,struct cifsFileInfo,
|
||||||
tlist);
|
tlist);
|
||||||
if(pSMB->Fid == netfile->netfid) {
|
if (pSMB->Fid == netfile->netfid) {
|
||||||
struct cifsInodeInfo *pCifsInode;
|
struct cifsInodeInfo *pCifsInode;
|
||||||
read_unlock(&GlobalSMBSeslock);
|
read_unlock(&GlobalSMBSeslock);
|
||||||
cFYI(1,("file id match, oplock break"));
|
cFYI(1,("file id match, oplock break"));
|
||||||
pCifsInode =
|
pCifsInode =
|
||||||
CIFS_I(netfile->pInode);
|
CIFS_I(netfile->pInode);
|
||||||
pCifsInode->clientCanCacheAll = FALSE;
|
pCifsInode->clientCanCacheAll = FALSE;
|
||||||
if(pSMB->OplockLevel == 0)
|
if (pSMB->OplockLevel == 0)
|
||||||
pCifsInode->clientCanCacheRead
|
pCifsInode->clientCanCacheRead
|
||||||
= FALSE;
|
= FALSE;
|
||||||
pCifsInode->oplockPending = TRUE;
|
pCifsInode->oplockPending = TRUE;
|
||||||
@ -575,7 +575,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
|
|||||||
netfile->netfid,
|
netfile->netfid,
|
||||||
tcon);
|
tcon);
|
||||||
cFYI(1,("about to wake up oplock thd"));
|
cFYI(1,("about to wake up oplock thd"));
|
||||||
if(oplockThread)
|
if (oplockThread)
|
||||||
wake_up_process(oplockThread);
|
wake_up_process(oplockThread);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -681,7 +681,7 @@ cifs_convertUCSpath(char *target, const __le16 * source, int maxlen,
|
|||||||
default:
|
default:
|
||||||
len = cp->uni2char(src_char, &target[j],
|
len = cp->uni2char(src_char, &target[j],
|
||||||
NLS_MAX_CHARSET_SIZE);
|
NLS_MAX_CHARSET_SIZE);
|
||||||
if(len > 0) {
|
if (len > 0) {
|
||||||
j += len;
|
j += len;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
@ -690,7 +690,7 @@ cifs_convertUCSpath(char *target, const __le16 * source, int maxlen,
|
|||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
/* make sure we do not overrun callers allocated temp buffer */
|
/* make sure we do not overrun callers allocated temp buffer */
|
||||||
if(j >= (2 * NAME_MAX))
|
if (j >= (2 * NAME_MAX))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cUCS_out:
|
cUCS_out:
|
||||||
@ -711,7 +711,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
|
|||||||
char src_char;
|
char src_char;
|
||||||
__u16 temp;
|
__u16 temp;
|
||||||
|
|
||||||
if(!mapChars)
|
if (!mapChars)
|
||||||
return cifs_strtoUCS(target, source, PATH_MAX, cp);
|
return cifs_strtoUCS(target, source, PATH_MAX, cp);
|
||||||
|
|
||||||
for(i = 0, j = 0; i < maxlen; j++) {
|
for(i = 0, j = 0; i < maxlen; j++) {
|
||||||
@ -749,7 +749,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
|
|||||||
len_remaining, &temp);
|
len_remaining, &temp);
|
||||||
/* if no match, use question mark, which
|
/* if no match, use question mark, which
|
||||||
at least in some cases servers as wild card */
|
at least in some cases servers as wild card */
|
||||||
if(charlen < 1) {
|
if (charlen < 1) {
|
||||||
target[j] = cpu_to_le16(0x003f);
|
target[j] = cpu_to_le16(0x003f);
|
||||||
charlen = 1;
|
charlen = 1;
|
||||||
} else
|
} else
|
||||||
|
@ -140,9 +140,9 @@ cifs_inet_pton(int address_family, char *cp,void *dst)
|
|||||||
/* calculate length by finding first slash or NULL */
|
/* calculate length by finding first slash or NULL */
|
||||||
/* BB Should we convert '/' slash to '\' here since it seems already done
|
/* BB Should we convert '/' slash to '\' here since it seems already done
|
||||||
before this */
|
before this */
|
||||||
if( address_family == AF_INET ){
|
if ( address_family == AF_INET ) {
|
||||||
ret = in4_pton(cp, -1 /* len */, dst , '\\', NULL);
|
ret = in4_pton(cp, -1 /* len */, dst , '\\', NULL);
|
||||||
} else if( address_family == AF_INET6 ){
|
} else if ( address_family == AF_INET6 ) {
|
||||||
ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
|
ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_CIFS_DEBUG2
|
#ifdef CONFIG_CIFS_DEBUG2
|
||||||
@ -773,7 +773,7 @@ map_smb_to_linux_error(struct smb_hdr *smb)
|
|||||||
if (smb->Flags2 & SMBFLG2_ERR_STATUS) {
|
if (smb->Flags2 & SMBFLG2_ERR_STATUS) {
|
||||||
/* translate the newer STATUS codes to old style errors and then to POSIX errors */
|
/* translate the newer STATUS codes to old style errors and then to POSIX errors */
|
||||||
__u32 err = le32_to_cpu(smb->Status.CifsError);
|
__u32 err = le32_to_cpu(smb->Status.CifsError);
|
||||||
if(cifsFYI & CIFS_RC)
|
if (cifsFYI & CIFS_RC)
|
||||||
cifs_print_status(err);
|
cifs_print_status(err);
|
||||||
ntstatus_to_dos(err, &smberrclass, &smberrcode);
|
ntstatus_to_dos(err, &smberrclass, &smberrcode);
|
||||||
} else {
|
} else {
|
||||||
@ -889,15 +889,15 @@ struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
|
|||||||
|
|
||||||
sec = 2 * st->TwoSeconds;
|
sec = 2 * st->TwoSeconds;
|
||||||
min = st->Minutes;
|
min = st->Minutes;
|
||||||
if((sec > 59) || (min > 59))
|
if ((sec > 59) || (min > 59))
|
||||||
cERROR(1,("illegal time min %d sec %d", min, sec));
|
cERROR(1,("illegal time min %d sec %d", min, sec));
|
||||||
sec += (min * 60);
|
sec += (min * 60);
|
||||||
sec += 60 * 60 * st->Hours;
|
sec += 60 * 60 * st->Hours;
|
||||||
if(st->Hours > 24)
|
if (st->Hours > 24)
|
||||||
cERROR(1,("illegal hours %d",st->Hours));
|
cERROR(1,("illegal hours %d",st->Hours));
|
||||||
days = sd->Day;
|
days = sd->Day;
|
||||||
month = sd->Month;
|
month = sd->Month;
|
||||||
if((days > 31) || (month > 12))
|
if ((days > 31) || (month > 12))
|
||||||
cERROR(1,("illegal date, month %d day: %d", month, days));
|
cERROR(1,("illegal date, month %d day: %d", month, days));
|
||||||
month -= 1;
|
month -= 1;
|
||||||
days += total_days_of_prev_months[month];
|
days += total_days_of_prev_months[month];
|
||||||
@ -911,13 +911,13 @@ struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
|
|||||||
consider 2 special case years, ie the years 2000 and 2100, and only
|
consider 2 special case years, ie the years 2000 and 2100, and only
|
||||||
adjust for the lack of leap year for the year 2100, as 2000 was a
|
adjust for the lack of leap year for the year 2100, as 2000 was a
|
||||||
leap year (divisable by 400) */
|
leap year (divisable by 400) */
|
||||||
if(year >= 120) /* the year 2100 */
|
if (year >= 120) /* the year 2100 */
|
||||||
days = days - 1; /* do not count leap year for the year 2100 */
|
days = days - 1; /* do not count leap year for the year 2100 */
|
||||||
|
|
||||||
/* adjust for leap year where we are still before leap day */
|
/* adjust for leap year where we are still before leap day */
|
||||||
if(year != 120)
|
if (year != 120)
|
||||||
days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
|
days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
|
||||||
sec += 24 * 60 * 60 * days;
|
sec += 24 * 60 * 60 * days;
|
||||||
|
|
||||||
ts.tv_sec = sec;
|
ts.tv_sec = sec;
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AdjustForTZ(struct cifsTconInfo * tcon, struct inode * inode)
|
static void AdjustForTZ(struct cifsTconInfo *tcon, struct inode *inode)
|
||||||
{
|
{
|
||||||
if ((tcon) && (tcon->ses) && (tcon->ses->server)) {
|
if ((tcon) && (tcon->ses) && (tcon->ses->server)) {
|
||||||
inode->i_ctime.tv_sec += tcon->ses->server->timeAdj;
|
inode->i_ctime.tv_sec += tcon->ses->server->timeAdj;
|
||||||
@ -122,7 +122,7 @@ static void AdjustForTZ(struct cifsTconInfo * tcon, struct inode * inode)
|
|||||||
|
|
||||||
|
|
||||||
static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
||||||
char * buf, int *pobject_type, int isNewInode)
|
char *buf, int *pobject_type, int isNewInode)
|
||||||
{
|
{
|
||||||
loff_t local_size;
|
loff_t local_size;
|
||||||
struct timespec local_mtime;
|
struct timespec local_mtime;
|
||||||
@ -151,7 +151,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
|
cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
|
||||||
} else { /* legacy, OS2 and DOS style */
|
} else { /* legacy, OS2 and DOS style */
|
||||||
/* struct timespec ts;*/
|
/* struct timespec ts;*/
|
||||||
FIND_FILE_STANDARD_INFO * pfindData =
|
FIND_FILE_STANDARD_INFO * pfindData =
|
||||||
(FIND_FILE_STANDARD_INFO *)buf;
|
(FIND_FILE_STANDARD_INFO *)buf;
|
||||||
|
|
||||||
tmp_inode->i_mtime = cnvrtDosUnixTm(
|
tmp_inode->i_mtime = cnvrtDosUnixTm(
|
||||||
@ -176,7 +176,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
|
|
||||||
/* treat dos attribute of read-only as read-only mode bit e.g. 555? */
|
/* treat dos attribute of read-only as read-only mode bit e.g. 555? */
|
||||||
/* 2767 perms - indicate mandatory locking */
|
/* 2767 perms - indicate mandatory locking */
|
||||||
/* BB fill in uid and gid here? with help from winbind?
|
/* BB fill in uid and gid here? with help from winbind?
|
||||||
or retrieve from NTFS stream extended attribute */
|
or retrieve from NTFS stream extended attribute */
|
||||||
if (atomic_read(&cifsInfo->inUse) == 0) {
|
if (atomic_read(&cifsInfo->inUse) == 0) {
|
||||||
tmp_inode->i_uid = cifs_sb->mnt_uid;
|
tmp_inode->i_uid = cifs_sb->mnt_uid;
|
||||||
@ -197,7 +197,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
tmp_inode->i_mode = cifs_sb->mnt_dir_mode;
|
tmp_inode->i_mode = cifs_sb->mnt_dir_mode;
|
||||||
}
|
}
|
||||||
tmp_inode->i_mode |= S_IFDIR;
|
tmp_inode->i_mode |= S_IFDIR;
|
||||||
} else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
|
} else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) &&
|
||||||
(attr & ATTR_SYSTEM)) {
|
(attr & ATTR_SYSTEM)) {
|
||||||
if (end_of_file == 0) {
|
if (end_of_file == 0) {
|
||||||
*pobject_type = DT_FIFO;
|
*pobject_type = DT_FIFO;
|
||||||
@ -207,13 +207,13 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
inode as needing revalidate and get the real type
|
inode as needing revalidate and get the real type
|
||||||
(blk vs chr vs. symlink) later ie in lookup */
|
(blk vs chr vs. symlink) later ie in lookup */
|
||||||
*pobject_type = DT_REG;
|
*pobject_type = DT_REG;
|
||||||
tmp_inode->i_mode |= S_IFREG;
|
tmp_inode->i_mode |= S_IFREG;
|
||||||
cifsInfo->time = 0;
|
cifsInfo->time = 0;
|
||||||
}
|
}
|
||||||
/* we no longer mark these because we could not follow them */
|
/* we no longer mark these because we could not follow them */
|
||||||
/* } else if (attr & ATTR_REPARSE) {
|
/* } else if (attr & ATTR_REPARSE) {
|
||||||
*pobject_type = DT_LNK;
|
*pobject_type = DT_LNK;
|
||||||
tmp_inode->i_mode |= S_IFLNK; */
|
tmp_inode->i_mode |= S_IFLNK; */
|
||||||
} else {
|
} else {
|
||||||
*pobject_type = DT_REG;
|
*pobject_type = DT_REG;
|
||||||
tmp_inode->i_mode |= S_IFREG;
|
tmp_inode->i_mode |= S_IFREG;
|
||||||
@ -221,7 +221,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
tmp_inode->i_mode &= ~(S_IWUGO);
|
tmp_inode->i_mode &= ~(S_IWUGO);
|
||||||
else if ((tmp_inode->i_mode & S_IWUGO) == 0)
|
else if ((tmp_inode->i_mode & S_IWUGO) == 0)
|
||||||
/* the ATTR_READONLY flag may have been changed on */
|
/* the ATTR_READONLY flag may have been changed on */
|
||||||
/* server -- set any w bits allowed by mnt_file_mode */
|
/* server -- set any w bits allowed by mnt_file_mode */
|
||||||
tmp_inode->i_mode |= (S_IWUGO & cifs_sb->mnt_file_mode);
|
tmp_inode->i_mode |= (S_IWUGO & cifs_sb->mnt_file_mode);
|
||||||
} /* could add code here - to validate if device or weird share type? */
|
} /* could add code here - to validate if device or weird share type? */
|
||||||
|
|
||||||
@ -232,7 +232,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
|
|||||||
|
|
||||||
spin_lock(&tmp_inode->i_lock);
|
spin_lock(&tmp_inode->i_lock);
|
||||||
if (is_size_safe_to_change(cifsInfo, end_of_file)) {
|
if (is_size_safe_to_change(cifsInfo, end_of_file)) {
|
||||||
/* can not safely change the file size here if the
|
/* can not safely change the file size here if the
|
||||||
client is writing to it due to potential races */
|
client is writing to it due to potential races */
|
||||||
i_size_write(tmp_inode, end_of_file);
|
i_size_write(tmp_inode, end_of_file);
|
||||||
|
|
||||||
@ -323,8 +323,8 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
|
|
||||||
tmp_inode->i_mode = le64_to_cpu(pfindData->Permissions);
|
tmp_inode->i_mode = le64_to_cpu(pfindData->Permissions);
|
||||||
/* since we set the inode type below we need to mask off type
|
/* since we set the inode type below we need to mask off type
|
||||||
to avoid strange results if bits above were corrupt */
|
to avoid strange results if bits above were corrupt */
|
||||||
tmp_inode->i_mode &= ~S_IFMT;
|
tmp_inode->i_mode &= ~S_IFMT;
|
||||||
if (type == UNIX_FILE) {
|
if (type == UNIX_FILE) {
|
||||||
*pobject_type = DT_REG;
|
*pobject_type = DT_REG;
|
||||||
tmp_inode->i_mode |= S_IFREG;
|
tmp_inode->i_mode |= S_IFREG;
|
||||||
@ -354,7 +354,7 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
/* safest to just call it a file */
|
/* safest to just call it a file */
|
||||||
*pobject_type = DT_REG;
|
*pobject_type = DT_REG;
|
||||||
tmp_inode->i_mode |= S_IFREG;
|
tmp_inode->i_mode |= S_IFREG;
|
||||||
cFYI(1,("unknown inode type %d",type));
|
cFYI(1, ("unknown inode type %d", type));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
|
||||||
@ -369,7 +369,7 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
|
|
||||||
spin_lock(&tmp_inode->i_lock);
|
spin_lock(&tmp_inode->i_lock);
|
||||||
if (is_size_safe_to_change(cifsInfo, end_of_file)) {
|
if (is_size_safe_to_change(cifsInfo, end_of_file)) {
|
||||||
/* can not safely change the file size here if the
|
/* can not safely change the file size here if the
|
||||||
client is writing to it due to potential races */
|
client is writing to it due to potential races */
|
||||||
i_size_write(tmp_inode, end_of_file);
|
i_size_write(tmp_inode, end_of_file);
|
||||||
|
|
||||||
@ -394,15 +394,16 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
tmp_inode->i_fop = &cifs_file_ops;
|
tmp_inode->i_fop = &cifs_file_ops;
|
||||||
|
|
||||||
if ((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
if ((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
||||||
(cifs_sb->tcon->ses->server->maxBuf <
|
(cifs_sb->tcon->ses->server->maxBuf <
|
||||||
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
|
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
|
||||||
tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
||||||
else
|
else
|
||||||
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
||||||
|
|
||||||
if (isNewInode)
|
if (isNewInode)
|
||||||
return; /* No sense invalidating pages for new inode since we
|
return; /* No sense invalidating pages for new inode
|
||||||
have not started caching readahead file data yet */
|
since we have not started caching readahead
|
||||||
|
file data for it yet */
|
||||||
|
|
||||||
if (timespec_equal(&tmp_inode->i_mtime, &local_mtime) &&
|
if (timespec_equal(&tmp_inode->i_mtime, &local_mtime) &&
|
||||||
(local_size == tmp_inode->i_size)) {
|
(local_size == tmp_inode->i_size)) {
|
||||||
@ -421,7 +422,7 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
tmp_inode->i_op = &cifs_symlink_inode_ops;
|
tmp_inode->i_op = &cifs_symlink_inode_ops;
|
||||||
/* tmp_inode->i_fop = *//* do not need to set to anything */
|
/* tmp_inode->i_fop = *//* do not need to set to anything */
|
||||||
} else {
|
} else {
|
||||||
cFYI(1, ("Special inode"));
|
cFYI(1, ("Special inode"));
|
||||||
init_special_inode(tmp_inode, tmp_inode->i_mode,
|
init_special_inode(tmp_inode, tmp_inode->i_mode,
|
||||||
tmp_inode->i_rdev);
|
tmp_inode->i_rdev);
|
||||||
}
|
}
|
||||||
@ -500,7 +501,7 @@ static int cifs_unicode_bytelen(char *str)
|
|||||||
if (ustr[len] == 0)
|
if (ustr[len] == 0)
|
||||||
return len << 1;
|
return len << 1;
|
||||||
}
|
}
|
||||||
cFYI(1,("Unicode string longer than PATH_MAX found"));
|
cFYI(1, ("Unicode string longer than PATH_MAX found"));
|
||||||
return len << 1;
|
return len << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,7 +518,7 @@ static char *nxt_dir_entry(char *old_entry, char *end_of_smb, int level)
|
|||||||
pfData->FileNameLength;
|
pfData->FileNameLength;
|
||||||
} else
|
} else
|
||||||
new_entry = old_entry + le32_to_cpu(pDirInfo->NextEntryOffset);
|
new_entry = old_entry + le32_to_cpu(pDirInfo->NextEntryOffset);
|
||||||
cFYI(1,("new entry %p old entry %p",new_entry,old_entry));
|
cFYI(1, ("new entry %p old entry %p", new_entry, old_entry));
|
||||||
/* validate that new_entry is not past end of SMB */
|
/* validate that new_entry is not past end of SMB */
|
||||||
if (new_entry >= end_of_smb) {
|
if (new_entry >= end_of_smb) {
|
||||||
cERROR(1,
|
cERROR(1,
|
||||||
@ -583,7 +584,8 @@ static int cifs_entry_is_dot(char *current_entry, struct cifsFileInfo *cfile)
|
|||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = pFindData->FileNameLength;
|
len = pFindData->FileNameLength;
|
||||||
} else {
|
} else {
|
||||||
cFYI(1,("Unknown findfirst level %d",cfile->srch_inf.info_level));
|
cFYI(1, ("Unknown findfirst level %d",
|
||||||
|
cfile->srch_inf.info_level));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename) {
|
if (filename) {
|
||||||
@ -604,7 +606,7 @@ static int cifs_entry_is_dot(char *current_entry, struct cifsFileInfo *cfile)
|
|||||||
if (filename[0] == '.')
|
if (filename[0] == '.')
|
||||||
rc = 1;
|
rc = 1;
|
||||||
} else if (len == 2) {
|
} else if (len == 2) {
|
||||||
if((filename[0] == '.') && (filename[1] == '.'))
|
if ((filename[0] == '.') && (filename[1] == '.'))
|
||||||
rc = 2;
|
rc = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -665,13 +667,13 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
|||||||
is_dir_changed(file)) ||
|
is_dir_changed(file)) ||
|
||||||
(index_to_find < first_entry_in_buffer)) {
|
(index_to_find < first_entry_in_buffer)) {
|
||||||
/* close and restart search */
|
/* close and restart search */
|
||||||
cFYI(1,("search backing up - close and restart search"));
|
cFYI(1, ("search backing up - close and restart search"));
|
||||||
cifsFile->invalidHandle = TRUE;
|
cifsFile->invalidHandle = TRUE;
|
||||||
CIFSFindClose(xid, pTcon, cifsFile->netfid);
|
CIFSFindClose(xid, pTcon, cifsFile->netfid);
|
||||||
kfree(cifsFile->search_resume_name);
|
kfree(cifsFile->search_resume_name);
|
||||||
cifsFile->search_resume_name = NULL;
|
cifsFile->search_resume_name = NULL;
|
||||||
if (cifsFile->srch_inf.ntwrk_buf_start) {
|
if (cifsFile->srch_inf.ntwrk_buf_start) {
|
||||||
cFYI(1,("freeing SMB ff cache buf on search rewind"));
|
cFYI(1, ("freeing SMB ff cache buf on search rewind"));
|
||||||
if (cifsFile->srch_inf.smallBuf)
|
if (cifsFile->srch_inf.smallBuf)
|
||||||
cifs_small_buf_release(cifsFile->srch_inf.
|
cifs_small_buf_release(cifsFile->srch_inf.
|
||||||
ntwrk_buf_start);
|
ntwrk_buf_start);
|
||||||
@ -681,14 +683,15 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
|||||||
}
|
}
|
||||||
rc = initiate_cifs_search(xid,file);
|
rc = initiate_cifs_search(xid,file);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
cFYI(1,("error %d reinitiating a search on rewind",rc));
|
cFYI(1, ("error %d reinitiating a search on rewind",
|
||||||
|
rc));
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
|
while((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
|
||||||
(rc == 0) && (cifsFile->srch_inf.endOfSearch == FALSE)){
|
(rc == 0) && (cifsFile->srch_inf.endOfSearch == FALSE)){
|
||||||
cFYI(1,("calling findnext2"));
|
cFYI(1, ("calling findnext2"));
|
||||||
rc = CIFSFindNext(xid,pTcon,cifsFile->netfid,
|
rc = CIFSFindNext(xid,pTcon,cifsFile->netfid,
|
||||||
&cifsFile->srch_inf);
|
&cifsFile->srch_inf);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -707,14 +710,14 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
|||||||
first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry
|
first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry
|
||||||
- cifsFile->srch_inf.entries_in_buffer;
|
- cifsFile->srch_inf.entries_in_buffer;
|
||||||
pos_in_buf = index_to_find - first_entry_in_buffer;
|
pos_in_buf = index_to_find - first_entry_in_buffer;
|
||||||
cFYI(1,("found entry - pos_in_buf %d",pos_in_buf));
|
cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf));
|
||||||
|
|
||||||
for(i=0;(i<(pos_in_buf)) && (current_entry != NULL);i++) {
|
for(i=0;(i<(pos_in_buf)) && (current_entry != NULL);i++) {
|
||||||
/* go entry by entry figuring out which is first */
|
/* go entry by entry figuring out which is first */
|
||||||
current_entry = nxt_dir_entry(current_entry,end_of_smb,
|
current_entry = nxt_dir_entry(current_entry,end_of_smb,
|
||||||
cifsFile->srch_inf.info_level);
|
cifsFile->srch_inf.info_level);
|
||||||
}
|
}
|
||||||
if((current_entry == NULL) && (i < pos_in_buf)) {
|
if ((current_entry == NULL) && (i < pos_in_buf)) {
|
||||||
/* BB fixme - check if we should flag this error */
|
/* BB fixme - check if we should flag this error */
|
||||||
cERROR(1,("reached end of buf searching for pos in buf"
|
cERROR(1,("reached end of buf searching for pos in buf"
|
||||||
" %d index to find %lld rc %d",
|
" %d index to find %lld rc %d",
|
||||||
@ -723,12 +726,12 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
|||||||
rc = 0;
|
rc = 0;
|
||||||
*ppCurrentEntry = current_entry;
|
*ppCurrentEntry = current_entry;
|
||||||
} else {
|
} else {
|
||||||
cFYI(1,("index not in buffer - could not findnext into it"));
|
cFYI(1, ("index not in buffer - could not findnext into it"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pos_in_buf >= cifsFile->srch_inf.entries_in_buffer) {
|
if (pos_in_buf >= cifsFile->srch_inf.entries_in_buffer) {
|
||||||
cFYI(1,("can not return entries pos_in_buf beyond last entry"));
|
cFYI(1, ("can not return entries pos_in_buf beyond last"));
|
||||||
*num_to_ret = 0;
|
*num_to_ret = 0;
|
||||||
} else
|
} else
|
||||||
*num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf;
|
*num_to_ret = cifsFile->srch_inf.entries_in_buffer - pos_in_buf;
|
||||||
@ -748,11 +751,11 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
|
|||||||
|
|
||||||
*pinum = 0;
|
*pinum = 0;
|
||||||
|
|
||||||
if(level == SMB_FIND_FILE_UNIX) {
|
if (level == SMB_FIND_FILE_UNIX) {
|
||||||
FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry;
|
FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry;
|
||||||
|
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
if(unicode) {
|
if (unicode) {
|
||||||
len = cifs_unicode_bytelen(filename);
|
len = cifs_unicode_bytelen(filename);
|
||||||
} else {
|
} else {
|
||||||
/* BB should we make this strnlen of PATH_MAX? */
|
/* BB should we make this strnlen of PATH_MAX? */
|
||||||
@ -760,49 +763,49 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* BB fixme - hash low and high 32 bits if not 64 bit arch BB fixme */
|
/* BB fixme - hash low and high 32 bits if not 64 bit arch BB fixme */
|
||||||
if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
||||||
*pinum = pFindData->UniqueId;
|
*pinum = pFindData->UniqueId;
|
||||||
} else if(level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
||||||
FILE_DIRECTORY_INFO * pFindData =
|
FILE_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_DIRECTORY_INFO *)current_entry;
|
(FILE_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
} else if(level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
||||||
FILE_FULL_DIRECTORY_INFO * pFindData =
|
FILE_FULL_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
} else if(level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
||||||
SEARCH_ID_FULL_DIR_INFO * pFindData =
|
SEARCH_ID_FULL_DIR_INFO * pFindData =
|
||||||
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
*pinum = pFindData->UniqueId;
|
*pinum = pFindData->UniqueId;
|
||||||
} else if(level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
||||||
FILE_BOTH_DIRECTORY_INFO * pFindData =
|
FILE_BOTH_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
} else if(level == SMB_FIND_FILE_INFO_STANDARD) {
|
} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
|
||||||
FIND_FILE_STANDARD_INFO * pFindData =
|
FIND_FILE_STANDARD_INFO * pFindData =
|
||||||
(FIND_FILE_STANDARD_INFO *)current_entry;
|
(FIND_FILE_STANDARD_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
/* one byte length, no name conversion */
|
/* one byte length, no name conversion */
|
||||||
len = (unsigned int)pFindData->FileNameLength;
|
len = (unsigned int)pFindData->FileNameLength;
|
||||||
} else {
|
} else {
|
||||||
cFYI(1,("Unknown findfirst level %d",level));
|
cFYI(1, ("Unknown findfirst level %d", level));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(len > max_len) {
|
if (len > max_len) {
|
||||||
cERROR(1,("bad search response length %d past smb end", len));
|
cERROR(1,("bad search response length %d past smb end", len));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(unicode) {
|
if (unicode) {
|
||||||
/* BB fixme - test with long names */
|
/* BB fixme - test with long names */
|
||||||
/* Note converted filename can be longer than in unicode */
|
/* Note converted filename can be longer than in unicode */
|
||||||
if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
|
||||||
pqst->len = cifs_convertUCSpath((char *)pqst->name,
|
pqst->len = cifs_convertUCSpath((char *)pqst->name,
|
||||||
(__le16 *)filename, len/2, nlt);
|
(__le16 *)filename, len/2, nlt);
|
||||||
else
|
else
|
||||||
@ -813,7 +816,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
|
|||||||
pqst->len = len;
|
pqst->len = len;
|
||||||
}
|
}
|
||||||
pqst->hash = full_name_hash(pqst->name,pqst->len);
|
pqst->hash = full_name_hash(pqst->name,pqst->len);
|
||||||
/* cFYI(1,("filldir on %s",pqst->name)); */
|
/* cFYI(1, ("filldir on %s",pqst->name)); */
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -832,17 +835,17 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
|||||||
/* get filename and len into qstring */
|
/* get filename and len into qstring */
|
||||||
/* get dentry */
|
/* get dentry */
|
||||||
/* decide whether to create and populate ionde */
|
/* decide whether to create and populate ionde */
|
||||||
if((direntry == NULL) || (file == NULL))
|
if ((direntry == NULL) || (file == NULL))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pCifsF = file->private_data;
|
pCifsF = file->private_data;
|
||||||
|
|
||||||
if((scratch_buf == NULL) || (pfindEntry == NULL) || (pCifsF == NULL))
|
if ((scratch_buf == NULL) || (pfindEntry == NULL) || (pCifsF == NULL))
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
rc = cifs_entry_is_dot(pfindEntry,pCifsF);
|
rc = cifs_entry_is_dot(pfindEntry,pCifsF);
|
||||||
/* skip . and .. since we added them first */
|
/* skip . and .. since we added them first */
|
||||||
if(rc != 0)
|
if (rc != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
||||||
@ -854,16 +857,16 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
|||||||
max_len,
|
max_len,
|
||||||
&inum /* returned */);
|
&inum /* returned */);
|
||||||
|
|
||||||
if(rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = construct_dentry(&qstring,file,&tmp_inode, &tmp_dentry);
|
rc = construct_dentry(&qstring,file,&tmp_inode, &tmp_dentry);
|
||||||
if((tmp_inode == NULL) || (tmp_dentry == NULL))
|
if ((tmp_inode == NULL) || (tmp_dentry == NULL))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if(rc) {
|
if (rc) {
|
||||||
/* inode created, we need to hash it with right inode number */
|
/* inode created, we need to hash it with right inode number */
|
||||||
if(inum != 0) {
|
if (inum != 0) {
|
||||||
/* BB fixme - hash the 2 32 quantities bits together if necessary BB */
|
/* BB fixme - hash the 2 32 quantities bits together if necessary BB */
|
||||||
tmp_inode->i_ino = inum;
|
tmp_inode->i_ino = inum;
|
||||||
}
|
}
|
||||||
@ -873,27 +876,27 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
|||||||
/* we pass in rc below, indicating whether it is a new inode,
|
/* we pass in rc below, indicating whether it is a new inode,
|
||||||
so we can figure out whether to invalidate the inode cached
|
so we can figure out whether to invalidate the inode cached
|
||||||
data if the file has changed */
|
data if the file has changed */
|
||||||
if(pCifsF->srch_inf.info_level == SMB_FIND_FILE_UNIX)
|
if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_UNIX)
|
||||||
unix_fill_in_inode(tmp_inode,
|
unix_fill_in_inode(tmp_inode,
|
||||||
(FILE_UNIX_INFO *)pfindEntry,
|
(FILE_UNIX_INFO *)pfindEntry,
|
||||||
&obj_type, rc);
|
&obj_type, rc);
|
||||||
else if(pCifsF->srch_inf.info_level == SMB_FIND_FILE_INFO_STANDARD)
|
else if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_INFO_STANDARD)
|
||||||
fill_in_inode(tmp_inode, 0 /* old level 1 buffer type */,
|
fill_in_inode(tmp_inode, 0 /* old level 1 buffer type */,
|
||||||
pfindEntry, &obj_type, rc);
|
pfindEntry, &obj_type, rc);
|
||||||
else
|
else
|
||||||
fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
|
fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
|
||||||
|
|
||||||
if(rc) /* new inode - needs to be tied to dentry */ {
|
if (rc) /* new inode - needs to be tied to dentry */ {
|
||||||
d_instantiate(tmp_dentry, tmp_inode);
|
d_instantiate(tmp_dentry, tmp_inode);
|
||||||
if(rc == 2)
|
if (rc == 2)
|
||||||
d_rehash(tmp_dentry);
|
d_rehash(tmp_dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,
|
rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,
|
||||||
tmp_inode->i_ino,obj_type);
|
tmp_inode->i_ino,obj_type);
|
||||||
if(rc) {
|
if (rc) {
|
||||||
cFYI(1,("filldir rc = %d",rc));
|
cFYI(1, ("filldir rc = %d", rc));
|
||||||
/* we can not return filldir errors to the caller
|
/* we can not return filldir errors to the caller
|
||||||
since they are "normal" when the stat blocksize
|
since they are "normal" when the stat blocksize
|
||||||
is too small - we return remapped error instead */
|
is too small - we return remapped error instead */
|
||||||
@ -912,47 +915,47 @@ static int cifs_save_resume_key(const char *current_entry,
|
|||||||
__u16 level;
|
__u16 level;
|
||||||
char * filename;
|
char * filename;
|
||||||
|
|
||||||
if((cifsFile == NULL) || (current_entry == NULL))
|
if ((cifsFile == NULL) || (current_entry == NULL))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
level = cifsFile->srch_inf.info_level;
|
level = cifsFile->srch_inf.info_level;
|
||||||
|
|
||||||
if(level == SMB_FIND_FILE_UNIX) {
|
if (level == SMB_FIND_FILE_UNIX) {
|
||||||
FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry;
|
FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry;
|
||||||
|
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
if(cifsFile->srch_inf.unicode) {
|
if (cifsFile->srch_inf.unicode) {
|
||||||
len = cifs_unicode_bytelen(filename);
|
len = cifs_unicode_bytelen(filename);
|
||||||
} else {
|
} else {
|
||||||
/* BB should we make this strnlen of PATH_MAX? */
|
/* BB should we make this strnlen of PATH_MAX? */
|
||||||
len = strnlen(filename, PATH_MAX);
|
len = strnlen(filename, PATH_MAX);
|
||||||
}
|
}
|
||||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||||
} else if(level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
||||||
FILE_DIRECTORY_INFO * pFindData =
|
FILE_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_DIRECTORY_INFO *)current_entry;
|
(FILE_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||||
} else if(level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
|
||||||
FILE_FULL_DIRECTORY_INFO * pFindData =
|
FILE_FULL_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
(FILE_FULL_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||||
} else if(level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
|
||||||
SEARCH_ID_FULL_DIR_INFO * pFindData =
|
SEARCH_ID_FULL_DIR_INFO * pFindData =
|
||||||
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
(SEARCH_ID_FULL_DIR_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||||
} else if(level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
|
||||||
FILE_BOTH_DIRECTORY_INFO * pFindData =
|
FILE_BOTH_DIRECTORY_INFO * pFindData =
|
||||||
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
(FILE_BOTH_DIRECTORY_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
len = le32_to_cpu(pFindData->FileNameLength);
|
len = le32_to_cpu(pFindData->FileNameLength);
|
||||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||||
} else if(level == SMB_FIND_FILE_INFO_STANDARD) {
|
} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
|
||||||
FIND_FILE_STANDARD_INFO * pFindData =
|
FIND_FILE_STANDARD_INFO * pFindData =
|
||||||
(FIND_FILE_STANDARD_INFO *)current_entry;
|
(FIND_FILE_STANDARD_INFO *)current_entry;
|
||||||
filename = &pFindData->FileName[0];
|
filename = &pFindData->FileName[0];
|
||||||
@ -960,7 +963,7 @@ static int cifs_save_resume_key(const char *current_entry,
|
|||||||
len = (unsigned int)pFindData->FileNameLength;
|
len = (unsigned int)pFindData->FileNameLength;
|
||||||
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
|
||||||
} else {
|
} else {
|
||||||
cFYI(1,("Unknown findfirst level %d",level));
|
cFYI(1, ("Unknown findfirst level %d", level));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
cifsFile->srch_inf.resume_name_len = len;
|
cifsFile->srch_inf.resume_name_len = len;
|
||||||
@ -985,7 +988,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||||||
|
|
||||||
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
||||||
pTcon = cifs_sb->tcon;
|
pTcon = cifs_sb->tcon;
|
||||||
if(pTcon == NULL)
|
if (pTcon == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
switch ((int) file->f_pos) {
|
switch ((int) file->f_pos) {
|
||||||
@ -1011,22 +1014,22 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||||||
if it before then restart search
|
if it before then restart search
|
||||||
if after then keep searching till find it */
|
if after then keep searching till find it */
|
||||||
|
|
||||||
if(file->private_data == NULL) {
|
if (file->private_data == NULL) {
|
||||||
rc = initiate_cifs_search(xid,file);
|
rc = initiate_cifs_search(xid,file);
|
||||||
cFYI(1,("initiate cifs search rc %d",rc));
|
cFYI(1, ("initiate cifs search rc %d", rc));
|
||||||
if(rc) {
|
if (rc) {
|
||||||
FreeXid(xid);
|
FreeXid(xid);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(file->private_data == NULL) {
|
if (file->private_data == NULL) {
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
FreeXid(xid);
|
FreeXid(xid);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
cifsFile = file->private_data;
|
cifsFile = file->private_data;
|
||||||
if (cifsFile->srch_inf.endOfSearch) {
|
if (cifsFile->srch_inf.endOfSearch) {
|
||||||
if(cifsFile->srch_inf.emptyDir) {
|
if (cifsFile->srch_inf.emptyDir) {
|
||||||
cFYI(1, ("End of search, empty dir"));
|
cFYI(1, ("End of search, empty dir"));
|
||||||
rc = 0;
|
rc = 0;
|
||||||
break;
|
break;
|
||||||
@ -1040,17 +1043,17 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||||||
|
|
||||||
rc = find_cifs_entry(xid,pTcon, file,
|
rc = find_cifs_entry(xid,pTcon, file,
|
||||||
¤t_entry,&num_to_fill);
|
¤t_entry,&num_to_fill);
|
||||||
if(rc) {
|
if (rc) {
|
||||||
cFYI(1,("fce error %d",rc));
|
cFYI(1, ("fce error %d", rc));
|
||||||
goto rddir2_exit;
|
goto rddir2_exit;
|
||||||
} else if (current_entry != NULL) {
|
} else if (current_entry != NULL) {
|
||||||
cFYI(1,("entry %lld found",file->f_pos));
|
cFYI(1, ("entry %lld found", file->f_pos));
|
||||||
} else {
|
} else {
|
||||||
cFYI(1,("could not find entry"));
|
cFYI(1, ("could not find entry"));
|
||||||
goto rddir2_exit;
|
goto rddir2_exit;
|
||||||
}
|
}
|
||||||
cFYI(1,("loop through %d times filling dir for net buf %p",
|
cFYI(1, ("loop through %d times filling dir for net buf %p",
|
||||||
num_to_fill,cifsFile->srch_inf.ntwrk_buf_start));
|
num_to_fill, cifsFile->srch_inf.ntwrk_buf_start));
|
||||||
max_len = smbCalcSize((struct smb_hdr *)
|
max_len = smbCalcSize((struct smb_hdr *)
|
||||||
cifsFile->srch_inf.ntwrk_buf_start);
|
cifsFile->srch_inf.ntwrk_buf_start);
|
||||||
end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len;
|
end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len;
|
||||||
@ -1060,8 +1063,8 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||||||
such multibyte target UTF-8 characters. cifs_unicode.c,
|
such multibyte target UTF-8 characters. cifs_unicode.c,
|
||||||
which actually does the conversion, has the same limit */
|
which actually does the conversion, has the same limit */
|
||||||
tmp_buf = kmalloc((2 * NAME_MAX) + 4, GFP_KERNEL);
|
tmp_buf = kmalloc((2 * NAME_MAX) + 4, GFP_KERNEL);
|
||||||
for(i=0;(i<num_to_fill) && (rc == 0);i++) {
|
for (i = 0; (i < num_to_fill) && (rc == 0); i++) {
|
||||||
if(current_entry == NULL) {
|
if (current_entry == NULL) {
|
||||||
/* evaluate whether this case is an error */
|
/* evaluate whether this case is an error */
|
||||||
cERROR(1,("past end of SMB num to fill %d i %d",
|
cERROR(1,("past end of SMB num to fill %d i %d",
|
||||||
num_to_fill, i));
|
num_to_fill, i));
|
||||||
@ -1071,20 +1074,20 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||||||
we want to check for that here? */
|
we want to check for that here? */
|
||||||
rc = cifs_filldir(current_entry, file,
|
rc = cifs_filldir(current_entry, file,
|
||||||
filldir, direntry, tmp_buf, max_len);
|
filldir, direntry, tmp_buf, max_len);
|
||||||
if(rc == -EOVERFLOW) {
|
if (rc == -EOVERFLOW) {
|
||||||
rc = 0;
|
rc = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->f_pos++;
|
file->f_pos++;
|
||||||
if(file->f_pos ==
|
if (file->f_pos ==
|
||||||
cifsFile->srch_inf.index_of_last_entry) {
|
cifsFile->srch_inf.index_of_last_entry) {
|
||||||
cFYI(1,("last entry in buf at pos %lld %s",
|
cFYI(1, ("last entry in buf at pos %lld %s",
|
||||||
file->f_pos,tmp_buf));
|
file->f_pos, tmp_buf));
|
||||||
cifs_save_resume_key(current_entry,cifsFile);
|
cifs_save_resume_key(current_entry, cifsFile);
|
||||||
break;
|
break;
|
||||||
} else
|
} else
|
||||||
current_entry =
|
current_entry =
|
||||||
nxt_dir_entry(current_entry, end_of_smb,
|
nxt_dir_entry(current_entry, end_of_smb,
|
||||||
cifsFile->srch_inf.info_level);
|
cifsFile->srch_inf.info_level);
|
||||||
}
|
}
|
||||||
|
221
fs/cifs/sess.c
221
fs/cifs/sess.c
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* SMB/CIFS session setup handling routines
|
* SMB/CIFS session setup handling routines
|
||||||
*
|
*
|
||||||
* Copyright (c) International Business Machines Corp., 2006
|
* Copyright (c) International Business Machines Corp., 2006, 2007
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
@ -31,7 +31,7 @@
|
|||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
|
|
||||||
extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
|
extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
|
||||||
unsigned char *p24);
|
unsigned char *p24);
|
||||||
|
|
||||||
static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
|
static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
|
||||||
{
|
{
|
||||||
@ -45,13 +45,14 @@ static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
|
|||||||
|
|
||||||
/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
|
/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
|
||||||
|
|
||||||
/* BB verify whether signing required on neg or just on auth frame
|
/* BB verify whether signing required on neg or just on auth frame
|
||||||
(and NTLM case) */
|
(and NTLM case) */
|
||||||
|
|
||||||
capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
|
capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
|
||||||
CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
|
CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
|
||||||
|
|
||||||
if(ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
|
if (ses->server->secMode &
|
||||||
|
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
|
||||||
pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
|
pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
|
||||||
|
|
||||||
if (ses->capabilities & CAP_UNICODE) {
|
if (ses->capabilities & CAP_UNICODE) {
|
||||||
@ -75,9 +76,9 @@ static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
||||||
const struct nls_table * nls_cp)
|
const struct nls_table *nls_cp)
|
||||||
{
|
{
|
||||||
char * bcc_ptr = *pbcc_area;
|
char *bcc_ptr = *pbcc_area;
|
||||||
int bytes_ret = 0;
|
int bytes_ret = 0;
|
||||||
|
|
||||||
/* BB FIXME add check that strings total less
|
/* BB FIXME add check that strings total less
|
||||||
@ -89,7 +90,7 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
|||||||
bcc_ptr++;
|
bcc_ptr++;
|
||||||
} */
|
} */
|
||||||
/* copy user */
|
/* copy user */
|
||||||
if(ses->userName == NULL) {
|
if (ses->userName == NULL) {
|
||||||
/* null user mount */
|
/* null user mount */
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
*(bcc_ptr+1) = 0;
|
*(bcc_ptr+1) = 0;
|
||||||
@ -100,7 +101,7 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
|||||||
bcc_ptr += 2 * bytes_ret;
|
bcc_ptr += 2 * bytes_ret;
|
||||||
bcc_ptr += 2; /* account for null termination */
|
bcc_ptr += 2; /* account for null termination */
|
||||||
/* copy domain */
|
/* copy domain */
|
||||||
if(ses->domainName == NULL) {
|
if (ses->domainName == NULL) {
|
||||||
/* Sending null domain better than using a bogus domain name (as
|
/* Sending null domain better than using a bogus domain name (as
|
||||||
we did briefly in 2.6.18) since server will use its default */
|
we did briefly in 2.6.18) since server will use its default */
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
@ -122,7 +123,7 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
|||||||
bcc_ptr += 2; /* trailing null */
|
bcc_ptr += 2; /* trailing null */
|
||||||
|
|
||||||
bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
|
bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
|
||||||
32, nls_cp);
|
32, nls_cp);
|
||||||
bcc_ptr += 2 * bytes_ret;
|
bcc_ptr += 2 * bytes_ret;
|
||||||
bcc_ptr += 2; /* trailing null */
|
bcc_ptr += 2; /* trailing null */
|
||||||
|
|
||||||
@ -130,29 +131,29 @@ static void unicode_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void ascii_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
static void ascii_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
||||||
const struct nls_table * nls_cp)
|
const struct nls_table *nls_cp)
|
||||||
{
|
{
|
||||||
char * bcc_ptr = *pbcc_area;
|
char *bcc_ptr = *pbcc_area;
|
||||||
|
|
||||||
/* copy user */
|
/* copy user */
|
||||||
/* BB what about null user mounts - check that we do this BB */
|
/* BB what about null user mounts - check that we do this BB */
|
||||||
/* copy user */
|
/* copy user */
|
||||||
if(ses->userName == NULL) {
|
if (ses->userName == NULL) {
|
||||||
/* BB what about null user mounts - check that we do this BB */
|
/* BB what about null user mounts - check that we do this BB */
|
||||||
} else { /* 300 should be long enough for any conceivable user name */
|
} else { /* 300 should be long enough for any conceivable user name */
|
||||||
strncpy(bcc_ptr, ses->userName, 300);
|
strncpy(bcc_ptr, ses->userName, 300);
|
||||||
}
|
}
|
||||||
/* BB improve check for overflow */
|
/* BB improve check for overflow */
|
||||||
bcc_ptr += strnlen(ses->userName, 300);
|
bcc_ptr += strnlen(ses->userName, 300);
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
bcc_ptr++; /* account for null termination */
|
bcc_ptr++; /* account for null termination */
|
||||||
|
|
||||||
/* copy domain */
|
/* copy domain */
|
||||||
|
|
||||||
if(ses->domainName != NULL) {
|
if (ses->domainName != NULL) {
|
||||||
strncpy(bcc_ptr, ses->domainName, 256);
|
strncpy(bcc_ptr, ses->domainName, 256);
|
||||||
bcc_ptr += strnlen(ses->domainName, 256);
|
bcc_ptr += strnlen(ses->domainName, 256);
|
||||||
} /* else we will send a null domain name
|
} /* else we will send a null domain name
|
||||||
so the server will default to its own domain */
|
so the server will default to its own domain */
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
bcc_ptr++;
|
bcc_ptr++;
|
||||||
@ -167,19 +168,20 @@ static void ascii_ssetup_strings(char ** pbcc_area, struct cifsSesInfo *ses,
|
|||||||
strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
|
strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
|
||||||
bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
|
bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
|
||||||
|
|
||||||
*pbcc_area = bcc_ptr;
|
*pbcc_area = bcc_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decode_unicode_ssetup(char ** pbcc_area, int bleft, struct cifsSesInfo *ses,
|
static int decode_unicode_ssetup(char **pbcc_area, int bleft,
|
||||||
const struct nls_table * nls_cp)
|
struct cifsSesInfo *ses,
|
||||||
|
const struct nls_table *nls_cp)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int words_left, len;
|
int words_left, len;
|
||||||
char * data = *pbcc_area;
|
char *data = *pbcc_area;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cFYI(1,("bleft %d",bleft));
|
cFYI(1, ("bleft %d", bleft));
|
||||||
|
|
||||||
|
|
||||||
/* SMB header is unaligned, so cifs servers word align start of
|
/* SMB header is unaligned, so cifs servers word align start of
|
||||||
@ -198,14 +200,14 @@ static int decode_unicode_ssetup(char ** pbcc_area, int bleft, struct cifsSesInf
|
|||||||
/* We look for obvious messed up bcc or strings in response so we do not go off
|
/* We look for obvious messed up bcc or strings in response so we do not go off
|
||||||
the end since (at least) WIN2K and Windows XP have a major bug in not null
|
the end since (at least) WIN2K and Windows XP have a major bug in not null
|
||||||
terminating last Unicode string in response */
|
terminating last Unicode string in response */
|
||||||
if(len >= words_left)
|
if (len >= words_left)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if(ses->serverOS)
|
if (ses->serverOS)
|
||||||
kfree(ses->serverOS);
|
kfree(ses->serverOS);
|
||||||
/* UTF-8 string will not grow more than four times as big as UCS-16 */
|
/* UTF-8 string will not grow more than four times as big as UCS-16 */
|
||||||
ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
|
ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
|
||||||
if(ses->serverOS != NULL) {
|
if (ses->serverOS != NULL) {
|
||||||
cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len,
|
cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len,
|
||||||
nls_cp);
|
nls_cp);
|
||||||
}
|
}
|
||||||
@ -215,67 +217,68 @@ static int decode_unicode_ssetup(char ** pbcc_area, int bleft, struct cifsSesInf
|
|||||||
/* save off server network operating system */
|
/* save off server network operating system */
|
||||||
len = UniStrnlen((wchar_t *) data, words_left);
|
len = UniStrnlen((wchar_t *) data, words_left);
|
||||||
|
|
||||||
if(len >= words_left)
|
if (len >= words_left)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if(ses->serverNOS)
|
if (ses->serverNOS)
|
||||||
kfree(ses->serverNOS);
|
kfree(ses->serverNOS);
|
||||||
ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
|
ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
|
||||||
if(ses->serverNOS != NULL) {
|
if (ses->serverNOS != NULL) {
|
||||||
cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
|
cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
|
||||||
nls_cp);
|
nls_cp);
|
||||||
if(strncmp(ses->serverNOS, "NT LAN Manager 4",16) == 0) {
|
if (strncmp(ses->serverNOS, "NT LAN Manager 4", 16) == 0) {
|
||||||
cFYI(1,("NT4 server"));
|
cFYI(1, ("NT4 server"));
|
||||||
ses->flags |= CIFS_SES_NT4;
|
ses->flags |= CIFS_SES_NT4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data += 2 * (len + 1);
|
data += 2 * (len + 1);
|
||||||
words_left -= len + 1;
|
words_left -= len + 1;
|
||||||
|
|
||||||
/* save off server domain */
|
/* save off server domain */
|
||||||
len = UniStrnlen((wchar_t *) data, words_left);
|
len = UniStrnlen((wchar_t *) data, words_left);
|
||||||
|
|
||||||
if(len > words_left)
|
if (len > words_left)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if(ses->serverDomain)
|
if (ses->serverDomain)
|
||||||
kfree(ses->serverDomain);
|
kfree(ses->serverDomain);
|
||||||
ses->serverDomain = kzalloc(2 * (len + 1), GFP_KERNEL); /* BB FIXME wrong length */
|
ses->serverDomain = kzalloc(2 * (len + 1), GFP_KERNEL); /* BB FIXME wrong length */
|
||||||
if(ses->serverDomain != NULL) {
|
if (ses->serverDomain != NULL) {
|
||||||
cifs_strfromUCS_le(ses->serverDomain, (__le16 *)data, len,
|
cifs_strfromUCS_le(ses->serverDomain, (__le16 *)data, len,
|
||||||
nls_cp);
|
nls_cp);
|
||||||
ses->serverDomain[2*len] = 0;
|
ses->serverDomain[2*len] = 0;
|
||||||
ses->serverDomain[(2*len) + 1] = 0;
|
ses->serverDomain[(2*len) + 1] = 0;
|
||||||
}
|
}
|
||||||
data += 2 * (len + 1);
|
data += 2 * (len + 1);
|
||||||
words_left -= len + 1;
|
words_left -= len + 1;
|
||||||
|
|
||||||
cFYI(1,("words left: %d",words_left));
|
cFYI(1, ("words left: %d", words_left));
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decode_ascii_ssetup(char ** pbcc_area, int bleft, struct cifsSesInfo *ses,
|
static int decode_ascii_ssetup(char **pbcc_area, int bleft,
|
||||||
const struct nls_table * nls_cp)
|
struct cifsSesInfo *ses,
|
||||||
|
const struct nls_table *nls_cp)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int len;
|
int len;
|
||||||
char * bcc_ptr = *pbcc_area;
|
char *bcc_ptr = *pbcc_area;
|
||||||
|
|
||||||
cFYI(1,("decode sessetup ascii. bleft %d", bleft));
|
cFYI(1, ("decode sessetup ascii. bleft %d", bleft));
|
||||||
|
|
||||||
len = strnlen(bcc_ptr, bleft);
|
len = strnlen(bcc_ptr, bleft);
|
||||||
if(len >= bleft)
|
if (len >= bleft)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if(ses->serverOS)
|
if (ses->serverOS)
|
||||||
kfree(ses->serverOS);
|
kfree(ses->serverOS);
|
||||||
|
|
||||||
ses->serverOS = kzalloc(len + 1, GFP_KERNEL);
|
ses->serverOS = kzalloc(len + 1, GFP_KERNEL);
|
||||||
if(ses->serverOS)
|
if (ses->serverOS)
|
||||||
strncpy(ses->serverOS, bcc_ptr, len);
|
strncpy(ses->serverOS, bcc_ptr, len);
|
||||||
if(strncmp(ses->serverOS, "OS/2",4) == 0) {
|
if (strncmp(ses->serverOS, "OS/2", 4) == 0) {
|
||||||
cFYI(1,("OS/2 server"));
|
cFYI(1, ("OS/2 server"));
|
||||||
ses->flags |= CIFS_SES_OS2;
|
ses->flags |= CIFS_SES_OS2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,34 +286,34 @@ static int decode_ascii_ssetup(char ** pbcc_area, int bleft, struct cifsSesInfo
|
|||||||
bleft -= len + 1;
|
bleft -= len + 1;
|
||||||
|
|
||||||
len = strnlen(bcc_ptr, bleft);
|
len = strnlen(bcc_ptr, bleft);
|
||||||
if(len >= bleft)
|
if (len >= bleft)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if(ses->serverNOS)
|
if (ses->serverNOS)
|
||||||
kfree(ses->serverNOS);
|
kfree(ses->serverNOS);
|
||||||
|
|
||||||
ses->serverNOS = kzalloc(len + 1, GFP_KERNEL);
|
ses->serverNOS = kzalloc(len + 1, GFP_KERNEL);
|
||||||
if(ses->serverNOS)
|
if (ses->serverNOS)
|
||||||
strncpy(ses->serverNOS, bcc_ptr, len);
|
strncpy(ses->serverNOS, bcc_ptr, len);
|
||||||
|
|
||||||
bcc_ptr += len + 1;
|
bcc_ptr += len + 1;
|
||||||
bleft -= len + 1;
|
bleft -= len + 1;
|
||||||
|
|
||||||
len = strnlen(bcc_ptr, bleft);
|
len = strnlen(bcc_ptr, bleft);
|
||||||
if(len > bleft)
|
if (len > bleft)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/* No domain field in LANMAN case. Domain is
|
/* No domain field in LANMAN case. Domain is
|
||||||
returned by old servers in the SMB negprot response */
|
returned by old servers in the SMB negprot response */
|
||||||
/* BB For newer servers which do not support Unicode,
|
/* BB For newer servers which do not support Unicode,
|
||||||
but thus do return domain here we could add parsing
|
but thus do return domain here we could add parsing
|
||||||
for it later, but it is not very important */
|
for it later, but it is not very important */
|
||||||
cFYI(1,("ascii: bytes left %d",bleft));
|
cFYI(1, ("ascii: bytes left %d", bleft));
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
||||||
const struct nls_table *nls_cp)
|
const struct nls_table *nls_cp)
|
||||||
{
|
{
|
||||||
@ -328,13 +331,13 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
__u16 action;
|
__u16 action;
|
||||||
int bytes_remaining;
|
int bytes_remaining;
|
||||||
|
|
||||||
if(ses == NULL)
|
if (ses == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
type = ses->server->secType;
|
type = ses->server->secType;
|
||||||
|
|
||||||
cFYI(1,("sess setup type %d",type));
|
cFYI(1, ("sess setup type %d", type));
|
||||||
if(type == LANMAN) {
|
if (type == LANMAN) {
|
||||||
#ifndef CONFIG_CIFS_WEAK_PW_HASH
|
#ifndef CONFIG_CIFS_WEAK_PW_HASH
|
||||||
/* LANMAN and plaintext are less secure and off by default.
|
/* LANMAN and plaintext are less secure and off by default.
|
||||||
So we make this explicitly be turned on in kconfig (in the
|
So we make this explicitly be turned on in kconfig (in the
|
||||||
@ -344,15 +347,15 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
#endif
|
#endif
|
||||||
wct = 10; /* lanman 2 style sessionsetup */
|
wct = 10; /* lanman 2 style sessionsetup */
|
||||||
} else if((type == NTLM) || (type == NTLMv2)) {
|
} else if ((type == NTLM) || (type == NTLMv2)) {
|
||||||
/* For NTLMv2 failures eventually may need to retry NTLM */
|
/* For NTLMv2 failures eventually may need to retry NTLM */
|
||||||
wct = 13; /* old style NTLM sessionsetup */
|
wct = 13; /* old style NTLM sessionsetup */
|
||||||
} else /* same size for negotiate or auth, NTLMSSP or extended security */
|
} else /* same size: negotiate or auth, NTLMSSP or extended security */
|
||||||
wct = 12;
|
wct = 12;
|
||||||
|
|
||||||
rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
|
rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
|
||||||
(void **)&smb_buf);
|
(void **)&smb_buf);
|
||||||
if(rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
pSMB = (SESSION_SETUP_ANDX *)smb_buf;
|
pSMB = (SESSION_SETUP_ANDX *)smb_buf;
|
||||||
@ -364,8 +367,8 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
second part which will include the strings
|
second part which will include the strings
|
||||||
and rest of bcc area, in order to avoid having
|
and rest of bcc area, in order to avoid having
|
||||||
to do a large buffer 17K allocation */
|
to do a large buffer 17K allocation */
|
||||||
iov[0].iov_base = (char *)pSMB;
|
iov[0].iov_base = (char *)pSMB;
|
||||||
iov[0].iov_len = smb_buf->smb_buf_length + 4;
|
iov[0].iov_len = smb_buf->smb_buf_length + 4;
|
||||||
|
|
||||||
/* 2000 big enough to fit max user, domain, NOS name etc. */
|
/* 2000 big enough to fit max user, domain, NOS name etc. */
|
||||||
str_area = kmalloc(2000, GFP_KERNEL);
|
str_area = kmalloc(2000, GFP_KERNEL);
|
||||||
@ -373,18 +376,18 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
|
|
||||||
ses->flags &= ~CIFS_SES_LANMAN;
|
ses->flags &= ~CIFS_SES_LANMAN;
|
||||||
|
|
||||||
if(type == LANMAN) {
|
if (type == LANMAN) {
|
||||||
#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
||||||
char lnm_session_key[CIFS_SESS_KEY_SIZE];
|
char lnm_session_key[CIFS_SESS_KEY_SIZE];
|
||||||
|
|
||||||
/* no capabilities flags in old lanman negotiation */
|
/* no capabilities flags in old lanman negotiation */
|
||||||
|
|
||||||
pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
|
pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
|
||||||
/* BB calculate hash with password */
|
/* BB calculate hash with password */
|
||||||
/* and copy into bcc */
|
/* and copy into bcc */
|
||||||
|
|
||||||
calc_lanman_hash(ses, lnm_session_key);
|
calc_lanman_hash(ses, lnm_session_key);
|
||||||
ses->flags |= CIFS_SES_LANMAN;
|
ses->flags |= CIFS_SES_LANMAN;
|
||||||
/* #ifdef CONFIG_CIFS_DEBUG2
|
/* #ifdef CONFIG_CIFS_DEBUG2
|
||||||
cifs_dump_mem("cryptkey: ",ses->server->cryptKey,
|
cifs_dump_mem("cryptkey: ",ses->server->cryptKey,
|
||||||
CIFS_SESS_KEY_SIZE);
|
CIFS_SESS_KEY_SIZE);
|
||||||
@ -397,10 +400,10 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
changed to do higher than lanman dialect and
|
changed to do higher than lanman dialect and
|
||||||
we reconnected would we ever calc signing_key? */
|
we reconnected would we ever calc signing_key? */
|
||||||
|
|
||||||
cFYI(1,("Negotiating LANMAN setting up strings"));
|
cFYI(1, ("Negotiating LANMAN setting up strings"));
|
||||||
/* Unicode not allowed for LANMAN dialects */
|
/* Unicode not allowed for LANMAN dialects */
|
||||||
ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
||||||
#endif
|
#endif
|
||||||
} else if (type == NTLM) {
|
} else if (type == NTLM) {
|
||||||
char ntlm_session_key[CIFS_SESS_KEY_SIZE];
|
char ntlm_session_key[CIFS_SESS_KEY_SIZE];
|
||||||
|
|
||||||
@ -414,33 +417,33 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
SMBNTencrypt(ses->password, ses->server->cryptKey,
|
SMBNTencrypt(ses->password, ses->server->cryptKey,
|
||||||
ntlm_session_key);
|
ntlm_session_key);
|
||||||
|
|
||||||
if(first_time) /* should this be moved into common code
|
if (first_time) /* should this be moved into common code
|
||||||
with similar ntlmv2 path? */
|
with similar ntlmv2 path? */
|
||||||
cifs_calculate_mac_key(ses->server->mac_signing_key,
|
cifs_calculate_mac_key(ses->server->mac_signing_key,
|
||||||
ntlm_session_key, ses->password);
|
ntlm_session_key, ses->password);
|
||||||
/* copy session key */
|
/* copy session key */
|
||||||
|
|
||||||
memcpy(bcc_ptr, (char *)ntlm_session_key,CIFS_SESS_KEY_SIZE);
|
memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE);
|
||||||
bcc_ptr += CIFS_SESS_KEY_SIZE;
|
bcc_ptr += CIFS_SESS_KEY_SIZE;
|
||||||
memcpy(bcc_ptr, (char *)ntlm_session_key,CIFS_SESS_KEY_SIZE);
|
memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE);
|
||||||
bcc_ptr += CIFS_SESS_KEY_SIZE;
|
bcc_ptr += CIFS_SESS_KEY_SIZE;
|
||||||
if(ses->capabilities & CAP_UNICODE) {
|
if (ses->capabilities & CAP_UNICODE) {
|
||||||
/* unicode strings must be word aligned */
|
/* unicode strings must be word aligned */
|
||||||
if (iov[0].iov_len % 2) {
|
if (iov[0].iov_len % 2) {
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
bcc_ptr++;
|
bcc_ptr++;
|
||||||
}
|
}
|
||||||
unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
||||||
} else
|
} else
|
||||||
ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
||||||
} else if (type == NTLMv2) {
|
} else if (type == NTLMv2) {
|
||||||
char * v2_sess_key =
|
char *v2_sess_key =
|
||||||
kmalloc(sizeof(struct ntlmv2_resp), GFP_KERNEL);
|
kmalloc(sizeof(struct ntlmv2_resp), GFP_KERNEL);
|
||||||
|
|
||||||
/* BB FIXME change all users of v2_sess_key to
|
/* BB FIXME change all users of v2_sess_key to
|
||||||
struct ntlmv2_resp */
|
struct ntlmv2_resp */
|
||||||
|
|
||||||
if(v2_sess_key == NULL) {
|
if (v2_sess_key == NULL) {
|
||||||
cifs_small_buf_release(smb_buf);
|
cifs_small_buf_release(smb_buf);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@ -456,8 +459,8 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
|
|
||||||
/* calculate session key */
|
/* calculate session key */
|
||||||
setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp);
|
setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp);
|
||||||
if(first_time) /* should this be moved into common code
|
if (first_time) /* should this be moved into common code
|
||||||
with similar ntlmv2 path? */
|
with similar ntlmv2 path? */
|
||||||
/* cifs_calculate_ntlmv2_mac_key(ses->server->mac_signing_key,
|
/* cifs_calculate_ntlmv2_mac_key(ses->server->mac_signing_key,
|
||||||
response BB FIXME, v2_sess_key); */
|
response BB FIXME, v2_sess_key); */
|
||||||
|
|
||||||
@ -468,8 +471,8 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
memcpy(bcc_ptr, (char *)v2_sess_key, sizeof(struct ntlmv2_resp));
|
memcpy(bcc_ptr, (char *)v2_sess_key, sizeof(struct ntlmv2_resp));
|
||||||
bcc_ptr += sizeof(struct ntlmv2_resp);
|
bcc_ptr += sizeof(struct ntlmv2_resp);
|
||||||
kfree(v2_sess_key);
|
kfree(v2_sess_key);
|
||||||
if(ses->capabilities & CAP_UNICODE) {
|
if (ses->capabilities & CAP_UNICODE) {
|
||||||
if(iov[0].iov_len % 2) {
|
if (iov[0].iov_len % 2) {
|
||||||
*bcc_ptr = 0;
|
*bcc_ptr = 0;
|
||||||
} bcc_ptr++;
|
} bcc_ptr++;
|
||||||
unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
|
||||||
@ -488,20 +491,20 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
BCC_LE(smb_buf) = cpu_to_le16(count);
|
BCC_LE(smb_buf) = cpu_to_le16(count);
|
||||||
|
|
||||||
iov[1].iov_base = str_area;
|
iov[1].iov_base = str_area;
|
||||||
iov[1].iov_len = count;
|
iov[1].iov_len = count;
|
||||||
rc = SendReceive2(xid, ses, iov, 2 /* num_iovecs */, &resp_buf_type, 0);
|
rc = SendReceive2(xid, ses, iov, 2 /* num_iovecs */, &resp_buf_type, 0);
|
||||||
/* SMB request buf freed in SendReceive2 */
|
/* SMB request buf freed in SendReceive2 */
|
||||||
|
|
||||||
cFYI(1,("ssetup rc from sendrecv2 is %d",rc));
|
cFYI(1, ("ssetup rc from sendrecv2 is %d", rc));
|
||||||
if(rc)
|
if (rc)
|
||||||
goto ssetup_exit;
|
goto ssetup_exit;
|
||||||
|
|
||||||
pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base;
|
pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base;
|
||||||
smb_buf = (struct smb_hdr *)iov[0].iov_base;
|
smb_buf = (struct smb_hdr *)iov[0].iov_base;
|
||||||
|
|
||||||
if((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) {
|
if ((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) {
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
cERROR(1,("bad word count %d", smb_buf->WordCount));
|
cERROR(1, ("bad word count %d", smb_buf->WordCount));
|
||||||
goto ssetup_exit;
|
goto ssetup_exit;
|
||||||
}
|
}
|
||||||
action = le16_to_cpu(pSMB->resp.Action);
|
action = le16_to_cpu(pSMB->resp.Action);
|
||||||
@ -514,20 +517,20 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
bytes_remaining = BCC(smb_buf);
|
bytes_remaining = BCC(smb_buf);
|
||||||
bcc_ptr = pByteArea(smb_buf);
|
bcc_ptr = pByteArea(smb_buf);
|
||||||
|
|
||||||
if(smb_buf->WordCount == 4) {
|
if (smb_buf->WordCount == 4) {
|
||||||
__u16 blob_len;
|
__u16 blob_len;
|
||||||
blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
|
blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
|
||||||
bcc_ptr += blob_len;
|
bcc_ptr += blob_len;
|
||||||
if(blob_len > bytes_remaining) {
|
if (blob_len > bytes_remaining) {
|
||||||
cERROR(1,("bad security blob length %d", blob_len));
|
cERROR(1, ("bad security blob length %d", blob_len));
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto ssetup_exit;
|
goto ssetup_exit;
|
||||||
}
|
}
|
||||||
bytes_remaining -= blob_len;
|
bytes_remaining -= blob_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* BB check if Unicode and decode strings */
|
/* BB check if Unicode and decode strings */
|
||||||
if(smb_buf->Flags2 & SMBFLG2_UNICODE)
|
if (smb_buf->Flags2 & SMBFLG2_UNICODE)
|
||||||
rc = decode_unicode_ssetup(&bcc_ptr, bytes_remaining,
|
rc = decode_unicode_ssetup(&bcc_ptr, bytes_remaining,
|
||||||
ses, nls_cp);
|
ses, nls_cp);
|
||||||
else
|
else
|
||||||
@ -535,10 +538,10 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||||||
|
|
||||||
ssetup_exit:
|
ssetup_exit:
|
||||||
kfree(str_area);
|
kfree(str_area);
|
||||||
if(resp_buf_type == CIFS_SMALL_BUFFER) {
|
if (resp_buf_type == CIFS_SMALL_BUFFER) {
|
||||||
cFYI(1,("ssetup freeing small buf %p", iov[0].iov_base));
|
cFYI(1, ("ssetup freeing small buf %p", iov[0].iov_base));
|
||||||
cifs_small_buf_release(iov[0].iov_base);
|
cifs_small_buf_release(iov[0].iov_base);
|
||||||
} else if(resp_buf_type == CIFS_LARGE_BUFFER)
|
} else if (resp_buf_type == CIFS_LARGE_BUFFER)
|
||||||
cifs_buf_release(iov[0].iov_base);
|
cifs_buf_release(iov[0].iov_base);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
Unix SMB/Netbios implementation.
|
Unix SMB/Netbios implementation.
|
||||||
Version 1.9.
|
Version 1.9.
|
||||||
SMB parameters and setup
|
SMB parameters and setup
|
||||||
@ -57,7 +57,7 @@ void SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
This implements the X/Open SMB password encryption
|
This implements the X/Open SMB password encryption
|
||||||
It takes a password, a 8 byte "crypt key" and puts 24 bytes of
|
It takes a password, a 8 byte "crypt key" and puts 24 bytes of
|
||||||
encrypted password into p24 */
|
encrypted password into p24 */
|
||||||
/* Note that password must be uppercased and null terminated */
|
/* Note that password must be uppercased and null terminated */
|
||||||
void
|
void
|
||||||
@ -74,8 +74,8 @@ SMBencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24)
|
|||||||
|
|
||||||
SMBOWFencrypt(p21, c8, p24);
|
SMBOWFencrypt(p21, c8, p24);
|
||||||
|
|
||||||
memset(p14,0,15);
|
memset(p14, 0, 15);
|
||||||
memset(p21,0,21);
|
memset(p21, 0, 21);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Routines for Windows NT MD4 Hash functions. */
|
/* Routines for Windows NT MD4 Hash functions. */
|
||||||
@ -90,14 +90,14 @@ _my_wcslen(__u16 * str)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert a string into an NT UNICODE string.
|
* Convert a string into an NT UNICODE string.
|
||||||
* Note that regardless of processor type
|
* Note that regardless of processor type
|
||||||
* this must be in intel (little-endian)
|
* this must be in intel (little-endian)
|
||||||
* format.
|
* format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_my_mbstowcs(__u16 * dst, const unsigned char *src, int len)
|
_my_mbstowcs(__u16 * dst, const unsigned char *src, int len)
|
||||||
{ /* not a very good conversion routine - change/fix */
|
{ /* BB not a very good conversion routine - change/fix */
|
||||||
int i;
|
int i;
|
||||||
__u16 val;
|
__u16 val;
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ _my_mbstowcs(__u16 * dst, const unsigned char *src, int len)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creates the MD4 Hash of the users password in NT UNICODE.
|
* Creates the MD4 Hash of the users password in NT UNICODE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16)
|
|||||||
__u16 wpwd[129];
|
__u16 wpwd[129];
|
||||||
|
|
||||||
/* Password cannot be longer than 128 characters */
|
/* Password cannot be longer than 128 characters */
|
||||||
if(passwd) {
|
if (passwd) {
|
||||||
len = strlen((char *) passwd);
|
len = strlen((char *) passwd);
|
||||||
if (len > 128) {
|
if (len > 128) {
|
||||||
len = 128;
|
len = 128;
|
||||||
@ -138,7 +138,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16)
|
|||||||
len = _my_wcslen(wpwd) * sizeof (__u16);
|
len = _my_wcslen(wpwd) * sizeof (__u16);
|
||||||
|
|
||||||
mdfour(p16, (unsigned char *) wpwd, len);
|
mdfour(p16, (unsigned char *) wpwd, len);
|
||||||
memset(wpwd,0,129 * 2);
|
memset(wpwd, 0, 129 * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* currently unused */
|
#if 0 /* currently unused */
|
||||||
@ -184,8 +184,8 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
|
|||||||
struct HMACMD5Context ctx;
|
struct HMACMD5Context ctx;
|
||||||
|
|
||||||
/* might as well do one alloc to hold both (user_u and dom_u) */
|
/* might as well do one alloc to hold both (user_u and dom_u) */
|
||||||
user_u = kmalloc(2048 * sizeof(wchar_t),GFP_KERNEL);
|
user_u = kmalloc(2048 * sizeof(wchar_t), GFP_KERNEL);
|
||||||
if(user_u == NULL)
|
if (user_u == NULL)
|
||||||
return;
|
return;
|
||||||
dom_u = user_u + 1024;
|
dom_u = user_u + 1024;
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
|
|||||||
|
|
||||||
kfree(user_u);
|
kfree(user_u);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Does the des encryption from the NT or LM MD4 hash. */
|
/* Does the des encryption from the NT or LM MD4 hash. */
|
||||||
static void
|
static void
|
||||||
@ -256,15 +256,15 @@ SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24)
|
|||||||
#if 0
|
#if 0
|
||||||
static void
|
static void
|
||||||
SMBOWFencrypt_ntv2(const unsigned char kr[16],
|
SMBOWFencrypt_ntv2(const unsigned char kr[16],
|
||||||
const struct data_blob * srv_chal,
|
const struct data_blob *srv_chal,
|
||||||
const struct data_blob * cli_chal, unsigned char resp_buf[16])
|
const struct data_blob *cli_chal, unsigned char resp_buf[16])
|
||||||
{
|
{
|
||||||
struct HMACMD5Context ctx;
|
struct HMACMD5Context ctx;
|
||||||
|
|
||||||
hmac_md5_init_limK_to_64(kr, 16, &ctx);
|
hmac_md5_init_limK_to_64(kr, 16, &ctx);
|
||||||
hmac_md5_update(srv_chal->data, srv_chal->length, &ctx);
|
hmac_md5_update(srv_chal->data, srv_chal->length, &ctx);
|
||||||
hmac_md5_update(cli_chal->data, cli_chal->length, &ctx);
|
hmac_md5_update(cli_chal->data, cli_chal->length, &ctx);
|
||||||
hmac_md5_final(resp_buf, &ctx);
|
hmac_md5_final(resp_buf, &ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user