[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