frr: fix compilation with GCC14
authorGeorgi Valkov <gvalkov@gmail.com>
Mon, 27 May 2024 14:30:54 +0000 (17:30 +0300)
committerJosef Schlehofer <pepe.schlehofer@gmail.com>
Wed, 5 Jun 2024 14:33:49 +0000 (16:33 +0200)
Fixes:
zebra/zebra_netns_notify.c: In function 'zebra_ns_ready_read':
zebra/zebra_netns_notify.c:265:40: error: implicit declaration of function 'basename' [-Wimplicit-function-declaration]
  265 |         if (strmatch(VRF_DEFAULT_NAME, basename(netnspath))) {
      |                                        ^~~~~~~~

Fixed by including libgen.h, then since basename may modify its
parameter, allocate a copy on the stack, using strdupa, and pass the
temporary string to basename.

According to the man page for basename:
With glibc, one gets the POSIX version of basename() when
<libgen.h> is included, and the GNU version otherwise.

The POSIX version of basename may modify the contents of path,
so we should to pass a copy when calling this function.

[1] https://man7.org/linux/man-pages/man3/basename.3.html

Signed-off-by: Georgi Valkov <gvalkov@gmail.com>
net/frr/Makefile
net/frr/patches/900-gcc-14-compatibility.patch [new file with mode: 0644]

index 14249fe61806c1678f43f2835e0e954f6b17b5d6..41ae44bc12d42b236a6e958315ad2a15bbee0869 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 PKG_NAME:=frr
 PKG_VERSION:=9.0.0
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 PKG_SOURCE_DATE:=2023-08-12
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz
diff --git a/net/frr/patches/900-gcc-14-compatibility.patch b/net/frr/patches/900-gcc-14-compatibility.patch
new file mode 100644 (file)
index 0000000..789402a
--- /dev/null
@@ -0,0 +1,83 @@
+From d286461971735a0b81a53039f38f66c47c632196 Mon Sep 17 00:00:00 2001
+From: Georgi Valkov <gvalkov@gmail.com>
+Date: Mon, 27 May 2024 17:30:54 +0300
+Subject: [PATCH] zebra: fix compilation with GCC14
+
+Fixes:
+zebra/zebra_netns_notify.c: In function 'zebra_ns_ready_read':
+zebra/zebra_netns_notify.c:265:40: error: implicit declaration of function 'basename' [-Wimplicit-function-declaration]
+  265 |         if (strmatch(VRF_DEFAULT_NAME, basename(netnspath))) {
+      |                                        ^~~~~~~~
+
+Fixed by including libgen.h, then since basename may modify its
+parameter, allocate a copy on the stack, using strdupa, and pass the
+temporary string to basename.
+
+According to the man page for basename:
+With glibc, one gets the POSIX version of basename() when
+<libgen.h> is included, and the GNU version otherwise.
+
+The POSIX version of basename may modify the contents of path,
+so we should to pass a copy when calling this function.
+
+[1] https://man7.org/linux/man-pages/man3/basename.3.html
+
+Signed-off-by: Georgi Valkov <gvalkov@gmail.com>
+---
+--- a/zebra/zebra_netns_notify.c
++++ b/zebra/zebra_netns_notify.c
+@@ -14,6 +14,7 @@
+ #include <sched.h>
+ #endif
+ #include <dirent.h>
++#include <libgen.h>
+ #include <sys/inotify.h>
+ #include <sys/stat.h>
+@@ -233,6 +234,7 @@ static void zebra_ns_ready_read(struct e
+ {
+       struct zebra_netns_info *zns_info = EVENT_ARG(t);
+       const char *netnspath;
++      const char *netnspath_basename;
+       int err, stop_retry = 0;
+       if (!zns_info)
+@@ -260,23 +262,24 @@ static void zebra_ns_ready_read(struct e
+               zebra_ns_continue_read(zns_info, stop_retry);
+               return;
+       }
++      netnspath_basename = basename(strdupa(netnspath));
+       /* check default name is not already set */
+-      if (strmatch(VRF_DEFAULT_NAME, basename(netnspath))) {
+-              zlog_warn("NS notify : NS %s is already default VRF.Cancel VRF Creation", basename(netnspath));
++      if (strmatch(VRF_DEFAULT_NAME, netnspath_basename)) {
++              zlog_warn("NS notify : NS %s is already default VRF.Cancel VRF Creation", netnspath_basename);
+               zebra_ns_continue_read(zns_info, 1);
+               return;
+       }
+-      if (zebra_ns_notify_is_default_netns(basename(netnspath))) {
++      if (zebra_ns_notify_is_default_netns(netnspath_basename)) {
+               zlog_warn(
+                       "NS notify : NS %s is default VRF. Ignore VRF creation",
+-                      basename(netnspath));
++                      netnspath_basename);
+               zebra_ns_continue_read(zns_info, 1);
+               return;
+       }
+       /* success : close fd and create zns context */
+-      zebra_ns_notify_create_context_from_entry_name(basename(netnspath));
++      zebra_ns_notify_create_context_from_entry_name(netnspath_basename);
+       zebra_ns_continue_read(zns_info, 1);
+ }
+@@ -395,7 +398,7 @@ void zebra_ns_notify_parse(void)
+                       continue;
+               }
+               /* check default name is not already set */
+-              if (strmatch(VRF_DEFAULT_NAME, basename(dent->d_name))) {
++              if (strmatch(VRF_DEFAULT_NAME, basename(strdupa(dent->d_name)))) {
+                       zlog_warn("NS notify : NS %s is already default VRF.Cancel VRF Creation", dent->d_name);
+                       continue;
+               }