Fix strncpy() and strncat().

diff --git a/klibc/strncat.c b/klibc/strncat.c
index 264ba31..0dd9deb 100644
--- a/klibc/strncat.c
+++ b/klibc/strncat.c
@@ -8,13 +8,18 @@
 char *strncat(char *dst, const char *src, size_t n)
 {
   char *q = strchr(dst, '\0');
+  const char *p = src;
+  char ch;
   size_t nn = q-dst;
 
   if ( __likely(nn <= n) )
-    n = nn;
+    n -= nn;
 
-  memcpy(q, src, n);
-  q[n] = '\0';
+  while (n--) {
+    *q++ = ch = *p++;
+    if ( !ch )
+      break;
+  }
 
   return dst;
 }
diff --git a/klibc/strncpy.c b/klibc/strncpy.c
index f171e08..06964f3 100644
--- a/klibc/strncpy.c
+++ b/klibc/strncpy.c
@@ -10,7 +10,8 @@
   const char *p = src;
   char ch;
 
-  while ( n-- ) {
+  while (n) {
+    n--;
     *q++ = ch = *p++;
     if ( !ch )
       break;