After upgrading a server from FreeBSD 7.3 to FreeBSD 8.3 I noticed
this bug.  Since upgrading, getpwnam_r is acting inconsistently.  If I
look up a user that does not exist and the name is 16 characters or
less, getpwnam_r returns 0 and the result is NULL.   If the name is
more than 16 characters, getpwnam_r returns EINVAL.   Everything works
correctly for users that exist.

This only happens when the nsswitch.conf passwd: line contains files.
You need to use files if you are using another module such as msql or
ldap.  The problem exists without the other modules listed.   For
example:

passwd: files

Below is a simple test program.  Set passwd: to files in nsswitch.conf
and run the program.  Any idea how to fix this bug with getpwnam_r?

#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>

main()
{
  lookup("doesnotexistXXXX");
  lookup("doesnotexistXXXXy");
}

int lookup( char *name)
{

  struct passwd pwd;
  char   buffer[1024];
  struct passwd *result;
  int     err;

  printf("\nLooking up: %s\n", name);

  err = getpwnam_r(name, &pwd, buffer, sizeof(buffer), &result);

  if( err != 0 ){
    printf("Return code: %d\n", err);
  }else if( result == 0 ){
    printf("Returned no result!\n");
  }else{
    printf("Returned: %s (%d)\n", result->pw_name, result->pw_uid);
  }
}
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to