]> granicus.if.org Git - zfs/commitdiff
Check for strlcat and strlcpy
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 12 Dec 2018 00:01:41 +0000 (16:01 -0800)
committerGitHub <noreply@github.com>
Wed, 12 Dec 2018 00:01:41 +0000 (16:01 -0800)
This partially reverts commit 8005ca4 by moving the strlcat()
and strlcpy() compatibility implementations back to their original
location.

In addition, these two functions were added to the AC_CHECK_FUNCS
macro. When these functions are available from the C library,
HAVE_STRLCAT and HAVE_STRLCPY will be defined and library version
used. Otherwise the compatibility version is built.

Reviewed-by: Sebastian Gottschall <s.gottschall@dd-wrt.com>
Reviewed-by: Alek Pinchuk <apinchuk@datto.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #8157
Closes #8202

config/user.m4
lib/libspl/Makefile.am
lib/libspl/include/string.h
lib/libspl/strlcat.c [new file with mode: 0644]
lib/libspl/strlcpy.c [new file with mode: 0644]
tests/zfs-tests/cmd/libzfs_input_check/Makefile.am

index 8c4655719b6924dad394583fba6914191eed5d0a..ca50823d8494af1bdfe308c12379f5323b827d2c 100644 (file)
@@ -21,7 +21,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
 
        ZFS_AC_TEST_FRAMEWORK
 
-       AC_CHECK_FUNCS([mlockall])
+       AC_CHECK_FUNCS([mlockall strlcat strlcpy])
 ])
 
 dnl #
index 8d0d4d03828112f31473dcf3e2b6419d1f28c955..5fceaf6a500bf44978fdbde24b09d2d9fcbcd3c5 100644 (file)
@@ -22,6 +22,8 @@ USER_C = \
        list.c \
        mkdirp.c \
        page.c \
+       strlcat.c \
+       strlcpy.c \
        timestamp.c \
        zone.c \
        include/sys/list.h \
index 8908ce228fde898d2b9b84d368a4205554ea151a..a7d40fa619435c5112c2b6ec40f9116cd160dfb9 100644 (file)
 #define        _LIBSPL_STRING_H
 
 #include_next <string.h>
-#include <sys/types.h>
 
-/*
- * Appends src to the dstsize buffer at dst. The append will never
- * overflow the destination buffer and the buffer will always be null
- * terminated. Never reference beyond &dst[dstsize-1] when computing
- * the length of the pre-existing string.
- */
-static inline size_t
-strlcat(char *dst, const char *src, size_t dstsize)
-{
-       char *df = dst;
-       size_t left = dstsize;
-       size_t l1;
-       size_t l2 = strlen(src);
-       size_t copied;
-
-       while (left-- != 0 && *df != '\0')
-               df++;
-
-       l1 = df - dst;
-
-       if (dstsize == l1)
-               return (l1 + l2);
-
-       copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
-       (void) memcpy(dst + l1, src, copied);
-       dst[l1+copied] = '\0';
-
-       return (l1 + l2);
-}
-
-/*
- * Copies src to the dstsize buffer at dst. The copy will never
- * overflow the destination buffer and the buffer will always be null
- * terminated.
- */
-static inline size_t
-strlcpy(char *dst, const char *src, size_t len)
-{
-       size_t slen = strlen(src);
-
-       if (len == 0)
-               return (slen);
-
-       size_t copied = (slen >= len) ? len - 1 : slen;
-       (void) memcpy(dst, src, copied);
-       dst[copied] = '\0';
+#ifndef HAVE_STRLCAT
+extern size_t strlcat(char *dst, const char *src, size_t dstsize);
+#endif
 
-       return (slen);
-}
+#ifndef HAVE_STRLCPY
+extern size_t strlcpy(char *dst, const char *src, size_t len);
+#endif
 
 #endif
diff --git a/lib/libspl/strlcat.c b/lib/libspl/strlcat.c
new file mode 100644 (file)
index 0000000..4528d87
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+#ifndef HAVE_STRLCAT
+
+#include <string.h>
+#include <sys/types.h>
+
+/*
+ * Appends src to the dstsize buffer at dst. The append will never
+ * overflow the destination buffer and the buffer will always be null
+ * terminated. Never reference beyond &dst[dstsize-1] when computing
+ * the length of the pre-existing string.
+ */
+
+size_t
+strlcat(char *dst, const char *src, size_t dstsize)
+{
+       char *df = dst;
+       size_t left = dstsize;
+       size_t l1;
+       size_t l2 = strlen(src);
+       size_t copied;
+
+       while (left-- != 0 && *df != '\0')
+               df++;
+       l1 = df - dst;
+       if (dstsize == l1)
+               return (l1 + l2);
+
+       copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
+       (void) memcpy(dst + l1, src, copied);
+       dst[l1+copied] = '\0';
+
+       return (l1 + l2);
+}
+
+#endif
diff --git a/lib/libspl/strlcpy.c b/lib/libspl/strlcpy.c
new file mode 100644 (file)
index 0000000..d483b91
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef HAVE_STRLCPY
+
+#include <string.h>
+#include <sys/types.h>
+
+/*
+ * Copies src to the dstsize buffer at dst. The copy will never
+ * overflow the destination buffer and the buffer will always be null
+ * terminated.
+ */
+
+size_t
+strlcpy(char *dst, const char *src, size_t len)
+{
+       size_t slen = strlen(src);
+       size_t copied;
+
+       if (len == 0)
+               return (slen);
+
+       if (slen >= len)
+               copied = len - 1;
+       else
+               copied = slen;
+       (void) memcpy(dst, src, copied);
+       dst[copied] = '\0';
+       return (slen);
+}
+
+#endif /* HAVE_STRLCPY */
index 0152d526ed7d549b2c15e6723284948039084483..b62a6bb0f564f2a9c4f057c828a4793ee02b36fa 100644 (file)
@@ -10,5 +10,6 @@ pkgexec_PROGRAMS = libzfs_input_check
 
 libzfs_input_check_SOURCES = libzfs_input_check.c
 libzfs_input_check_LDADD = \
+       $(top_builddir)/lib/libspl/libspl.la \
        $(top_builddir)/lib/libnvpair/libnvpair.la \
        $(top_builddir)/lib/libzfs_core/libzfs_core.la