File 0001-scratchbox2-Allow-specifying-of-nscd-socket-location.patch of Package glibc

From f6bb5ab0db923bdb685150094a99aad2ee56ffc9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Bidar?= <bjorn.bidar@jolla.com>
Date: Tue, 31 Aug 2021 01:47:36 +0300
Subject: [PATCH 1/4] (scratchbox2) Allow specifying of nscd socket location

This patch makes location of nscd's socket to be run-time
configurable via an environment variable.

(cherry picked from commit 573d193778dadb73a904c3e7203ed5fd6958eaed)
---
 nscd/connections.c | 25 ++++++++++++++++++++++---
 nscd/nscd.c        | 21 +++++++++++++++++----
 nscd/nscd_helper.c | 16 +++++++++++++++-
 3 files changed, 54 insertions(+), 8 deletions(-)

diff --git a/nscd/connections.c b/nscd/connections.c
index 744b27be2f..6225536c7a 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -487,6 +487,20 @@ fail:
   return 0;
 }
 
+int __nscd_get_socket_path(char *buf, size_t bufsiz)
+{
+  const char *ext_nscd_socket_path = getenv ("NSCD_SOCKET_PATH");
+  if (ext_nscd_socket_path) {
+    int len = strlen(ext_nscd_socket_path);
+    strncpy (buf, ext_nscd_socket_path, bufsiz);
+    if (len >= bufsiz) return -1;
+    return 0;
+  }
+  strncpy (buf, _PATH_NSCDSOCKET, bufsiz);
+  if (sizeof(_PATH_NSCDSOCKET) >= bufsiz) return -1;
+  return 0;
+}
+
 
 /* Initialize database information structures.  */
 void
@@ -798,15 +812,20 @@ cannot create read-only descriptor for \"%s\"; no mmap"),
   /* Bind a name to the socket.  */
   struct sockaddr_un sock_addr;
   sock_addr.sun_family = AF_UNIX;
-  strcpy (sock_addr.sun_path, _PATH_NSCDSOCKET);
+  if (__nscd_get_socket_path (sock_addr.sun_path, sizeof(sock_addr.sun_path)) < 0)
+    {
+      dbg_log ("Path to nscd socket is too long");
+      exit (1);
+    }
+
   if (bind (sock, (struct sockaddr *) &sock_addr, sizeof (sock_addr)) < 0)
     {
-      dbg_log ("%s: %s", _PATH_NSCDSOCKET, strerror (errno));
+      dbg_log ("%s: %s", sock_addr.sun_path, strerror (errno));
       do_exit (errno == EACCES ? 4 : 1, 0, NULL);
     }
 
   /* Set permissions for the socket.  */
-  chmod (_PATH_NSCDSOCKET, DEFFILEMODE);
+  chmod (sock_addr.sun_path, DEFFILEMODE);
 
   /* Set the socket up to accept connections.  */
   if (listen (sock, SOMAXCONN) < 0)
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 6980e378ed..adcfce31a3 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -137,6 +137,8 @@ static struct argp argp =
 static bool get_stats;
 static int parent_fd = -1;
 
+extern int __nscd_get_socket_path(char *buf, size_t bufsiz);
+
 int
 main (int argc, char **argv)
 {
@@ -298,7 +300,11 @@ main (int argc, char **argv)
   signal (SIGPIPE, SIG_IGN);
 
   /* Cleanup files created by a previous 'bind'.  */
-  unlink (_PATH_NSCDSOCKET);
+  {
+    struct sockaddr_un addr;
+    if (__nscd_get_socket_path (addr.sun_path, sizeof(addr.sun_path)) >= 0)
+      unlink (addr.sun_path);
+  }
 
 #ifdef HAVE_INOTIFY
   /* Use inotify to recognize changed files.  */
@@ -540,8 +546,12 @@ nscd_open_socket (void)
     return -1;
 
   addr.sun_family = AF_UNIX;
-  assert (sizeof (addr.sun_path) >= sizeof (_PATH_NSCDSOCKET));
-  strcpy (addr.sun_path, _PATH_NSCDSOCKET);
+  if (__nscd_get_socket_path (addr.sun_path, sizeof(addr.sun_path)) < 0)
+    {
+      close (sock);
+      return -1;
+    }
+
   if (connect (sock, (struct sockaddr *) &addr, sizeof (addr)) < 0)
     {
       close (sock);
@@ -556,10 +566,13 @@ nscd_open_socket (void)
 void
 termination_handler (int signum)
 {
+  struct sockaddr_un addr;
+
   close_sockets ();
 
   /* Clean up the file created by 'bind'.  */
-  unlink (_PATH_NSCDSOCKET);
+  if (__nscd_get_socket_path (addr.sun_path, sizeof(addr.sun_path)) >= 0)
+    unlink (addr.sun_path);
 
   /* Clean up pid file.  */
   unlink (_PATH_NSCDPID);
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c
index 4082316a92..ea768f6e57 100644
--- a/nscd/nscd_helper.c
+++ b/nscd/nscd_helper.c
@@ -162,6 +162,19 @@ __readvall (int fd, const struct iovec *iov, int iovcnt)
   return ret;
 }
 
+static int nscd_get_socket_path(char *buf, size_t bufsiz)
+{
+  const char *ext_nscd_socket_path = getenv ("NSCD_SOCKET_PATH");
+  if (ext_nscd_socket_path) {
+    int len = strlen(ext_nscd_socket_path);
+    strncpy (buf, ext_nscd_socket_path, bufsiz);
+    if (len >= bufsiz) return -1;
+    return 0;
+  }
+  strncpy (buf, _PATH_NSCDSOCKET, bufsiz);
+  if (sizeof(_PATH_NSCDSOCKET) >= bufsiz) return -1;
+  return 0;
+}
 
 static int
 open_socket (request_type type, const char *key, size_t keylen)
@@ -181,7 +194,8 @@ open_socket (request_type type, const char *key, size_t keylen)
 
   struct sockaddr_un sun;
   sun.sun_family = AF_UNIX;
-  strcpy (sun.sun_path, _PATH_NSCDSOCKET);
+  if (nscd_get_socket_path (sun.sun_path, sizeof(sun.sun_path)) < 0) goto out;
+
   if (__connect (sock, (struct sockaddr *) &sun, sizeof (sun)) < 0
       && errno != EINPROGRESS)
     goto out;
-- 
2.52.0

openSUSE Build Service is sponsored by