Skip to content

Commit d8626c3

Browse files
authored
[sanitizer_common] Add internal_wcs[n]cpy functions (llvm#66529)
These functions are required for the related wcs[n]cpy functions to be wrapped on Windows, since given our current method of wrapping functions, calling REAL(wcs[n]cpy) is broken. @vitalybuka requested that these changes be split out from llvm#66128.
1 parent 51d5d7b commit d8626c3

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ char *internal_strncat(char *dst, const char *src, uptr n) {
199199
return dst;
200200
}
201201

202+
wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src) {
203+
wchar_t *dst_it = dst;
204+
do {
205+
*dst_it++ = *src++;
206+
} while (*src);
207+
return dst;
208+
}
209+
202210
uptr internal_strlcpy(char *dst, const char *src, uptr maxlen) {
203211
const uptr srclen = internal_strlen(src);
204212
if (srclen < maxlen) {
@@ -218,6 +226,14 @@ char *internal_strncpy(char *dst, const char *src, uptr n) {
218226
return dst;
219227
}
220228

229+
wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr n) {
230+
uptr i;
231+
for (i = 0; i < n && src[i]; ++i)
232+
dst[i] = src[i];
233+
internal_memset(dst + i, 0, (n - i) * sizeof(wchar_t));
234+
return dst;
235+
}
236+
221237
uptr internal_strnlen(const char *s, uptr maxlen) {
222238
uptr i = 0;
223239
while (i < maxlen && s[i]) i++;

compiler-rt/lib/sanitizer_common/sanitizer_libc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ int internal_snprintf(char *buffer, uptr length, const char *format, ...)
7171
FORMAT(3, 4);
7272
uptr internal_wcslen(const wchar_t *s);
7373
uptr internal_wcsnlen(const wchar_t *s, uptr maxlen);
74-
74+
wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src);
75+
wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr maxlen);
7576
// Return true if all bytes in [mem, mem+size) are zero.
7677
// Optimized for the case when the result is true.
7778
bool mem_is_zero(const char *mem, uptr size);

0 commit comments

Comments
 (0)