Module Name:    src
Committed By:   rin
Date:           Thu Mar  5 01:10:57 UTC 2020

Modified Files:
        src/sys/arch/powerpc/ibm4xx: copyinstr.c copyoutstr.c

Log Message:
copy{in,out}str: Correctly return ENAMETOOLONG if source is not
NUL-terminated.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/powerpc/ibm4xx/copyinstr.c \
    src/sys/arch/powerpc/ibm4xx/copyoutstr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/ibm4xx/copyinstr.c
diff -u src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.10 src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.11
--- src/sys/arch/powerpc/ibm4xx/copyinstr.c:1.10	Thu Mar  5 00:54:13 2020
+++ src/sys/arch/powerpc/ibm4xx/copyinstr.c	Thu Mar  5 01:10:57 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyinstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $	*/
+/*	$NetBSD: copyinstr.c,v 1.11 2020/03/05 01:10:57 rin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyinstr.c,v 1.11 2020/03/05 01:10:57 rin Exp $");
 
 #include <sys/param.h>
 #include <uvm/uvm_extern.h>
@@ -46,7 +46,8 @@ int
 copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done)
 {
 	struct pmap *pm = curproc->p_vmspace->vm_map.pmap;
-	int rv, msr, pid, tmp, ctx;
+	size_t resid;
+	int rv, msr, pid, data, ctx;
 	struct faultbuf env;
 
 	if (__predict_false(len == 0)) {
@@ -68,6 +69,7 @@ copyinstr(const void *udaddr, void *kadd
 		ctx = pm->pm_ctx;
 	}
 
+	resid = len;
 	__asm volatile(
 		"mtctr %3;"			/* Set up counter */
 		"mfmsr %0;"			/* Save MSR */
@@ -76,8 +78,6 @@ copyinstr(const void *udaddr, void *kadd
 		"mfpid %1;"			/* Save old PID */
 		"sync; isync;"
 
-		"li %3,0;"			/* Clear len */
-
 		"1: "
 		"mtpid %4; sync;"		/* Load user ctx */
 		"lbz %2,0(%5); addi %5,%5,1;"	/* Load byte */
@@ -86,16 +86,19 @@ copyinstr(const void *udaddr, void *kadd
 		"stb %2,0(%6); dcbf 0,%6; addi %6,%6,1;"
 						/* Store kernel byte */
 		"sync; isync;"
-		"addi %3,%3,1;"			/* Inc len */
 		"or. %2,%2,%2;"
 		"bdnzf 2,1b;"			/* while(ctr-- && !zero) */
 		"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
 		"sync; isync;"
-		: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
+		"mfctr %3;"			/* Restore resid */
+		: "=&r" (msr), "=&r" (pid), "=&r" (data), "+r" (resid)
 		: "r" (ctx), "b" (udaddr), "b" (kaddr));
 
 	curpcb->pcb_onfault = NULL;
 	if (done)
-		*done = len;
-	return 0;
+		*done = len - resid;
+	if (resid == 0 && (char)data != '\0')
+		return ENAMETOOLONG;
+	else
+		return 0;
 }
Index: src/sys/arch/powerpc/ibm4xx/copyoutstr.c
diff -u src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.10 src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.11
--- src/sys/arch/powerpc/ibm4xx/copyoutstr.c:1.10	Thu Mar  5 00:54:13 2020
+++ src/sys/arch/powerpc/ibm4xx/copyoutstr.c	Thu Mar  5 01:10:57 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyoutstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $	*/
+/*	$NetBSD: copyoutstr.c,v 1.11 2020/03/05 01:10:57 rin Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.10 2020/03/05 00:54:13 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyoutstr.c,v 1.11 2020/03/05 01:10:57 rin Exp $");
 
 #include <sys/param.h>
 #include <uvm/uvm_extern.h>
@@ -46,7 +46,8 @@ int
 copyoutstr(const void *kaddr, void *udaddr, size_t len, size_t *done)
 {
 	struct pmap *pm = curproc->p_vmspace->vm_map.pmap;
-	int rv, msr, pid, tmp, ctx;
+	size_t resid;
+	int rv, msr, pid, data, ctx;
 	struct faultbuf env;
 
 	if (__predict_false(len == 0)) {
@@ -68,6 +69,7 @@ copyoutstr(const void *kaddr, void *udad
 		ctx = pm->pm_ctx;
 	}
 
+	resid = len;
 	__asm volatile(
 		"mtctr %3;"			/* Set up counter */
 		"mfmsr %0;"			/* Save MSR */
@@ -76,8 +78,6 @@ copyoutstr(const void *kaddr, void *udad
 		"mfpid %1;"			/* Save old PID */
 		"sync; isync;"
 
-		"li %3,0;"			/* Clear len */
-
 		"1:"
 		"mtpid %1;sync;"
 		"lbz %2,0(%6); addi %6,%6,1;"	/* Store kernel byte */
@@ -86,17 +86,20 @@ copyoutstr(const void *kaddr, void *udad
 		"stb %2,0(%5); dcbf 0,%5; addi %5,%5,1;"
 						/* Load byte */
 		"sync; isync;"
-		"addi %3,%3,1;"			/* Inc len */
 		"or. %2,%2,%2;"
 		"bdnzf 2,1b;"			/* while(ctr-- && !zero) */
 
 		"mtpid %1; mtmsr %0;"		/* Restore PID, MSR */
 		"sync; isync;"
-		: "=&r" (msr), "=&r" (pid), "=&r" (tmp), "+b" (len)
+		"mfctr %3;"			/* Restore resid */
+		: "=&r" (msr), "=&r" (pid), "=&r" (data), "+r" (resid)
 		: "r" (ctx), "b" (udaddr), "b" (kaddr));
 
 	curpcb->pcb_onfault = NULL;
 	if (done)
-		*done = len;
-	return 0;
+		*done = len - resid;
+	if (resid == 0 && (char)data != '\0')
+		return ENAMETOOLONG;
+	else
+		return 0;
 }

Reply via email to