Blame pwd/tst-getpw.c

Packit Service 82fcde
/* Copyright (C) 1999-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <pwd.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
Packit Service 82fcde
/* We want to test getpw by calling it with a uid that does
Packit Service 82fcde
   exist and one that doesn't exist. We track if we've met those
Packit Service 82fcde
   conditions and exit. We also track if we've failed due to lack
Packit Service 82fcde
   of memory. That constitutes all of the standard failure cases.  */
Packit Service 82fcde
bool seen_hit;
Packit Service 82fcde
bool seen_miss;
Packit Service 82fcde
bool seen_oom;
Packit Service 82fcde
Packit Service 82fcde
/* How many errors we've had while running the test.  */
Packit Service 82fcde
int errors;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
check (uid_t uid)
Packit Service 82fcde
{
Packit Service 82fcde
  int ret;
Packit Service 82fcde
  char buf[1024];
Packit Service 82fcde
Packit Service 82fcde
  ret = getpw (uid, buf);
Packit Service 82fcde
Packit Service 82fcde
  /* Successfully read a password line.  */
Packit Service 82fcde
  if (ret == 0 && !seen_hit)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("PASS: Read a password line given a uid.\n");
Packit Service 82fcde
      seen_hit = true;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Failed to read a password line. Why?  */
Packit Service 82fcde
  if (ret == -1)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* No entry?  Technically the errno could be any number
Packit Service 82fcde
	 of values including ESRCH, EBADP or EPERM depending
Packit Service 82fcde
	 on the quality of the nss module that implements the
Packit Service 82fcde
	 underlying lookup. It should be 0 for getpw.*/
Packit Service 82fcde
      if (errno == 0 && !seen_miss)
Packit Service 82fcde
	{
Packit Service 82fcde
	  printf ("PASS: Found an invalid uid.\n");
Packit Service 82fcde
	  seen_miss = true;
Packit Service 82fcde
	  return;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* Out of memory?  */
Packit Service 82fcde
      if (errno == ENOMEM && !seen_oom)
Packit Service 82fcde
	{
Packit Service 82fcde
	  printf ("FAIL: Failed with ENOMEM.\n");
Packit Service 82fcde
	  seen_oom = true;
Packit Service 82fcde
	  errors++;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      /* We don't expect any other values for errno.  */
Packit Service 82fcde
      if (errno != ENOMEM && errno != 0)
Packit Service 82fcde
	errors++;
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int ret;
Packit Service 82fcde
  uid_t uid;
Packit Service 82fcde
Packit Service 82fcde
  /* Should return -1 and set errnot to EINVAL.  */
Packit Service 82fcde
  ret = getpw (0, NULL);
Packit Service 82fcde
  if (ret == -1 && errno == EINVAL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("PASS: NULL buffer returns -1 and sets errno to EINVAL.\n");
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("FAIL: NULL buffer did not return -1 or set errno to EINVAL.\n");
Packit Service 82fcde
      errors++;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* Look for one matching uid, one non-found uid and then stop.
Packit Service 82fcde
     Set an upper limit at the 16-bit UID mark; no need to go farther.  */
Packit Service 82fcde
  for (uid = 0; uid < ((uid_t) 65535); ++uid)
Packit Service 82fcde
    {
Packit Service 82fcde
      check (uid);
Packit Service 82fcde
      if (seen_miss && seen_hit)
Packit Service 82fcde
	break;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (!seen_hit)
Packit Service 82fcde
    printf ("FAIL: Did not read even one password line given a uid.\n");
Packit Service 82fcde
Packit Service 82fcde
  if (!seen_miss)
Packit Service 82fcde
    printf ("FAIL: Did not find even one invalid uid.\n");
Packit Service 82fcde
Packit Service 82fcde
  return errors;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define TEST_FUNCTION do_test ()
Packit Service 82fcde
#include "../test-skeleton.c"