diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-02-21 21:57:37 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-02-26 14:05:44 +0100 |
commit | 2d91aeafcf87e32fd3b5d447e20f421ee5d9f91f (patch) | |
tree | 82aa173cfb284c712dbd773ef367c0ce27f9e640 /kern | |
parent | 241317985705f7a4cc81286692322c23fce03104 (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.
Diffstat (limited to 'kern')
-rw-r--r-- | kern/ipc_mig.c | 36 |
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) \ |