Skip to content

nss_cache getpwent loop runs forever if getpwnam in body #85

@brooksmoses

Description

@brooksmoses

(Note: This is a copy of a Google-internal issue written by Stan Shebs, who's now retired; unfortunately I don't have additional context.)

Calling getpwnam() inside of a getpwent() loop causes it to run forever, if nss_cache is in use:

while ((pw = getpwent()) != NULL)
  {
    pw2 = getpwnam("anyname");
  }

The problem is that getpwnam closes /etc/passwd.cache, so getpwent() then has to open and start reading from the
beginning again. The nss_files module has a bit of special code to prevent this, nss_cache will need something like it.


The attached file takes an argument, so you can see "bad files" work, and "bad cache" hang:

#include <pwd.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
  char *serviceline = "cache";
  struct passwd *pw, *pw2;

  if (argc > 1)
    serviceline = argv[1];

  __nss_configure_lookup("passwd", serviceline);

  setpwent();

  while ((pw = getpwent()) != NULL)
    {
      pw2 = getpwnam("anyname");
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions