diff options
Diffstat (limited to 'releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch')
-rw-r--r-- | releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch b/releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch new file mode 100644 index 0000000000..12f0f43742 --- /dev/null +++ b/releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch @@ -0,0 +1,65 @@ +From 11379b5e33950048ad66825da7f462b0d0da9d73 Mon Sep 17 00:00:00 2001 +From: Jeff Layton <jlayton@redhat.com> +Date: Tue, 17 May 2011 15:28:21 -0400 +Subject: cifs: fix cifsConvertToUCS() for the mapchars case + +From: Jeff Layton <jlayton@redhat.com> + +commit 11379b5e33950048ad66825da7f462b0d0da9d73 upstream. + +As Metze pointed out, commit 84cdf74e broke mapchars option: + + Commit "cifs: fix unaligned accesses in cifsConvertToUCS" + (84cdf74e8096a10dd6acbb870dd404b92f07a756) does multiple steps + in just one commit (moving the function and changing it without + testing). + + put_unaligned_le16(temp, &target[j]); is never called for any + codepoint the goes via the 'default' switch statement. As a result + we put just zero (or maybe uninitialized) bytes into the target + buffer. + +His proposed patch looks correct, but doesn't apply to the current head +of the tree. This patch should also fix it. + +Reported-by: Stefan Metzmacher <metze@samba.org> +Signed-off-by: Jeff Layton <jlayton@redhat.com> +Signed-off-by: Steve French <sfrench@us.ibm.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + fs/cifs/cifs_unicode.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +--- a/fs/cifs/cifs_unicode.c ++++ b/fs/cifs/cifs_unicode.c +@@ -277,6 +277,7 @@ cifsConvertToUCS(__le16 *target, const c + + for (i = 0, j = 0; i < srclen; j++) { + src_char = source[i]; ++ charlen = 1; + switch (src_char) { + case 0: + put_unaligned(0, &target[j]); +@@ -316,16 +317,13 @@ cifsConvertToUCS(__le16 *target, const c + dst_char = cpu_to_le16(0x003f); + charlen = 1; + } +- /* +- * character may take more than one byte in the source +- * string, but will take exactly two bytes in the +- * target string +- */ +- i += charlen; +- continue; + } ++ /* ++ * character may take more than one byte in the source string, ++ * but will take exactly two bytes in the target string ++ */ ++ i += charlen; + put_unaligned(dst_char, &target[j]); +- i++; /* move to next char in source string */ + } + + ctoUCS_out: |