[PATCH] D14714: [compiler-rt] Add internal implementations for strlcat and strlcpy

Anna Zaks via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 16 10:21:38 PST 2015


zaks.anna created this revision.
zaks.anna added reviewers: samsonov, kcc.
zaks.anna added a subscriber: llvm-commits.

The compiler-rt should make use of strlcpy() rather than strncpy(). Using internal_strncpy() may be fine with appropriate bounds checking or enforcement of nul-termination elsewhere, but it's just good practice these days to avoid using strncpy() in new code.

A patch by Jeremy Sequoia!

http://reviews.llvm.org/D14714

Files:
  lib/sanitizer_common/sanitizer_libc.cc
  lib/sanitizer_common/sanitizer_libc.h

Index: lib/sanitizer_common/sanitizer_libc.h
===================================================================
--- lib/sanitizer_common/sanitizer_libc.h
+++ lib/sanitizer_common/sanitizer_libc.h
@@ -43,8 +43,10 @@
 char *internal_strdup(const char *s);
 char *internal_strndup(const char *s, uptr n);
 uptr internal_strlen(const char *s);
+uptr internal_strlcat(char *dst, const char *src, uptr maxlen);
 char *internal_strncat(char *dst, const char *src, uptr n);
 int internal_strncmp(const char *s1, const char *s2, uptr n);
+uptr internal_strlcpy(char *dst, const char *src, uptr maxlen);
 char *internal_strncpy(char *dst, const char *src, uptr n);
 uptr internal_strnlen(const char *s, uptr maxlen);
 char *internal_strrchr(const char *s, int c);
Index: lib/sanitizer_common/sanitizer_libc.cc
===================================================================
--- lib/sanitizer_common/sanitizer_libc.cc
+++ lib/sanitizer_common/sanitizer_libc.cc
@@ -175,6 +175,19 @@
   return i;
 }
 
+uptr internal_strlcat(char *dst, const char *src, uptr maxlen) {
+  const uptr srclen = internal_strlen(src);
+  const uptr dstlen = internal_strnlen(dst, maxlen);
+  if (dstlen == maxlen) return maxlen+srclen;
+  if (srclen < maxlen-dstlen) {
+      internal_memcpy(dst+dstlen, src, srclen+1);
+  } else {
+      internal_memcpy(dst+dstlen, src, maxlen-dstlen-1);
+      dst[maxlen-1] = '\0';
+  }
+  return dstlen + srclen;
+}
+
 char *internal_strncat(char *dst, const char *src, uptr n) {
   uptr len = internal_strlen(dst);
   uptr i;
@@ -184,6 +197,17 @@
   return dst;
 }
 
+uptr internal_strlcpy(char *dst, const char *src, uptr maxlen) {
+  const uptr srclen = internal_strlen(src);
+  if (srclen < maxlen) {
+    internal_memcpy(dst, src, srclen+1);
+  } else if (maxlen != 0) {
+    internal_memcpy(dst, src, maxlen-1);
+    dst[maxlen-1] = '\0';
+  }
+  return srclen;
+}
+
 char *internal_strncpy(char *dst, const char *src, uptr n) {
   uptr i;
   for (i = 0; i < n && src[i]; i++)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14714.40309.patch
Type: text/x-patch
Size: 1991 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151116/2b4fc07b/attachment.bin>


More information about the llvm-commits mailing list