summaryrefslogtreecommitdiff
path: root/user/ulib.c
diff options
context:
space:
mode:
authorAnish Athalye <[email protected]>2019-10-08 21:24:03 -0400
committerAnish Athalye <[email protected]>2019-10-08 21:24:03 -0400
commitf2df0fa5471c9951ff9a12bea51efbe22afb196e (patch)
tree6a78e4b456a80c04b8e65d4ec453345ac23d6159 /user/ulib.c
parent8509784d8000d6791a205626e81b03b3f9bf856b (diff)
downloadxv6-labs-f2df0fa5471c9951ff9a12bea51efbe22afb196e.tar.gz
xv6-labs-f2df0fa5471c9951ff9a12bea51efbe22afb196e.tar.bz2
xv6-labs-f2df0fa5471c9951ff9a12bea51efbe22afb196e.zip
Fix ulib's memmove to handle overlap when src<dst
Diffstat (limited to 'user/ulib.c')
-rw-r--r--user/ulib.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/user/ulib.c b/user/ulib.c
index 8bfba5d..4775939 100644
--- a/user/ulib.c
+++ b/user/ulib.c
@@ -103,8 +103,15 @@ memmove(void *vdst, const void *vsrc, int n)
dst = vdst;
src = vsrc;
- while(n-- > 0)
- *dst++ = *src++;
+ if (src > dst) {
+ while(n-- > 0)
+ *dst++ = *src++;
+ } else {
+ dst += n;
+ src += n;
+ while(n-- > 0)
+ *--dst = *--src;
+ }
return vdst;
}