Use libbsd for strlcpy if available
Subsystems (3)
PATCH 1/1 Use libbsd for strlcpy if available
If libc does not provide strlcpy check for libbsd with pkg-config to avoid relying on inline version.
---
This allows distro maintainers to be able to choose to reduce duplication and let this code be maintained in one place, in the external library.
configure | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
configure +10 -2
@@ -330,8 +330,16 @@ EOF then echo "no" else - echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG - echo "yes" + if ${PKG_CONFIG} libbsd --exists + then + echo 'CFLAGS += -include' `${PKG_CONFIG} libbsd --variable=includedir`'/bsd/string.h' \ + `${PKG_CONFIG} libbsd --cflags` >>$CONFIG + echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG + echo "no" + else + echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG + echo "yes" + fi fi rm -f $TMPDIR/strtest.c $TMPDIR/strtest }
Signature · 1 line
2.19.1
Quoted 26 lines · Luca Boccassi
If libc does not provide strlcpy check for libbsd with pkg-config to avoid relying on inline version.
Signed-off-by Luca Boccassi <[email protected]>---
This allows distro maintainers to be able to choose to reduce duplication and let this code be maintained in one place, in the external library.configure | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)configure +3
-2@@ -330,8 +330,16 @@ EOF then echo "no" else - echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG - echo "yes" + if ${PKG_CONFIG} libbsd --exists + then + echo 'CFLAGS += -include' `${PKG_CONFIG} libbsd --variable=includedir`'/bsd/string.h' \
configure EOF · line 345
Quoted 10 lines
configure +7
-0+ `${PKG_CONFIG} libbsd --cflags` >>$CONFIG + echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG + echo "no" + else + echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG + echo "yes" + fi fi rm -f $TMPDIR/strtest.c $TMPDIR/strtest }
How long has libbsd had an implementation of strlcpy? Would be safer to have a compile test to verify libbsd has it.
Quoted 36 lines · David Ahern
Quoted 35 lines · Luca Boccassi
If libc does not provide strlcpy check for libbsd with pkg-config to
avoid relying on inline version.Signed-off-by Luca Boccassi <[email protected]>---
This allows distro maintainers to be able to choose to reduce duplication and let this code be maintained in one place, in the external library.configure | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)configure +0
-0@@ -330,8 +330,16 @@ EOFthen
echo "no"
elseconfigure +3
-2- echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG - echo "yes" + if ${PKG_CONFIG} libbsd --exists + then + echo 'CFLAGS += -include' `${PKG_CONFIG} libbsd --variable=includedir`'/bsd/string.h' \
configure +2
-0+ `${PKG_CONFIG} libbsd --cflags` >>$CONFIG + echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >>$CONFIG
configure +5
-0+ echo "no" + else + echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG + echo "yes" + fi
Quoted 8 lines
Quoted 4 lines
fi
rm -f$TMPDIR/strtest.c$TMPDIR/strtest
}How long has libbsd had an implementation of strlcpy? Would be safer to
have a compile test to verify libbsd has it.
Hi,
0.0 from 10+ years ago has it, so I think we are safe :-)
https://gitlab.freedesktop.org/libbsd/libbsd/blob/0.0/include/bsd/string.h#L34
Signature · 2 lines
Kind regards, Luca Boccassi
Quoted 9 lines · On Mon, 29 Oct 2018 10:46:50 +0000 Luca Boccassi <[email protected]> wrote:
If libc does not provide strlcpy check for libbsd with pkg-config to avoid relying on inline version.
Signed-off-by Luca Boccassi <[email protected]>---
This allows distro maintainers to be able to choose to reduce duplication and let this code be maintained in one place, in the external library.
I like the idea, but it causes warnings on Debian testing, and maybe other distros.
ipnetns.c:2: warning: "_ATFILE_SOURCE" redefined
#define _ATFILE_SOURCE
In file included from /usr/include/x86_64-linux-gnu/bits/libc-header-start.h:33,
from /usr/include/string.h:26,
from /usr/include/bsd/string.h:30,
from <command-line>:
/usr/include/features.h:326: note: this is the location of the previous definition
# define _ATFILE_SOURCE 1Please figure out how to handle this and resubmit. SUSE open build service might also work to test multiple distro's
Quoted 27 lines · Stephen Hemminger
Quoted 10 lines · On Mon, 29 Oct 2018 10:46:50 +0000 Luca Boccassi <[email protected]> wrote:
If libc does not provide strlcpy check for libbsd with pkg-config to
avoid relying on inline version.Signed-off-by Luca Boccassi <[email protected]>---
This allows distro maintainers to be able to choose to reduce duplication and let this code be maintained in one place, in the external library.I like the idea, but it causes warnings on Debian testing, and maybe other distros.
ipnetns.c:2: warning: "
_ATFILE_SOURCE" redefined
#define_ATFILE_SOURCE
In file included from/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:33,
from/usr/include/string.h:26,
from/usr/include/bsd/string.h:30,
from <command-line>:/usr/include/features.h:326: note: this is the location of the previous definition
Quoted 6 lines
# define _ATFILE_SOURCE 1Please figure out how to handle this and resubmit. SUSE open build service might
also work to test multiple distro's
Ah missed that. That happens because features.h defines _ATFILE_SOURCE to 1, but ip/ipnetns.c defines it without a value. According to the spec either way doesn't change the result.
This happens because of the quick hack of using -include /usr/include/bsd/string.h which was, well, a quick hack and didn't require to add the include manually everywhere strlcpy was used, even in the future. But it has side effects like this.
So I'll send v2 with a less hacky fix, which means defining HAVE_LIBBSD in configure and doing #ifdef HAVE_LIBBSD #include <bsd/string.h> in every file. It also means that this needs to be done for every future use of strlcpy, or the build with libbsd will break.
If you or David prefer the hacky way, I can instead send a v3 that does the quick hack, and also changes _ATFILE_SOURCE to 1 so that there is no complaint from the compiler, as the values will be the same.
Signature · 2 lines
Kind regards, Luca Boccassi
PATCH v2 1/1 Use libbsd for strlcpy if available
In reply to Luca BoccassiIf libc does not provide strlcpy check for libbsd with pkg-config to avoid relying on inline version.
---
Changed from -include /usr/include/bsd/string.h hack to HAVE_LIBBSD and proper includes in each file that uses strlcpy.
The hack causes a compiler warning as ip/ipnetns.c defines _ATFILE_SOURCE without a value, but system headers use 1, so there's a mismatch.
configure | 11 +++++++++-- genl/ctrl.c | 3 +++ ip/iplink.c | 3 +++ ip/ipnetns.c | 3 +++ ip/iproute_lwtunnel.c | 3 +++ ip/ipvrf.c | 3 +++ ip/ipxfrm.c | 3 +++ ip/tunnel.c | 3 +++ ip/xfrm_state.c | 3 +++ lib/bpf.c | 3 +++ lib/fs.c | 3 +++ lib/inet_proto.c | 3 +++ misc/ss.c | 3 +++ tc/em_ipset.c | 3 +++ tc/m_pedit.c | 3 +++ 15 files changed, 51 insertions(+), 2 deletions(-)
configure +9 -2
@@ -330,8 +330,15 @@ EOF then echo "no" else - echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG - echo "yes" + if ${PKG_CONFIG} libbsd --exists + then + echo 'CFLAGS += -DHAVE_LIBBSD' `${PKG_CONFIG} libbsd --cflags` >>$CONFIG + echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG + echo "no" + else + echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG + echo "yes" + fi fi rm -f $TMPDIR/strtest.c $TMPDIR/strtest }
genl/ctrl.c +3 -0
@@ -18,6 +18,9 @@#include <netinet/in.h> #include <arpa/inet.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include "utils.h" #include "genl_utils.h"
ip/iplink.c +3 -0
@@ -24,6 +24,9 @@#include <netinet/in.h> #include <arpa/inet.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <sys/ioctl.h> #include <stdbool.h> #include <linux/mpls.h>
ip/ipnetns.c +3 -0
@@ -8,6 +8,9 @@#include <sys/syscall.h> #include <stdio.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <sched.h> #include <fcntl.h> #include <dirent.h>
ip/iproute_lwtunnel.c +3 -0
@@ -16,6 +16,9 @@#include <unistd.h> #include <fcntl.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <linux/ila.h> #include <linux/lwtunnel.h> #include <linux/mpls_iptunnel.h>
ip/ipvrf.c +3 -0
@@ -21,6 +21,9 @@#include <stdlib.h> #include <unistd.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <dirent.h> #include <errno.h> #include <limits.h>
ip/ipxfrm.c +3 -0
@@ -28,6 +28,9 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <sys/types.h> #include <sys/socket.h> #include <time.h>
ip/tunnel.c +3 -0
@@ -24,6 +24,9 @@#include <stdio.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <unistd.h> #include <errno.h> #include <sys/types.h>
ip/xfrm_state.c +3 -0
@@ -27,6 +27,9 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <netdb.h> #include "utils.h" #include "xfrm.h"
lib/bpf.c +3 -0
@@ -15,6 +15,9 @@#include <stdlib.h> #include <unistd.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <stdbool.h> #include <stdint.h> #include <errno.h>
lib/fs.c +3 -0
@@ -20,6 +20,9 @@#include <stdlib.h> #include <unistd.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <errno.h> #include <limits.h>
lib/inet_proto.c +3 -0
@@ -18,6 +18,9 @@#include <netinet/in.h> #include <netdb.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include "rt_names.h" #include "utils.h"
misc/ss.c +3 -0
@@ -19,6 +19,9 @@#include <sys/sysmacros.h> #include <netinet/in.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <errno.h> #include <netdb.h> #include <arpa/inet.h>
tc/em_ipset.c +3 -0
@@ -20,6 +20,9 @@#include <netdb.h> #include <unistd.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <stdlib.h> #include <getopt.h>
tc/m_pedit.c +3 -0
@@ -23,6 +23,9 @@#include <netinet/in.h> #include <arpa/inet.h> #include <string.h> +#ifdef HAVE_LIBBSD +#include <bsd/string.h> +#endif #include <dlfcn.h> #include "utils.h" #include "tc_util.h"
Signature · 1 line
2.19.1