diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 12:31:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 12:31:53 -0400 |
| commit | 86ed5a93b8b56e4e0877b914af0e10883a196384 (patch) | |
| tree | 761c3db8250c54eb07c6e4a02ca7f93f044928b3 | |
| parent | 835a1c092432b3293ba6c4dec45ee6869c6f61fd (diff) | |
| parent | b77d753c413e02559669df66e543869dad40c847 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
[CIFS] Check that last search entry resume key is valid
[CIFS] make sure we have the right resume info before calling CIFSFindNext
[CIFS] clean up error handling in cifs_unlink
[CIFS] fix some settings of cifsAttrs after calling SetFileInfo and SetPathInfo
cifs: explicitly revoke SPNEGO key after session setup
cifs: Convert cifs to new aops.
[CIFS] update DOS attributes in cifsInode if we successfully changed them
cifs: remove NULL termination from rename target in CIFSSMBRenameOpenFIle
cifs: work around samba returning -ENOENT on SetFileDisposition call
cifs: fix inverted NULL check after kmalloc
[CIFS] clean up upcall handling for dns_resolver keys
[CIFS] fix busy-file renames and refactor cifs_rename logic
cifs: add function to set file disposition
[CIFS] add constants for string lengths of keynames in SPNEGO upcall string
cifs: move rename and delete-on-close logic into helper function
cifs: have find_writeable_file prefer filehandles opened by same task
cifs: don't use GFP_KERNEL with GFP_NOFS
[CIFS] use common code for turning off ATTR_READONLY in cifs_unlink
cifs: clean up variables in cifs_unlink
| -rw-r--r-- | fs/cifs/cifs_spnego.c | 35 | ||||
| -rw-r--r-- | fs/cifs/cifsfs.h | 2 | ||||
| -rw-r--r-- | fs/cifs/cifsglob.h | 1 | ||||
| -rw-r--r-- | fs/cifs/cifsproto.h | 4 | ||||
| -rw-r--r-- | fs/cifs/cifssmb.c | 84 | ||||
| -rw-r--r-- | fs/cifs/dns_resolve.c | 74 | ||||
| -rw-r--r-- | fs/cifs/file.c | 130 | ||||
| -rw-r--r-- | fs/cifs/inode.c | 644 | ||||
| -rw-r--r-- | fs/cifs/misc.c | 6 | ||||
| -rw-r--r-- | fs/cifs/readdir.c | 128 | ||||
| -rw-r--r-- | fs/cifs/sess.c | 4 | ||||
| -rw-r--r-- | fs/cifs/transport.c | 3 |
12 files changed, 632 insertions, 483 deletions
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index 117ef4bba68e..fcee9298b620 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
| @@ -66,11 +66,28 @@ struct key_type cifs_spnego_key_type = { | |||
| 66 | .describe = user_describe, | 66 | .describe = user_describe, |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | #define MAX_VER_STR_LEN 8 /* length of longest version string e.g. | 69 | /* length of longest version string e.g. strlen("ver=0xFF") */ |
| 70 | strlen("ver=0xFF") */ | 70 | #define MAX_VER_STR_LEN 8 |
| 71 | #define MAX_MECH_STR_LEN 13 /* length of longest security mechanism name, eg | 71 | |
| 72 | in future could have strlen(";sec=ntlmsspi") */ | 72 | /* length of longest security mechanism name, eg in future could have |
| 73 | #define MAX_IPV6_ADDR_LEN 42 /* eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/60 */ | 73 | * strlen(";sec=ntlmsspi") */ |
| 74 | #define MAX_MECH_STR_LEN 13 | ||
| 75 | |||
| 76 | /* max possible addr len eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/60 */ | ||
| 77 | #define MAX_IPV6_ADDR_LEN 42 | ||
| 78 | |||
| 79 | /* strlen of "host=" */ | ||
| 80 | #define HOST_KEY_LEN 5 | ||
| 81 | |||
| 82 | /* strlen of ";ip4=" or ";ip6=" */ | ||
| 83 | #define IP_KEY_LEN 5 | ||
| 84 | |||
| 85 | /* strlen of ";uid=0x" */ | ||
| 86 | #define UID_KEY_LEN 7 | ||
| 87 | |||
| 88 | /* strlen of ";user=" */ | ||
| 89 | #define USER_KEY_LEN 6 | ||
| 90 | |||
| 74 | /* get a key struct with a SPNEGO security blob, suitable for session setup */ | 91 | /* get a key struct with a SPNEGO security blob, suitable for session setup */ |
| 75 | struct key * | 92 | struct key * |
| 76 | cifs_get_spnego_key(struct cifsSesInfo *sesInfo) | 93 | cifs_get_spnego_key(struct cifsSesInfo *sesInfo) |
| @@ -84,11 +101,11 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) | |||
| 84 | /* length of fields (with semicolons): ver=0xyz ip4=ipaddress | 101 | /* length of fields (with semicolons): ver=0xyz ip4=ipaddress |
| 85 | host=hostname sec=mechanism uid=0xFF user=username */ | 102 | host=hostname sec=mechanism uid=0xFF user=username */ |
| 86 | desc_len = MAX_VER_STR_LEN + | 103 | desc_len = MAX_VER_STR_LEN + |
| 87 | 6 /* len of "host=" */ + strlen(hostname) + | 104 | HOST_KEY_LEN + strlen(hostname) + |
| 88 | 5 /* len of ";ipv4=" */ + MAX_IPV6_ADDR_LEN + | 105 | IP_KEY_LEN + MAX_IPV6_ADDR_LEN + |
| 89 | MAX_MECH_STR_LEN + | 106 | MAX_MECH_STR_LEN + |
| 90 | 7 /* len of ";uid=0x" */ + (sizeof(uid_t) * 2) + | 107 | UID_KEY_LEN + (sizeof(uid_t) * 2) + |
| 91 | 6 /* len of ";user=" */ + strlen(sesInfo->userName) + 1; | 108 | USER_KEY_LEN + strlen(sesInfo->userName) + 1; |
| 92 | 109 | ||
| 93 | spnego_key = ERR_PTR(-ENOMEM); | 110 | spnego_key = ERR_PTR(-ENOMEM); |
| 94 | description = kzalloc(desc_len, GFP_KERNEL); | 111 | description = kzalloc(desc_len, GFP_KERNEL); |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 135c965c4137..f7b4a5cd837b 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
| @@ -41,7 +41,7 @@ extern int cifs_create(struct inode *, struct dentry *, int, | |||
| 41 | struct nameidata *); | 41 | struct nameidata *); |
| 42 | extern struct dentry *cifs_lookup(struct inode *, struct dentry *, | 42 | extern struct dentry *cifs_lookup(struct inode *, struct dentry *, |
| 43 | struct nameidata *); | 43 | struct nameidata *); |
| 44 | extern int cifs_unlink(struct inode *, struct dentry *); | 44 | extern int cifs_unlink(struct inode *dir, struct dentry *dentry); |
| 45 | extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *); | 45 | extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *); |
| 46 | extern int cifs_mknod(struct inode *, struct dentry *, int, dev_t); | 46 | extern int cifs_mknod(struct inode *, struct dentry *, int, dev_t); |
| 47 | extern int cifs_mkdir(struct inode *, struct dentry *, int); | 47 | extern int cifs_mkdir(struct inode *, struct dentry *, int); |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 8dfd6f24d488..0d22479d99b7 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -309,6 +309,7 @@ struct cifs_search_info { | |||
| 309 | __u32 resume_key; | 309 | __u32 resume_key; |
| 310 | char *ntwrk_buf_start; | 310 | char *ntwrk_buf_start; |
| 311 | char *srch_entries_start; | 311 | char *srch_entries_start; |
| 312 | char *last_entry; | ||
| 312 | char *presume_name; | 313 | char *presume_name; |
| 313 | unsigned int resume_name_len; | 314 | unsigned int resume_name_len; |
| 314 | bool endOfSearch:1; | 315 | bool endOfSearch:1; |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index a729d083e6f4..0cff7fe986e8 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -179,6 +179,8 @@ extern int CIFSSMBSetPathInfo(const int xid, struct cifsTconInfo *tcon, | |||
| 179 | extern int CIFSSMBSetFileInfo(const int xid, struct cifsTconInfo *tcon, | 179 | extern int CIFSSMBSetFileInfo(const int xid, struct cifsTconInfo *tcon, |
| 180 | const FILE_BASIC_INFO *data, __u16 fid, | 180 | const FILE_BASIC_INFO *data, __u16 fid, |
| 181 | __u32 pid_of_opener); | 181 | __u32 pid_of_opener); |
| 182 | extern int CIFSSMBSetFileDisposition(const int xid, struct cifsTconInfo *tcon, | ||
| 183 | bool delete_file, __u16 fid, __u32 pid_of_opener); | ||
| 182 | #if 0 | 184 | #if 0 |
| 183 | extern int CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, | 185 | extern int CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, |
| 184 | char *fileName, __u16 dos_attributes, | 186 | char *fileName, __u16 dos_attributes, |
| @@ -229,7 +231,7 @@ extern int CIFSSMBRename(const int xid, struct cifsTconInfo *tcon, | |||
| 229 | const struct nls_table *nls_codepage, | 231 | const struct nls_table *nls_codepage, |
| 230 | int remap_special_chars); | 232 | int remap_special_chars); |
| 231 | extern int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | 233 | extern int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, |
| 232 | int netfid, char *target_name, | 234 | int netfid, const char *target_name, |
| 233 | const struct nls_table *nls_codepage, | 235 | const struct nls_table *nls_codepage, |
| 234 | int remap_special_chars); | 236 | int remap_special_chars); |
| 235 | extern int CIFSCreateHardLink(const int xid, | 237 | extern int CIFSCreateHardLink(const int xid, |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 994de7c90474..6f4ffe15d68d 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -2017,7 +2017,7 @@ renameRetry: | |||
| 2017 | } | 2017 | } |
| 2018 | 2018 | ||
| 2019 | int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | 2019 | int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, |
| 2020 | int netfid, char *target_name, | 2020 | int netfid, const char *target_name, |
| 2021 | const struct nls_table *nls_codepage, int remap) | 2021 | const struct nls_table *nls_codepage, int remap) |
| 2022 | { | 2022 | { |
| 2023 | struct smb_com_transaction2_sfi_req *pSMB = NULL; | 2023 | struct smb_com_transaction2_sfi_req *pSMB = NULL; |
| @@ -2071,7 +2071,7 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | |||
| 2071 | remap); | 2071 | remap); |
| 2072 | } | 2072 | } |
| 2073 | rename_info->target_name_len = cpu_to_le32(2 * len_of_str); | 2073 | rename_info->target_name_len = cpu_to_le32(2 * len_of_str); |
| 2074 | count = 12 /* sizeof(struct set_file_rename) */ + (2 * len_of_str) + 2; | 2074 | count = 12 /* sizeof(struct set_file_rename) */ + (2 * len_of_str); |
| 2075 | byte_count += count; | 2075 | byte_count += count; |
| 2076 | pSMB->DataCount = cpu_to_le16(count); | 2076 | pSMB->DataCount = cpu_to_le16(count); |
| 2077 | pSMB->TotalDataCount = pSMB->DataCount; | 2077 | pSMB->TotalDataCount = pSMB->DataCount; |
| @@ -3614,6 +3614,8 @@ findFirstRetry: | |||
| 3614 | /* BB remember to free buffer if error BB */ | 3614 | /* BB remember to free buffer if error BB */ |
| 3615 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3615 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3616 | if (rc == 0) { | 3616 | if (rc == 0) { |
| 3617 | unsigned int lnoff; | ||
| 3618 | |||
| 3617 | if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) | 3619 | if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) |
| 3618 | psrch_inf->unicode = true; | 3620 | psrch_inf->unicode = true; |
| 3619 | else | 3621 | else |
| @@ -3636,6 +3638,17 @@ findFirstRetry: | |||
| 3636 | le16_to_cpu(parms->SearchCount); | 3638 | le16_to_cpu(parms->SearchCount); |
| 3637 | psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + | 3639 | psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + |
| 3638 | psrch_inf->entries_in_buffer; | 3640 | psrch_inf->entries_in_buffer; |
| 3641 | lnoff = le16_to_cpu(parms->LastNameOffset); | ||
| 3642 | if (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE < | ||
| 3643 | lnoff) { | ||
| 3644 | cERROR(1, ("ignoring corrupt resume name")); | ||
| 3645 | psrch_inf->last_entry = NULL; | ||
| 3646 | return rc; | ||
| 3647 | } | ||
| 3648 | |||
| 3649 | psrch_inf->last_entry = psrch_inf->srch_entries_start + | ||
| 3650 | lnoff; | ||
| 3651 | |||
| 3639 | *pnetfid = parms->SearchHandle; | 3652 | *pnetfid = parms->SearchHandle; |
| 3640 | } else { | 3653 | } else { |
| 3641 | cifs_buf_release(pSMB); | 3654 | cifs_buf_release(pSMB); |
| @@ -3725,6 +3738,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, | |||
| 3725 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 3738 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
| 3726 | 3739 | ||
| 3727 | if (rc == 0) { | 3740 | if (rc == 0) { |
| 3741 | unsigned int lnoff; | ||
| 3742 | |||
