summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-02-21 21:57:37 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-02-26 14:05:44 +0100
commit2d91aeafcf87e32fd3b5d447e20f421ee5d9f91f (patch)
tree82aa173cfb284c712dbd773ef367c0ce27f9e640
parent241317985705f7a4cc81286692322c23fce03104 (diff)
kern: fix mig_strncpy
Previously, the function mig_strncpy would always zero-terminate the destination string. Make mig_strncpy behave like mig_strncpy and strncpy in the glibc. Also fix the implementation of mig_strncpy to return the length of the written string to align the implementation with the declaration in include/mach/mig_support.h. * kern/ipc_mig.c (mig_strncpy): Do not zero-terminate the destination string. Return length of destination string.
-rw-r--r--kern/ipc_mig.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/kern/ipc_mig.c b/kern/ipc_mig.c
index bbc38cf..f2c3f45 100644
--- a/kern/ipc_mig.c
+++ b/kern/ipc_mig.c
@@ -272,10 +272,10 @@ mig_put_reply_port(
/*
* mig_strncpy.c - by Joshua Block
*
- * mig_strncp -- Bounded string copy. Does what the library routine strncpy
- * OUGHT to do: Copies the (null terminated) string in src into dest, a
- * buffer of length len. Assures that the copy is still null terminated
- * and doesn't overflow the buffer, truncating the copy if necessary.
+ * mig_strncpy -- Bounded string copy. Does what the library routine
+ * strncpy does: Copies the (null terminated) string in src into dest,
+ * a buffer of length len. Returns the length of the destination
+ * string excluding the terminating null.
*
* Parameters:
*
@@ -285,22 +285,26 @@ mig_put_reply_port(
*
* len - Length of destination buffer.
*/
-void mig_strncpy(dest, src, len)
-char *dest;
-const char *src;
-int len;
+vm_size_t
+mig_strncpy(dest, src, len)
+ char *dest;
+ const char *src;
+ int len;
{
- int i;
+ char *dest_ = dest;
+ int i;
- if (len <= 0)
- return;
+ if (len <= 0)
+ return 0;
- for (i=1; i<len; i++)
- if (! (*dest++ = *src++))
- return;
+ for (i = 0; i < len; i++) {
+ if (! (*dest = *src))
+ break;
+ dest++;
+ src++;
+ }
- *dest = '\0';
- return;
+ return dest - dest_;
}
#define fast_send_right_lookup(name, port, abort) \