--- /dev/null
+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;
+ }