diff --git "a/sdk/lib/crt/mbstring/mbsncat.c" "b/sdk/lib/crt/mbstring/mbsncat.c" index 21e63d0c0a1..ea3516a5a9e 100644 --- "a/sdk/lib/crt/mbstring/mbsncat.c" +++ "b/sdk/lib/crt/mbstring/mbsncat.c" @@ -12,6 +12,11 @@ #include #include +static inline unsigned char* u_strncat( unsigned char* dst, const unsigned char* src, size_t len ) +{ + return (unsigned char*)strncat( (char*)dst, (const char*)src, len); +} + size_t _mbclen2(const unsigned int s); unsigned char *_mbset (unsigned char *string, int c); @@ -46,22 +51,33 @@ unsigned char *_mbsncat (unsigned char *dst, const unsigned char *src, size_t n) */ unsigned char * _mbsnbcat(unsigned char *dst, const unsigned char *src, size_t n) { - unsigned char *d; - const unsigned char *s = src; - if (n != 0) { - d = dst + _mbslen(dst); // get the end of string - d += _mbclen2(*d); // move 1 or 2 up + MSVCRT_pthreadmbcinfo mbcinfo = get_mbcinfo(); - do { - if ((*d++ = *s++) == 0) - { - while (--n != 0) - *d++ = 0; - break; - } - if ( !(n==1 && _ismbblead(*s)) ) - n--; - } while (n > 0); - } - return dst; + if (!MSVCRT_CHECK_PMT(dst && src)) + return NULL; + + if (mbcinfo->ismbcodepage) + { + unsigned char *res = dst; + while (*dst) + { + if (_ismbblead(*dst++)) + { + if (*dst) + { + dst++; + } + else + { + /* as per msdn overwrite the lead byte in front of '\0' */ + dst--; + break; + } + } + } + while (*src && n--) *dst++ = *src++; + *dst = '\0'; + return res; + } + return u_strncat(dst, src, n); /* ASCII CP */ }