forked from Minki/linux
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>
This commit is contained in:
parent
f5d0684e84
commit
bc8ebdc4f5
@ -24,6 +24,7 @@
|
||||
#include "cifsfs.h"
|
||||
#include "dns_resolve.h"
|
||||
#include "cifs_debug.h"
|
||||
#include "cifs_unicode.h"
|
||||
|
||||
static LIST_HEAD(cifs_dfs_automount_list);
|
||||
|
||||
@ -312,7 +313,7 @@ static struct vfsmount *cifs_dfs_do_automount(struct dentry *mntpt)
|
||||
xid = get_xid();
|
||||
rc = get_dfs_path(xid, ses, full_path + 1, cifs_sb->local_nls,
|
||||
&num_referrals, &referrals,
|
||||
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
cifs_remap(cifs_sb));
|
||||
free_xid(xid);
|
||||
|
||||
cifs_put_tlink(tlink);
|
||||
|
@ -469,6 +469,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
|
||||
seq_puts(s, ",nouser_xattr");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
|
||||
seq_puts(s, ",mapchars");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
|
||||
seq_puts(s, ",mapposix");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
|
||||
seq_puts(s, ",sfu");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
|
||||
|
@ -361,11 +361,11 @@ extern int CIFSUnixCreateHardLink(const unsigned int xid,
|
||||
extern int CIFSUnixCreateSymLink(const unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage);
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int CIFSSMBUnixQuerySymLink(const unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName, char **syminfo,
|
||||
const struct nls_table *nls_codepage);
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int CIFSSMBQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
__u16 fid, char **symlinkinfo,
|
||||
const struct nls_table *nls_codepage);
|
||||
|
@ -2784,7 +2784,7 @@ copyRetry:
|
||||
int
|
||||
CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage)
|
||||
const struct nls_table *nls_codepage, int remap)
|
||||
{
|
||||
TRANSACTION2_SPI_REQ *pSMB = NULL;
|
||||
TRANSACTION2_SPI_RSP *pSMBr = NULL;
|
||||
@ -2804,9 +2804,9 @@ createSymLinkRetry:
|
||||
|
||||
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
||||
name_len =
|
||||
cifs_strtoUTF16((__le16 *) pSMB->FileName, fromName,
|
||||
/* find define for this maxpathcomponent */
|
||||
PATH_MAX, nls_codepage);
|
||||
cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName,
|
||||
/* find define for this maxpathcomponent */
|
||||
PATH_MAX, nls_codepage, remap);
|
||||
name_len++; /* trailing null */
|
||||
name_len *= 2;
|
||||
|
||||
@ -2828,9 +2828,9 @@ createSymLinkRetry:
|
||||
data_offset = (char *) (&pSMB->hdr.Protocol) + offset;
|
||||
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
||||
name_len_target =
|
||||
cifs_strtoUTF16((__le16 *) data_offset, toName, PATH_MAX
|
||||
/* find define for this maxpathcomponent */
|
||||
, nls_codepage);
|
||||
cifsConvertToUTF16((__le16 *) data_offset, toName,
|
||||
/* find define for this maxpathcomponent */
|
||||
PATH_MAX, nls_codepage, remap);
|
||||
name_len_target++; /* trailing null */
|
||||
name_len_target *= 2;
|
||||
} else { /* BB improve the check for buffer overruns BB */
|
||||
@ -3034,7 +3034,7 @@ winCreateHardLinkRetry:
|
||||
int
|
||||
CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName, char **symlinkinfo,
|
||||
const struct nls_table *nls_codepage)
|
||||
const struct nls_table *nls_codepage, int remap)
|
||||
{
|
||||
/* SMB_QUERY_FILE_UNIX_LINK */
|
||||
TRANSACTION2_QPI_REQ *pSMB = NULL;
|
||||
@ -3055,8 +3055,9 @@ querySymLinkRetry:
|
||||
|
||||
if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
|
||||
name_len =
|
||||
cifs_strtoUTF16((__le16 *) pSMB->FileName, searchName,
|
||||
PATH_MAX, nls_codepage);
|
||||
cifsConvertToUTF16((__le16 *) pSMB->FileName,
|
||||
searchName, PATH_MAX, nls_codepage,
|
||||
remap);
|
||||
name_len++; /* trailing null */
|
||||
name_len *= 2;
|
||||
} else { /* BB improve the check for buffer overruns BB */
|
||||
|
@ -620,8 +620,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
|
||||
}
|
||||
rc = CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
|
||||
cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
cifs_remap(cifs_sb));
|
||||
if (rc)
|
||||
goto mknod_out;
|
||||
|
||||
|
@ -140,8 +140,7 @@ int cifs_posix_open(char *full_path, struct inode **pinode,
|
||||
posix_flags = cifs_posix_convert_flags(f_flags);
|
||||
rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
|
||||
poplock, full_path, cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
cifs_remap(cifs_sb));
|
||||
cifs_put_tlink(tlink);
|
||||
|
||||
if (rc)
|
||||
|
@ -373,8 +373,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
||||
|
||||
/* could have done a find first instead but this returns more info */
|
||||
rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data,
|
||||
cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
cifs_put_tlink(tlink);
|
||||
|
||||
if (!rc) {
|
||||
@ -2215,8 +2214,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
|
||||
pTcon = tlink_tcon(tlink);
|
||||
rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args,
|
||||
cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags &
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
cifs_remap(cifs_sb));
|
||||
cifs_put_tlink(tlink);
|
||||
}
|
||||
|
||||
|
@ -717,7 +717,8 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
|
||||
rc = create_mf_symlink(xid, pTcon, cifs_sb, full_path, symname);
|
||||
else if (pTcon->unix_ext)
|
||||
rc = CIFSUnixCreateSymLink(xid, pTcon, full_path, symname,
|
||||
cifs_sb->local_nls);
|
||||
cifs_sb->local_nls,
|
||||
cifs_remap(cifs_sb));
|
||||
/* else
|
||||
rc = CIFSCreateReparseSymLink(xid, pTcon, fromName, toName,
|
||||
cifs_sb_target->local_nls); */
|
||||
|
@ -960,7 +960,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
/* Check for unix extensions */
|
||||
if (cap_unix(tcon->ses)) {
|
||||
rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, target_path,
|
||||
cifs_sb->local_nls);
|
||||
cifs_sb->local_nls,
|
||||
cifs_remap(cifs_sb));
|
||||
if (rc == -EREMOTE)
|
||||
rc = cifs_unix_dfs_readlink(xid, tcon, full_path,
|
||||
target_path,
|
||||
|
Loading…
Reference in New Issue
Block a user