[PATCH] Fixup 32 bit sys_recvmsg corruption patch

Linux Kernel Mailing List <[email protected]> Wed, 23 Feb 2005 06:13:02 +0000
Newsgroups gmane.linux.kernel.commits.2-4
Message-ID <[email protected]>
ChangeSet 1.1537.10.1, 2005/02/23 03:13:02-03:00, [email protected]

	[PATCH] Fixup 32 bit sys_recvmsg corruption patch
	
	> Marcelo already put in an earlier version of your patch with
	> the typo in the conditional which broke compilation on every
	> platform.
	>
	> Please send him a relative patch to fix things up.
	
	Sorry about that.  Here is a relative patch that fixes the mossing || and
	removes the printk as requested by Andi.



 ia64/ia32/sys_ia32.c         |   14 ++------------
 mips64/kernel/linux32.c      |   14 ++------------
 parisc/kernel/sys_parisc32.c |   14 ++------------
 ppc64/kernel/sys_ppc32.c     |   14 ++------------
 s390x/kernel/linux32.c       |   14 ++------------
 sparc64/kernel/sys_sparc32.c |   14 ++------------
 x86_64/ia32/socket32.c       |   14 ++------------
 7 files changed, 14 insertions(+), 84 deletions(-)


diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
--- a/arch/ia64/ia32/sys_ia32.c	2005-02-23 10:06:43 -08:00
+++ b/arch/ia64/ia32/sys_ia32.c	2005-02-23 10:06:43 -08:00
@@ -1684,19 +1684,9 @@
 			goto fail2;
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
diff -Nru a/arch/mips64/kernel/linux32.c b/arch/mips64/kernel/linux32.c
--- a/arch/mips64/kernel/linux32.c	2005-02-23 10:06:44 -08:00
+++ b/arch/mips64/kernel/linux32.c	2005-02-23 10:06:44 -08:00
@@ -2822,19 +2822,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
diff -Nru a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
--- a/arch/parisc/kernel/sys_parisc32.c	2005-02-23 10:06:43 -08:00
+++ b/arch/parisc/kernel/sys_parisc32.c	2005-02-23 10:06:43 -08:00
@@ -2138,19 +2138,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
diff -Nru a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c
--- a/arch/ppc64/kernel/sys_ppc32.c	2005-02-23 10:06:43 -08:00
+++ b/arch/ppc64/kernel/sys_ppc32.c	2005-02-23 10:06:43 -08:00
@@ -3696,19 +3696,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
diff -Nru a/arch/s390x/kernel/linux32.c b/arch/s390x/kernel/linux32.c
--- a/arch/s390x/kernel/linux32.c	2005-02-23 10:06:44 -08:00
+++ b/arch/s390x/kernel/linux32.c	2005-02-23 10:06:44 -08:00
@@ -2629,19 +2629,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +
diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
--- a/arch/sparc64/kernel/sys_sparc32.c	2005-02-23 10:06:44 -08:00
+++ b/arch/sparc64/kernel/sys_sparc32.c	2005-02-23 10:06:44 -08:00
@@ -2679,19 +2679,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		if (kcmsg32->cmsg_level == SOL_SOCKET &&
 			kcmsg32->cmsg_type == SO_TIMESTAMP) {
 			struct timeval tv;
diff -Nru a/arch/x86_64/ia32/socket32.c b/arch/x86_64/ia32/socket32.c
--- a/arch/x86_64/ia32/socket32.c	2005-02-23 10:06:43 -08:00
+++ b/arch/x86_64/ia32/socket32.c	2005-02-23 10:06:43 -08:00
@@ -334,19 +334,9 @@
 		__get_user(kcmsg32->cmsg_type, &ucmsg->cmsg_type);
 
 		clen64 = kcmsg32->cmsg_len;
-		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg)))
-				(clen64 > (orig_cmsg_len + wp - workbuf))) {
-			static int count;
-
-			if (count++ < 20)
-				printk(KERN_WARNING "recvmsg_fixup: "
-					"bad data length %d, level %d, "
-					"type %d, process %d (%s)\n",
-					clen64, kcmsg32->cmsg_level,
-					kcmsg32->cmsg_type,
-					current->pid, current->comm);
+		if ((clen64 < CMSG_ALIGN(sizeof(*ucmsg))) ||
+				(clen64 > (orig_cmsg_len + wp - workbuf)))
 			break;
-		}
 		copy_from_user(CMSG32_DATA(kcmsg32), CMSG_DATA(ucmsg),
 			       clen64 - CMSG_ALIGN(sizeof(*ucmsg)));
 		clen32 = ((clen64 - CMSG_ALIGN(sizeof(*ucmsg))) +