From 0cdf6bea3e25d3585cf74ee5fb8d535cbdbb4963 Mon Sep 17 00:00:00 2001 From: corinna Date: Tue, 17 Mar 2009 12:16:27 +0000 Subject: [PATCH] * libc/stdlib/mbstowcs_r.c (_mbstowcs_r): Handle NULL destination string correctly. --- newlib/ChangeLog | 5 +++++ newlib/libc/stdlib/mbstowcs_r.c | 20 ++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 18a86162cd..5e84cb47de 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2009-03-17 Corinna Vinschen + + * libc/stdlib/mbstowcs_r.c (_mbstowcs_r): Handle NULL destination + string correctly. + 2009-03-16 Mark Mitchell * libc/machine/arm/strlen.c (strlen): Fix defect in Thumb-2 mode. diff --git a/newlib/libc/stdlib/mbstowcs_r.c b/newlib/libc/stdlib/mbstowcs_r.c index c6130b2bd8..3dd73e42c9 100644 --- a/newlib/libc/stdlib/mbstowcs_r.c +++ b/newlib/libc/stdlib/mbstowcs_r.c @@ -9,25 +9,29 @@ _DEFUN (_mbstowcs_r, (reent, pwcs, s, n, state), size_t n _AND mbstate_t *state) { - wchar_t *ptr = pwcs; - size_t max = n; + size_t ret = 0; char *t = (char *)s; int bytes; + if (!pwcs) + n = (size_t) 1; /* Value doesn't matter as long as it's not 0. */ while (n > 0) { - bytes = _mbtowc_r (r, ptr, t, MB_CUR_MAX, state); + bytes = _mbtowc_r (r, pwcs, t, MB_CUR_MAX, state); if (bytes < 0) { state->__count = 0; return -1; } else if (bytes == 0) - return ptr - pwcs; + break; t += bytes; - ++ptr; - --n; + ++ret; + if (pwcs) + { + ++pwcs; + --n; + } } - - return max; + return ret; } -- 2.11.0