aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/cifsproto.h2
-rw-r--r--fs/cifs/misc.c60
-rw-r--r--fs/cifs/readdir.c26
3 files changed, 13 insertions, 75 deletions
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 7d54a5a4dd55..fae083930eee 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -306,8 +306,6 @@ extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
306 const unsigned char *searchName, __u64 *inode_number, 306 const unsigned char *searchName, __u64 *inode_number,
307 const struct nls_table *nls_codepage, 307 const struct nls_table *nls_codepage,
308 int remap_special_chars); 308 int remap_special_chars);
309extern int cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
310 const struct nls_table *codepage);
311extern int cifsConvertToUCS(__le16 *target, const char *source, int maxlen, 309extern int cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
312 const struct nls_table *cp, int mapChars); 310 const struct nls_table *cp, int mapChars);
313 311
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
index bb81c8af6a93..e079a9190ec4 100644
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -635,66 +635,6 @@ dump_smb(struct smb_hdr *smb_buf, int smb_buf_length)
635 return; 635 return;
636} 636}
637 637
638/* Convert 16 bit Unicode pathname from wire format to string in current code
639 page. Conversion may involve remapping up the seven characters that are
640 only legal in POSIX-like OS (if they are present in the string). Path
641 names are little endian 16 bit Unicode on the wire */
642int
643cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
644 const struct nls_table *cp)
645{
646 int i, j, len;
647 __u16 src_char;
648
649 for (i = 0, j = 0; i < maxlen; i++) {
650 src_char = le16_to_cpu(source[i]);
651 switch (src_char) {
652 case 0:
653 goto cUCS_out; /* BB check this BB */
654 case UNI_COLON:
655 target[j] = ':';
656 break;
657 case UNI_ASTERIK:
658 target[j] = '*';
659 break;
660 case UNI_QUESTION:
661 target[j] = '?';
662 break;
663 /* BB We can not handle remapping slash until
664 all the calls to build_path_from_dentry
665 are modified, as they use slash as separator BB */
666 /* case UNI_SLASH:
667 target[j] = '\\';
668 break;*/
669 case UNI_PIPE:
670 target[j] = '|';
671 break;
672 case UNI_GRTRTHAN:
673 target[j] = '>';
674 break;
675 case UNI_LESSTHAN:
676 target[j] = '<';
677 break;
678 default:
679 len = cp->uni2char(src_char, &target[j],
680 NLS_MAX_CHARSET_SIZE);
681 if (len > 0) {
682 j += len;
683 continue;
684 } else {
685 target[j] = '?';
686 }
687 }
688 j++;
689 /* make sure we do not overrun callers allocated temp buffer */
690 if (j >= (2 * NAME_MAX))
691 break;
692 }
693cUCS_out:
694 target[j] = 0;
695 return j;
696}
697
698/* Convert 16 bit Unicode pathname to wire format from string in current code 638/* Convert 16 bit Unicode pathname to wire format from string in current code
699 page. Conversion may involve remapping up the seven characters that are 639 page. Conversion may involve remapping up the seven characters that are
700 only legal in POSIX-like OS (if they are present in the string). Path 640 only legal in POSIX-like OS (if they are present in the string). Path
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
index ebd0da7ecb3d..e1351fe18a15 100644
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -31,6 +31,13 @@
31#include "cifs_fs_sb.h" 31#include "cifs_fs_sb.h"
32#include "cifsfs.h" 32#include "cifsfs.h"
33 33
34/*
35 * To be safe - for UCS to UTF-8 with strings loaded with the rare long
36 * characters alloc more to account for such multibyte target UTF-8
37 * characters.
38 */
39#define UNICODE_NAME_MAX ((4 * NAME_MAX) + 2)
40
34#ifdef CONFIG_CIFS_DEBUG2 41#ifdef CONFIG_CIFS_DEBUG2
35static void dump_cifs_file_struct(struct file *file, char *label) 42static void dump_cifs_file_struct(struct file *file, char *label)
36{ 43{
@@ -881,14 +888,11 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst,
881 } 888 }
882 889
883 if (unicode) { 890 if (unicode) {
884 /* BB fixme - test with long names */ 891 pqst->len = cifs_from_ucs2((char *) pqst->name,
885 /* Note converted filename can be longer than in unicode */ 892 (__le16 *) filename,
886 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR) 893 UNICODE_NAME_MAX, max_len, nlt,
887 pqst->len = cifs_convertUCSpath((char *)pqst->name, 894 cifs_sb->mnt_cifs_flags &
888 (__le16 *)filename, len/2, nlt); 895 CIFS_MOUNT_MAP_SPECIAL_CHR);
889 else
890 pqst->len = cifs_strfromUCS_le((char *)pqst->name,
891 (__le16 *)filename, len/2, nlt);
892 } else { 896 } else {
893 pqst->name = filename; 897 pqst->name = filename;
894 pqst->len = len; 898 pqst->len = len;
@@ -1070,11 +1074,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
1070 cifsFile->srch_inf.ntwrk_buf_start); 1074 cifsFile->srch_inf.ntwrk_buf_start);
1071 end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len; 1075 end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + max_len;
1072 1076
1073 /* To be safe - for UCS to UTF-8 with strings loaded 1077 tmp_buf = kmalloc(UNICODE_NAME_MAX, GFP_KERNEL);
1074 with the rare long characters alloc more to account for
1075 such multibyte target UTF-8 characters. cifs_unicode.c,
1076 which actually does the conversion, has the same limit */
1077 tmp_buf = kmalloc((4 * NAME_MAX) + 2, GFP_KERNEL);
1078 for (i = 0; (i < num_to_fill) && (rc == 0); i++) { 1078 for (i = 0; (i < num_to_fill) && (rc == 0); i++) {
1079 if (current_entry == NULL) { 1079 if (current_entry == NULL) {
1080 /* evaluate whether this case is an error */ 1080 /* evaluate whether this case is an error */