diff options
author | Nakajima Akira <nakajima.akira@nttcom.co.jp> | 2015-02-13 01:35:58 -0500 |
---|---|---|
committer | Steve French <smfrench@gmail.com> | 2015-05-10 20:56:35 -0400 |
commit | bc8ebdc4f54cc944b0ecc0fb0d18b0ffbaab0468 (patch) | |
tree | 1d442f43a1d50cec2c4f6ee8a0957b00a8950b97 | |
parent | f5d0684e848f01347ba510545822c205889f8acc (diff) |
Fix that several functions handle incorrect value of mapchars
Cifs client has problem with reserved chars filename.
[BUG1] : several functions handle incorrect value of mapchars
- cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+ cifs_remap(cifs_sb));
[BUG2] : forget to convert reserved chars when creating SymbolicLink.
- CIFSUnixCreateSymLink() calls cifs_strtoUTF16
+ CIFSUnixCreateSymLink() calls cifsConvertToUTF16() with remap
[BUG3] : forget to convert reserved chars when getting SymbolicLink.
- CIFSSMBUnixQuerySymLink() calls cifs_strtoUTF16
+ CIFSSMBUnixQuerySymLink() calls cifsConvertToUTF16() with remap
[BUG4] : /proc/mounts don't show "mapposix" when using mapposix mount option
+ cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
+ seq_puts(s, ",mapposix");
Reported-by: t.wede@kw-reneg.de
Reported-by: Nakajima Akira <nakajima.akira@nttcom.co.jp>
Signed-off-by: Nakajima Akira <nakajima.akira@nttcom.co.jp>
Signed-off-by: Carl Schaefer <schaefer@trilug.org>
Signed-off-by: Steve French <smfrench@gmail.com>
-rw-r--r-- | fs/cifs/cifs_dfs_ref.c | 3 | ||||
-rw-r--r-- | fs/cifs/cifsfs.c | 2 | ||||
-rw-r--r-- | fs/cifs/cifsproto.h | 4 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 21 | ||||
-rw-r--r-- | fs/cifs/dir.c | 3 | ||||
-rw-r--r-- | fs/cifs/file.c | 3 | ||||
-rw-r--r-- | fs/cifs/inode.c | 6 | ||||
-rw-r--r-- | fs/cifs/link.c | 3 | ||||
-rw-r--r-- | fs/cifs/smb1ops.c | 3 |
9 files changed, 25 insertions, 23 deletions
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 430e0348c99e..7dc886c9a78f 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "cifsfs.h" | 24 | #include "cifsfs.h" |
25 | #include "dns_resolve.h" | 25 | #include "dns_resolve.h" |
26 | #include "cifs_debug.h" | 26 | #include "cifs_debug.h" |
27 | #include "cifs_unicode.h" | ||
27 | 28 | ||
28 | static LIST_HEAD(cifs_dfs_automount_list); | 29 | static LIST_HEAD(cifs_dfs_automount_list); |
29 | 30 | ||
@@ -312,7 +313,7 @@ static struct vfsmount *cifs_dfs_do_automount(struct dentry *mntpt) | |||
312 | xid = get_xid(); | 313 | xid = get_xid(); |
313 | rc = get_dfs_path(xid, ses, full_path + 1, cifs_sb->local_nls, | 314 | rc = get_dfs_path(xid, ses, full_path + 1, cifs_sb->local_nls, |
314 | &num_referrals, &referrals, | 315 | &num_referrals, &referrals, |
315 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | 316 | cifs_remap(cifs_sb)); |
316 | free_xid(xid); | 317 | free_xid(xid); |
317 | 318 | ||
318 | cifs_put_tlink(tlink); | 319 | cifs_put_tlink(tlink); |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index f5089bde3635..0a9fb6b53126 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -469,6 +469,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root) | |||
469 | seq_puts(s, ",nouser_xattr"); | 469 | seq_puts(s, ",nouser_xattr"); |
470 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR) | 470 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR) |
471 | seq_puts(s, ",mapchars"); | 471 | seq_puts(s, ",mapchars"); |
472 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR) | ||
473 | seq_puts(s, ",mapposix"); | ||
472 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) | 474 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) |
473 | seq_puts(s, ",sfu"); | 475 | seq_puts(s, ",sfu"); |
474 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | 476 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index c31ce98c1704..c63fd1dde25b 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -361,11 +361,11 @@ extern int CIFSUnixCreateHardLink(const unsigned int xid, | |||
361 | extern int CIFSUnixCreateSymLink(const unsigned int xid, | 361 | extern int CIFSUnixCreateSymLink(const unsigned int xid, |
362 | struct cifs_tcon *tcon, | 362 | struct cifs_tcon *tcon, |
363 | const char *fromName, const char *toName, | 363 | const char *fromName, const char *toName, |
364 | const struct nls_table *nls_codepage); | 364 | const struct nls_table *nls_codepage, int remap); |
365 | extern int CIFSSMBUnixQuerySymLink(const unsigned int xid, | 365 | extern int CIFSSMBUnixQuerySymLink(const unsigned int xid, |
366 | struct cifs_tcon *tcon, | 366 | struct cifs_tcon *tcon, |
367 | const unsigned char *searchName, char **syminfo, | 367 | const unsigned char *searchName, char **syminfo, |
368 | const struct nls_table *nls_codepage); | 368 | const struct nls_table *nls_codepage, int remap); |
369 | extern int CIFSSMBQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, | 369 | extern int CIFSSMBQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, |
370 | __u16 fid, char **symlinkinfo, | 370 | __u16 fid, char **symlinkinfo, |
371 | const struct nls_table *nls_codepage); | 371 | const struct nls_table *nls_codepage); |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 84650a51c7c4..1091affba425 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -2784,7 +2784,7 @@ copyRetry: | |||
2784 | int | 2784 | int |
2785 | CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon, | 2785 | CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon, |
2786 | const char *fromName, const char *toName, | 2786 | const char *fromName, const char *toName, |
2787 | const struct nls_table *nls_codepage) | 2787 | const struct nls_table *nls_codepage, int remap) |
2788 | { | 2788 | { |
2789 | TRANSACTION2_SPI_REQ *pSMB = NULL; | 2789 | TRANSACTION2_SPI_REQ *pSMB = NULL; |
2790 | TRANSACTION2_SPI_RSP *pSMBr = NULL; | 2790 | TRANSACTION2_SPI_RSP *pSMBr = NULL; |
@@ -2804,9 +2804,9 @@ createSymLinkRetry: | |||
2804 | 2804 | ||
2805 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2805 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2806 | name_len = | 2806 | name_len = |
2807 | cifs_strtoUTF16((__le16 *) pSMB->FileName, fromName, | 2807 | cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName, |
2808 | /* find define for this maxpathcomponent */ | 2808 | /* find define for this maxpathcomponent */ |
2809 | PATH_MAX, nls_codepage); | 2809 | PATH_MAX, nls_codepage, remap); |
2810 | name_len++; /* trailing null */ | 2810 | name_len++; /* trailing null */ |
2811 | name_len *= 2; | 2811 | name_len *= 2; |
2812 | 2812 | ||
@@ -2828,9 +2828,9 @@ createSymLinkRetry: | |||
2828 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2828 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2829 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 2829 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
2830 | name_len_target = | 2830 | name_len_target = |
2831 | cifs_strtoUTF16((__le16 *) data_offset, toName, PATH_MAX | 2831 | cifsConvertToUTF16((__le16 *) data_offset, toName, |
2832 | /* find define for this maxpathcomponent */ | 2832 | /* find define for this maxpathcomponent */ |
2833 | , nls_codepage); | 2833 | PATH_MAX, nls_codepage, remap); |
2834 | name_len_target++; /* trailing null */ | 2834 | name_len_target++; /* trailing null */ |
2835 | name_len_target *= 2; | 2835 | name_len_target *= 2; |
2836 | } else { /* BB improve the check for buffer overruns BB */ | 2836 | } else { /* BB improve the check for buffer overruns BB */ |
@@ -3034,7 +3034,7 @@ winCreateHardLinkRetry: | |||
3034 | int | 3034 | int |
3035 | CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, | 3035 | CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, |
3036 | const unsigned char *searchName, char **symlinkinfo, | 3036 | const unsigned char *searchName, char **symlinkinfo, |
3037 | const struct nls_table *nls_codepage) | 3037 | const struct nls_table *nls_codepage, int remap) |
3038 | { | 3038 | { |
3039 | /* SMB_QUERY_FILE_UNIX_LINK */ | 3039 | /* SMB_QUERY_FILE_UNIX_LINK */ |
3040 | TRANSACTION2_QPI_REQ *pSMB = NULL; | 3040 | TRANSACTION2_QPI_REQ *pSMB = NULL; |
@@ -3055,8 +3055,9 @@ querySymLinkRetry: | |||
3055 | 3055 | ||
3056 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 3056 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
3057 | name_len = | 3057 | name_len = |
3058 | cifs_strtoUTF16((__le16 *) pSMB->FileName, searchName, | 3058 | cifsConvertToUTF16((__le16 *) pSMB->FileName, |
3059 | PATH_MAX, nls_codepage); | 3059 | searchName, PATH_MAX, nls_codepage, |
3060 | remap); | ||
3060 | name_len++; /* trailing null */ | 3061 | name_len++; /* trailing null */ |
3061 | name_len *= 2; | 3062 | name_len *= 2; |
3062 | } else { /* BB improve the check for buffer overruns BB */ | 3063 | } else { /* BB improve the check for buffer overruns BB */ |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 338d56936f6a..c3eb998a99bd 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -620,8 +620,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode, | |||
620 | } | 620 | } |
621 | rc = CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args, | 621 | rc = CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args, |
622 | cifs_sb->local_nls, | 622 | cifs_sb->local_nls, |
623 | cifs_sb->mnt_cifs_flags & | 623 | cifs_remap(cifs_sb)); |
624 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
625 | if (rc) | 624 | if (rc) |
626 | goto mknod_out; | 625 | goto mknod_out; |
627 | 626 | ||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index cafbf10521d5..5cfa7129d876 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -140,8 +140,7 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | |||
140 | posix_flags = cifs_posix_convert_flags(f_flags); | 140 | posix_flags = cifs_posix_convert_flags(f_flags); |
141 | rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data, | 141 | rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data, |
142 | poplock, full_path, cifs_sb->local_nls, | 142 | poplock, full_path, cifs_sb->local_nls, |
143 | cifs_sb->mnt_cifs_flags & | 143 | cifs_remap(cifs_sb)); |
144 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
145 | cifs_put_tlink(tlink); | 144 | cifs_put_tlink(tlink); |
146 | 145 | ||
147 | if (rc) | 146 | if (rc) |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 55b58112d122..ef71aa1515f6 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -373,8 +373,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
373 | 373 | ||
374 | /* could have done a find first instead but this returns more info */ | 374 | /* could have done a find first instead but this returns more info */ |
375 | rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data, | 375 | rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data, |
376 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | 376 | cifs_sb->local_nls, cifs_remap(cifs_sb)); |
377 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
378 | cifs_put_tlink(tlink); | 377 | cifs_put_tlink(tlink); |
379 | 378 | ||
380 | if (!rc) { | 379 | if (!rc) { |
@@ -2215,8 +2214,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) | |||
2215 | pTcon = tlink_tcon(tlink); | 2214 | pTcon = tlink_tcon(tlink); |
2216 | rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args, | 2215 | rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args, |
2217 | cifs_sb->local_nls, | 2216 | cifs_sb->local_nls, |
2218 | cifs_sb->mnt_cifs_flags & | 2217 | cifs_remap(cifs_sb)); |
2219 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
2220 | cifs_put_tlink(tlink); | 2218 | cifs_put_tlink(tlink); |
2221 | } | 2219 | } |
2222 | 2220 | ||
diff --git a/fs/cifs/link.c b/fs/cifs/link.c index 252e672d5604..e6c707cc62b3 100644 --- a/fs/cifs/link.c +++ b/fs/cifs/link.c | |||
@@ -717,7 +717,8 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) | |||
717 | rc = create_mf_symlink(xid, pTcon, cifs_sb, full_path, symname); | 717 | rc = create_mf_symlink(xid, pTcon, cifs_sb, full_path, symname); |
718 | else if (pTcon->unix_ext) | 718 | else if (pTcon->unix_ext) |
719 | rc = CIFSUnixCreateSymLink(xid, pTcon, full_path, symname, | 719 | rc = CIFSUnixCreateSymLink(xid, pTcon, full_path, symname, |
720 | cifs_sb->local_nls); | 720 | cifs_sb->local_nls, |
721 | cifs_remap(cifs_sb)); | ||
721 | /* else | 722 | /* else |
722 | rc = CIFSCreateReparseSymLink(xid, pTcon, fromName, toName, | 723 | rc = CIFSCreateReparseSymLink(xid, pTcon, fromName, toName, |
723 | cifs_sb_target->local_nls); */ | 724 | cifs_sb_target->local_nls); */ |
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c index 7bfdd6066276..fc537c29044e 100644 --- a/fs/cifs/smb1ops.c +++ b/fs/cifs/smb1ops.c | |||
@@ -960,7 +960,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, | |||
960 | /* Check for unix extensions */ | 960 | /* Check for unix extensions */ |
961 | if (cap_unix(tcon->ses)) { | 961 | if (cap_unix(tcon->ses)) { |
962 | rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, target_path, | 962 | rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, target_path, |
963 | cifs_sb->local_nls); | 963 | cifs_sb->local_nls, |
964 | cifs_remap(cifs_sb)); | ||
964 | if (rc == -EREMOTE) | 965 | if (rc == -EREMOTE) |
965 | rc = cifs_unix_dfs_readlink(xid, tcon, full_path, | 966 | rc = cifs_unix_dfs_readlink(xid, tcon, full_path, |
966 | target_path, | 967 | target_path, |