From 1c5023002bad3a5b0bbc181fdb324160beace733 Mon Sep 17 00:00:00 2001
|
From: Joshua Watt <JPEWhacker@gmail.com>
|
Date: Tue, 19 Nov 2019 12:47:30 -0600
|
Subject: [PATCH] stdlib: Add strlcat
|
|
Adds strlcat which can be used to safely concatenate strings
|
|
Upstream-Status: Submitted [https://bugzilla.nasm.us/show_bug.cgi?id=3392635]
|
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
|
|
---
|
Makefile.in | 2 +-
|
configure.ac | 2 ++
|
include/compiler.h | 4 ++++
|
stdlib/strlcat.c | 43 +++++++++++++++++++++++++++++++++++++++++++
|
4 files changed, 50 insertions(+), 1 deletion(-)
|
create mode 100644 stdlib/strlcat.c
|
|
diff --git a/Makefile.in b/Makefile.in
|
index bfae1f8..156dc4c 100644
|
--- a/Makefile.in
|
+++ b/Makefile.in
|
@@ -101,7 +101,7 @@ NASM = asm/nasm.$(O)
|
NDISASM = disasm/ndisasm.$(O)
|
|
LIBOBJ = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \
|
- stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) \
|
+ stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) stdlib/strlcat.$(O) \
|
\
|
nasmlib/ver.$(O) \
|
nasmlib/alloc.$(O) nasmlib/asprintf.$(O) nasmlib/errfile.$(O) \
|
diff --git a/configure.ac b/configure.ac
|
index 7b72769..14fd033 100644
|
--- a/configure.ac
|
+++ b/configure.ac
|
@@ -234,6 +234,7 @@ PA_FUNC_SNPRINTF
|
PA_FUNC_VSNPRINTF
|
AC_CHECK_FUNCS([strlcpy])
|
AC_CHECK_FUNCS([strrchrnul])
|
+AC_CHECK_FUNCS([strlcat])
|
|
dnl These types are POSIX-specific, and Windows does it differently...
|
AC_CHECK_TYPES([struct _stati64])
|
@@ -253,6 +254,7 @@ AC_CHECK_DECLS(strsep)
|
AC_CHECK_DECLS(strlcpy)
|
AC_CHECK_DECLS(strnlen)
|
AC_CHECK_DECLS(strrchrnul)
|
+AC_CHECK_DECLS(strlcat)
|
|
dnl Check for missing types
|
AC_TYPE_UINTPTR_T
|
diff --git a/include/compiler.h b/include/compiler.h
|
index b4fd3a8..7fb4821 100644
|
--- a/include/compiler.h
|
+++ b/include/compiler.h
|
@@ -169,6 +169,10 @@ size_t strlcpy(char *, const char *, size_t);
|
char *strrchrnul(const char *, int);
|
#endif
|
|
+#if !defined(HAVE_STRLCAT) || !HAVE_DECL_STRLCAT
|
+size_t strlcat(char *, const char *, size_t);
|
+#endif
|
+
|
#ifndef __cplusplus /* C++ has false, true, bool as keywords */
|
# ifdef HAVE_STDBOOL_H
|
# include <stdbool.h>
|
diff --git a/stdlib/strlcat.c b/stdlib/strlcat.c
|
new file mode 100644
|
index 0000000..7084d46
|
--- /dev/null
|
+++ b/stdlib/strlcat.c
|
@@ -0,0 +1,43 @@
|
+/*
|
+ * Copyright (c) 2019 Garmin Ltd. or its subsidiaries
|
+ *
|
+ * Permission to use, copy, modify, and distribute this software for any
|
+ * purpose with or without fee is hereby granted, provided that the above
|
+ * copyright notice and this permission notice appear in all copies.
|
+ *
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
+ */
|
+
|
+#include "compiler.h"
|
+
|
+/*
|
+ * Concatenate src string to dest of size size. The destination buffer will
|
+ * have no more than size-1 character when the operation finishes. Always NUL
|
+ * terminates, unless size == 0 or dest has no NUL terminator. Returns
|
+ * strlen(initial dest) + strlen(src); if retval >= size, truncation occurred.
|
+ */
|
+#ifndef HAVE_STRLCAT
|
+
|
+size_t strlcat(char *dest, const char *src, size_t size)
|
+{
|
+ size_t n;
|
+
|
+ /* find the NULL terminator in dest */
|
+ for (n = 0; i < size && dest[n] != '\0'; n++)
|
+ ;
|
+
|
+ /* destination was not NULL terminated. Return the initial size */
|
+ if (n == size)
|
+ return size;
|
+
|
+ return strlcpy(&dest[n], src, size - n) + n;
|
+}
|
+
|
+#endif
|
+
|