Based on feedback from Ubuntu developers, we see that unscd-0.48 was
released only to fix this issue [1]. On that basis, I feel it is
suitable as a pure backport to avoid introduction of other issues.

--- [1]

$ bzr branch lp:ubuntu/precise/unscd && mv unscd unscd-precise
$ bzr branch lp:ubuntu/quantal/unscd && mv unscd unscd-quantal
$ diff -ur --exclude 'debian' unscd-precise/nscd.c unscd-quantal/nscd.c 
--- unscd-precise/nscd.c        2012-07-09 22:37:10.781166000 +0800
+++ unscd-quantal/nscd.c        2012-07-09 22:41:19.204361000 +0800
@@ -139,8 +139,9 @@
  *        thanks to Sebastian Krahmer (krahmer AT suse.de)
  * 0.46   fix a case when we forgot to remove a future entry on worker failure
  * 0.47   fix nscd without -d to not bump debug level
+ * 0.48   fix for changes in __nss_disable_nscd API in glibc-2.15
  */
-#define PROGRAM_VERSION "0.47"
+#define PROGRAM_VERSION "0.48"
 
 #define DEBUG_BUILD 1
 
@@ -2097,7 +2098,7 @@
 };
 
 static const char *const help[] = {
-       "Do not daemonize; log to stderr",
+       "Do not daemonize; log to stderr (-dd: more verbosity)",
        "File to read configuration from",
        "Invalidate cache",
        "Shut the server down",
@@ -2347,6 +2348,7 @@
 
 
 /* not static - don't inline me, compiler! */
+void readlink_self_exe(void);
 void readlink_self_exe(void)
 {
        char buf[PATH_MAX + 1];
@@ -2389,15 +2391,32 @@
                reqdata.req.key_len = arg_len;
                memcpy(reqdata.arg, arg, arg_len);
                xfull_write(sock, &reqdata, arg_len + sizeof(ureq));
-               printf("sent invalidate(%s) request, exiting\n", arg);
+               if (debug) {
+                 printf("sent invalidate(%s) request, exiting\n", arg);
+               }
        }
        exit(0);
 }
 
 
+/* Callback for glibc-2.15 */
+struct traced_file;
+static void do_nothing(size_t dbidx, struct traced_file *finfo)
+{
+       /* nscd from glibc-2.15 does something like this:
+       if (!dbs[dbidx].enabled || !dbs[dbidx].check_file)
+               return;
+       add_file_to_watch_list(finfo->fname);
+       */
+}
+
 /* This internal glibc function is called to disable trying to contact nscd.
- * We _are_ nscd, so we need to do the lookups, and not recurse. */
-void __nss_disable_nscd(void);
+ * We _are_ nscd, so we need to do the lookups, and not recurse.
+ * Until 2.14, this function was taking no parameters.
+ * In 2.15, it takes a function pointer from hell.
+ */
+void __nss_disable_nscd(void (*hell)(size_t, struct traced_file*));
+
 
 int main(int argc, char **argv)
 {
@@ -2407,7 +2426,7 @@
        const char *conffile;
 
        /* make sure we don't get recursive calls */
-       __nss_disable_nscd();
+       __nss_disable_nscd(do_nothing);
 
        if (argv[0][0] == 'w') /* "worker_nscd" */
                worker(argv[1]);


** Description changed:

  Clean x86-64 install of precise as of 2012-03-17; unscd is hit with SEGV
  whenever it starts, ie 100% reproducability.
  
  ProblemType: Crash
  DistroRelease: Ubuntu 12.04
  Package: unscd 0.47-2build2
  ProcVersionSignature: Ubuntu 3.2.0-19.30-generic 3.2.11
  Uname: Linux 3.2.0-19-generic x86_64
  ApportVersion: 1.94.1-0ubuntu2
  Architecture: amd64
  Date: Sun Mar 18 11:18:59 2012
  Disassembly: => 0x1:  Cannot access memory at address 0x1
  ExecutablePath: /usr/sbin/nscd
  InstallationMedia: Ubuntu 12.04 LTS "Precise Pangolin" - Alpha amd64 
(20120316)
  ProcCmdline: /usr/sbin/nscd
  ProcEnviron:
-  LANGUAGE=en_SG:en
-  TERM=linux
-  LANG=en_SG.UTF-8
-  SHELL=/bin/bash
+  LANGUAGE=en_SG:en
+  TERM=linux
+  LANG=en_SG.UTF-8
+  SHELL=/bin/bash
  SegvAnalysis:
-  Segfault happened at: 0x1:   Cannot access memory at address 0x1
-  PC (0x00000001) not located in a known VMA region (needed executable region)!
+  Segfault happened at: 0x1:   Cannot access memory at address 0x1
+  PC (0x00000001) not located in a known VMA region (needed executable region)!
  SegvReason: executing NULL VMA
  Signal: 11
  SourcePackage: unscd
  StacktraceTop:
-  ?? ()
-  _nss_files_init (cb=0x1) at nss_files/files-init.c:47
-  nss_load_library (ni=<optimized out>) at nsswitch.c:412
-  nss_load_all_libraries (def=0x7f03dd560b74 "dns [!UNAVAIL=return] files", 
service=0x7f03dd560b90 "hosts") at nsswitch.c:875
-  __nss_disable_nscd (cb=<optimized out>) at nsswitch.c:895
+  ?? ()
+  _nss_files_init (cb=0x1) at nss_files/files-init.c:47
+  nss_load_library (ni=<optimized out>) at nsswitch.c:412
+  nss_load_all_libraries (def=0x7f03dd560b74 "dns [!UNAVAIL=return] files", 
service=0x7f03dd560b90 "hosts") at nsswitch.c:875
+  __nss_disable_nscd (cb=<optimized out>) at nsswitch.c:895
  Title: nscd crashed with SIGSEGV in _nss_files_init()
  UpgradeStatus: No upgrade log present (probably fresh install)
  UserGroups:
+ 
+ unscd 0.48 fixes just this issue (see patch delta below) and is already 
released in Quantal, so is a candidate fix for this issue in Precise:
+ http://archive.ubuntu.com/ubuntu/pool/universe/u/unscd/
+ 
+ http://archive.ubuntu.com/ubuntu/pool/universe/u/unscd/unscd_0.48-2_amd64.deb
+ http://archive.ubuntu.com/ubuntu/pool/universe/u/unscd/unscd_0.48-2_i386.deb
+ 
+ I have verified this here and it addresses the issue. SRU justification:
+ [Impact] unscd-0.47 crashes each time it is started, thus is useless and 
obtrusive
+ [Test Case] start unscd-0.47: sudo /etc/init.d/unscd start
+ [Regression Potential] None due to existing crasher

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/958305

Title:
  nscd crashed with SIGSEGV in _nss_files_init()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/958305/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to