diff options
author | Andrew Waterman <andrew@sifive.com> | 2021-03-29 16:38:48 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2021-03-29 16:38:48 -0700 |
commit | 96f98f0caac211ec8f7a573e7592212f674f7c81 (patch) | |
tree | b13f99397017c6349562a00947ef3032f6495b55 /pk | |
parent | 75bbd1ecfac34ed20f88234872f66d7f670da4d2 (diff) | |
download | pk-96f98f0caac211ec8f7a573e7592212f674f7c81.zip pk-96f98f0caac211ec8f7a573e7592212f674f7c81.tar.gz pk-96f98f0caac211ec8f7a573e7592212f674f7c81.tar.bz2 |
pk: correctly restore sstatus.SUM in strcpy_from_user
Diffstat (limited to 'pk')
-rw-r--r-- | pk/usermem.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/pk/usermem.c b/pk/usermem.c index b65e515..cfe6f06 100644 --- a/pk/usermem.c +++ b/pk/usermem.c @@ -43,6 +43,8 @@ void memcpy_from_user(void* dst, const void* src, size_t n) bool strcpy_from_user(char* dst, const char* src, size_t n) { + bool res = false; + uintptr_t sstatus = set_csr(sstatus, SSTATUS_SUM); while (n > 0) { @@ -52,8 +54,10 @@ bool strcpy_from_user(char* dst, const char* src, size_t n) char ch = *(volatile const char*)src; *dst = ch; - if (ch == 0) - return true; + if (ch == 0) { + res = true; + break; + } src++; dst++; @@ -62,5 +66,5 @@ bool strcpy_from_user(char* dst, const char* src, size_t n) write_csr(sstatus, sstatus); - return false; + return res; } |