[patch] Fix for crash in NSS when libc built with --enable-static-nss and exe built with -static

Paul Pluzhnikov ppluzhnikov@google.com
Tue Mar 13 00:25:00 GMT 2012


Ping?

On Sun, Mar 4, 2012 at 11:29 AM, Paul Pluzhnikov <ppluzhnikov@google.com> wrote:
> Greetings,
>
> With the patch from
>  http://cygwin.com/ml/libc-alpha/2012-03/msg00022.html
>  (Ping! Could someone apply it?)
>
> a statically-linked executable using NSS will crash like so:
>
>
> cat t.c
> #include <sys/types.h>
> #include <pwd.h>
>
> int main()
> {
>  struct passwd *pw = getpwnam("root");
>  return 0;
> }
>
> gcc -g -L. -static t.c
>
> gdb -q ./a.out
> Reading symbols from /usr/local/glibc-git/build-static-nss/a.out...done.
> (gdb) r
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x00000000004108b8 in __nss_lookup_function (ni=0x6e5f50, fct_name=0x4aea9f "getpwnam_r") at nsswitch.c:460
> 460                 size_t namlen = (5 + strlen (ni->library->name) + 1
> (gdb) bt
> #0  0x00000000004108b8 in __nss_lookup_function (ni=0x6e5f50, fct_name=0x4aea9f "getpwnam_r") at nsswitch.c:460
> #1  0x0000000000410aae in __nss_lookup (ni=0x7fffffffd4d8, fct_name=0x4aea9f "getpwnam_r", fct2_name=0x0, fctp=0x7fffffffd4d0) at nsswitch.c:161
> #2  0x000000000040e446 in __getpwnam_r (name=0x4ab944 "root", resbuf=0x6e0ce0, buffer=0x6e5840 "", buflen=1024, result=0x7fffffffd528) at ../nss/getXXbyYY_r.c:202
> #3  0x000000000040e15c in getpwnam (name=0x4ab944 "root") at ../nss/getXXbyYY.c:116
> #4  0x0000000000400e86 in main () at t.c:6
> (gdb) p *ni
> $1 = {next = 0x6e5f90, actions = {NSS_ACTION_CONTINUE, NSS_ACTION_CONTINUE,
>      NSS_ACTION_CONTINUE, NSS_ACTION_RETURN, NSS_ACTION_RETURN},
>      library = 0x0, known = 0x6e5c50, name = 0x6e5f80 "files"}
>      ^^^^^^^^^^^^^
>
> Attached patch fixes that.
>
> Thanks,
> --
> Paul Pluzhnikov
>
>
>
> 2012-03-04  Paul Pluzhnikov  <ppluzhnikov@google.com>
>
>        * nss/nsswitch.c (__nss_lookup_function): Fix crash when configured
>        with --enable-static-nss and using statically linked executable.
>
>
> diff --git a/nss/nsswitch.c b/nss/nsswitch.c
> index 7acb140..d404a4e 100644
> --- a/nss/nsswitch.c
> +++ b/nss/nsswitch.c
> @@ -457,14 +457,11 @@ __nss_lookup_function (service_user *ni, const char *fct_name)
>  # include "function.def"
>                { NULL, NULL }
>              };
> -           size_t namlen = (5 + strlen (ni->library->name) + 1
> -                            + strlen (fct_name) + 1);
> +           size_t namlen = (5 + strlen (ni->name) + 1 + strlen (fct_name) + 1);
>            char name[namlen];
>
>            /* Construct the function name.  */
> -           __stpcpy (__stpcpy (__stpcpy (name, ni->library->name),
> -                               "_"),
> -                     fct_name);
> +           __stpcpy (__stpcpy (__stpcpy (name, ni->name), "_"), fct_name);
>
>            result = NULL;
>            for (tp = &tbl[0]; tp->fname; tp++)



-- 
Paul Pluzhnikov



More information about the Libc-alpha mailing list