summaryrefslogtreecommitdiffstats
path: root/releases/2.6.38.7/cifs-fix-cifsconverttoucs-for-the-mapchars-case.patch
diff options
context:
space:
mode:
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.patch65
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: