Skip to content

Commit c830716

Browse files
committed
stdlib: Add strlcat
Adds strlcat which can be used to safely concatenate strings Signed-off-by: Joshua Watt <[email protected]>
1 parent 2469b8b commit c830716

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ PROGOBJ = $(NASM) $(NDISASM)
104104
PROGS = nasm$(X) ndisasm$(X)
105105

106106
LIBOBJ_NW = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \
107-
stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) \
107+
stdlib/strnlen.$(O) stdlib/strrchrnul.$(O) stdlib/strlcat.$(O) \
108108
\
109109
nasmlib/ver.$(O) \
110110
nasmlib/alloc.$(O) nasmlib/asprintf.$(O) nasmlib/errfile.$(O) \

configure.ac

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ PA_FUNC_SNPRINTF
234234
PA_FUNC_VSNPRINTF
235235
AC_CHECK_FUNCS([strlcpy])
236236
AC_CHECK_FUNCS([strrchrnul])
237+
AC_CHECK_FUNCS([strlcat])
237238

238239
dnl These types are POSIX-specific, and Windows does it differently...
239240
AC_CHECK_TYPES([struct _stati64])
@@ -253,6 +254,7 @@ AC_CHECK_DECLS(strsep)
253254
AC_CHECK_DECLS(strlcpy)
254255
AC_CHECK_DECLS(strnlen)
255256
AC_CHECK_DECLS(strrchrnul)
257+
AC_CHECK_DECLS(strlcat)
256258

257259
dnl Check for missing types
258260
AC_TYPE_UINTPTR_T

include/compiler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ size_t strlcpy(char *, const char *, size_t);
169169
char *strrchrnul(const char *, int);
170170
#endif
171171

172+
#if !defined(HAVE_STRLCAT) || !HAVE_DECL_STRLCAT
173+
size_t strlcat(char *, const char *, size_t);
174+
#endif
175+
172176
#ifndef __cplusplus /* C++ has false, true, bool as keywords */
173177
# ifdef HAVE_STDBOOL_H
174178
# include <stdbool.h>

stdlib/strlcat.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright (c) 2019 Garmin Ltd. or its subsidiaries
3+
*
4+
* Permission to use, copy, modify, and distribute this software for any
5+
* purpose with or without fee is hereby granted, provided that the above
6+
* copyright notice and this permission notice appear in all copies.
7+
*
8+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15+
*/
16+
17+
#include "compiler.h"
18+
19+
/*
20+
* Concatenate src string to dest of size size. The destination buffer will
21+
* have no more than size-1 character when the operation finishes. Always NUL
22+
* terminates, unless size == 0 or dest has no NUL terminator. Returns
23+
* strlen(initial dest) + strlen(src); if retval >= size, truncation occurred.
24+
*/
25+
#ifndef HAVE_STRLCAT
26+
27+
size_t strlcat(char *dest, const char *src, size_t size)
28+
{
29+
size_t n;
30+
31+
/* find the NULL terminator in dest */
32+
for (n = 0; i < size && dest[n] != '\0'; n++)
33+
;
34+
35+
/* destination was not NULL terminated. Return the initial size */
36+
if (n == size)
37+
return size;
38+
39+
return strlcpy(&dest[n], src, size - n) + n;
40+
}
41+
42+
#endif
43+

0 commit comments

Comments
 (0)