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;
}