[compiler-rt] [sanitizer_common] Add internal_wcs[n]cpy functions (PR #66529)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 15 09:59:43 PDT 2023


https://github.com/vitalybuka updated https://github.com/llvm/llvm-project/pull/66529

>From d15f31d89b467589213787bd61e0b5617ce83fee Mon Sep 17 00:00:00 2001
From: Nicole Mazzuca <nicole at strega-nil.co>
Date: Fri, 15 Sep 2023 09:35:46 -0700
Subject: [PATCH 1/2] [sanitizer_common] Add internal_wcs[n]cpy functions

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/llvm-project#66128.
---
 .../lib/sanitizer_common/sanitizer_libc.cpp      | 16 ++++++++++++++++
 .../lib/sanitizer_common/sanitizer_libc.h        |  3 ++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
index 4a6fa5e8dbacb49..bb4592aa14c7c44 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
@@ -199,6 +199,14 @@ char *internal_strncat(char *dst, const char *src, uptr n) {
   return dst;
 }
 
+wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src) {
+  wchar_t *dst_it = dst;
+  do {
+    *dst_it++ = *src++;
+  } while (*src);
+  return dst;
+}
+
 uptr internal_strlcpy(char *dst, const char *src, uptr maxlen) {
   const uptr srclen = internal_strlen(src);
   if (srclen < maxlen) {
@@ -217,6 +225,14 @@ char *internal_strncpy(char *dst, const char *src, uptr n) {
   internal_memset(dst + i, '\0', n - i);
   return dst;
 }
+wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr n) {
+  uptr i;
+  for (i = 0; i < n && src[i]; ++i) {
+    dst[i] = src[i];
+  }
+  internal_memset(dst + i, 0, (n - i) * sizeof(wchar_t));
+  return dst;
+}
 
 uptr internal_strnlen(const char *s, uptr maxlen) {
   uptr i = 0;
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h
index e881db2079086d4..1906569e2a5fc55 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h
@@ -71,7 +71,8 @@ int internal_snprintf(char *buffer, uptr length, const char *format, ...)
     FORMAT(3, 4);
 uptr internal_wcslen(const wchar_t *s);
 uptr internal_wcsnlen(const wchar_t *s, uptr maxlen);
-
+wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src);
+wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr maxlen);
 // Return true if all bytes in [mem, mem+size) are zero.
 // Optimized for the case when the result is true.
 bool mem_is_zero(const char *mem, uptr size);

>From 5838c089d2d0c32224c8209c2b4a027d5860f978 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at gmail.com>
Date: Fri, 15 Sep 2023 09:59:31 -0700
Subject: [PATCH 2/2] New line

---
 compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
index bb4592aa14c7c44..5ea324107aa33b8 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
@@ -225,6 +225,7 @@ char *internal_strncpy(char *dst, const char *src, uptr n) {
   internal_memset(dst + i, '\0', n - i);
   return dst;
 }
+
 wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr n) {
   uptr i;
   for (i = 0; i < n && src[i]; ++i) {



More information about the llvm-commits mailing list