Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc/ibm4xx copy{in,out}str: Correctly return EN...



details:   https://anonhg.NetBSD.org/src/rev/a12e6f3c5e0a
branches:  trunk
changeset: 969895:a12e6f3c5e0a
user:      rin <rin%NetBSD.org@localhost>
date:      Thu Mar 05 01:10:57 2020 +0000

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

diffstat:

 sys/arch/powerpc/ibm4xx/copyinstr.c  |  21 ++++++++++++---------
 sys/arch/powerpc/ibm4xx/copyoutstr.c |  21 ++++++++++++---------
 2 files changed, 24 insertions(+), 18 deletions(-)

diffs (139 lines):

diff -r 2ee314c95d68 -r a12e6f3c5e0a sys/arch/powerpc/ibm4xx/copyinstr.c
--- a/sys/arch/powerpc/ibm4xx/copyinstr.c       Thu Mar 05 00:54:13 2020 +0000
+++ b/sys/arch/powerpc/ibm4xx/copyinstr.c       Thu Mar 05 01:10:57 2020 +0000
@@ -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 @@
 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 @@
                ctx = pm->pm_ctx;
        }
 
+       resid = len;
        __asm volatile(
                "mtctr %3;"                     /* Set up counter */
                "mfmsr %0;"                     /* Save MSR */
@@ -76,8 +78,6 @@
                "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 @@
                "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;
 }
diff -r 2ee314c95d68 -r a12e6f3c5e0a sys/arch/powerpc/ibm4xx/copyoutstr.c
--- a/sys/arch/powerpc/ibm4xx/copyoutstr.c      Thu Mar 05 00:54:13 2020 +0000
+++ b/sys/arch/powerpc/ibm4xx/copyoutstr.c      Thu Mar 05 01:10:57 2020 +0000
@@ -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 @@
 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 @@
                ctx = pm->pm_ctx;
        }
 
+       resid = len;
        __asm volatile(
                "mtctr %3;"                     /* Set up counter */
                "mfmsr %0;"                     /* Save MSR */
@@ -76,8 +78,6 @@
                "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 @@
                "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;
 }



Home | Main Index | Thread Index | Old Index