Blame nptl/tst-setuid1.c

Packit 6c4009
/* Copyright (C) 2004-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Jakub Jelinek <jaku@redhat.com>, 2004.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <pwd.h>
Packit 6c4009
#include <grp.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
static pthread_barrier_t b3, b4;
Packit 6c4009
static uid_t prev_ruid, prev_euid, prev_suid, nobody_uid;
Packit 6c4009
static gid_t prev_rgid, prev_egid, prev_sgid, nobody_gid;
Packit 6c4009
enum ACTION { PREPARE, SET, CHECK_BEFORE, CHECK_AFTER };
Packit 6c4009
#define TESTNO(arg) ((long int) (arg) & 0xff)
Packit 6c4009
#define THREADNO(arg) ((long int) (arg) >> 8)
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
check_prev_uid (int tno)
Packit 6c4009
{
Packit 6c4009
  uid_t ruid, euid, suid;
Packit 6c4009
  if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (ruid != prev_ruid || euid != prev_euid || suid != prev_suid)
Packit 6c4009
    {
Packit 6c4009
      printf ("uids before in %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
	      ruid, euid, suid, prev_ruid, prev_euid, prev_suid);
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
check_prev_gid (int tno)
Packit 6c4009
{
Packit 6c4009
  gid_t rgid, egid, sgid;
Packit 6c4009
  if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (rgid != prev_rgid || egid != prev_egid || sgid != prev_sgid)
Packit 6c4009
    {
Packit 6c4009
      printf ("gids before in %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
	      rgid, egid, sgid, prev_rgid, prev_egid, prev_sgid);
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setuid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setuid (nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setuid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresuid (nobody_uid, nobody_uid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresuid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_ruid = nobody_uid;
Packit 6c4009
      prev_euid = nobody_uid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setuid (prev_suid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("setuid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != nobody_uid || euid != prev_suid || suid != prev_suid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, nobody_uid, prev_suid, prev_suid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_seteuid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && seteuid (nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("seteuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != prev_ruid || euid != nobody_uid || suid != prev_suid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after seteuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, prev_ruid, nobody_uid, prev_suid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_seteuid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresuid (nobody_uid, nobody_uid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresuid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_ruid = nobody_uid;
Packit 6c4009
      prev_euid = nobody_uid;
Packit 6c4009
      nobody_uid = prev_suid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_seteuid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setreuid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setreuid (-1, nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setreuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid, esuid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (prev_ruid != nobody_uid)
Packit 6c4009
	esuid = nobody_uid;
Packit 6c4009
      else
Packit 6c4009
	esuid = prev_suid;
Packit 6c4009
Packit 6c4009
      if (ruid != prev_ruid || euid != nobody_uid || suid != esuid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, prev_ruid, nobody_uid, esuid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setreuid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setreuid (nobody_uid, -1) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setreuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != nobody_uid || euid != prev_euid || suid != prev_euid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, nobody_uid, prev_euid, prev_euid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setreuid3 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setreuid (nobody_uid, nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setreuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setreuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setreuid4 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresuid (nobody_uid, nobody_uid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresuid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_ruid = nobody_uid;
Packit 6c4009
      prev_euid = nobody_uid;
Packit 6c4009
      nobody_uid = prev_suid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_setreuid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresuid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresuid (-1, nobody_uid, -1) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != prev_ruid || euid != nobody_uid || suid != prev_suid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, prev_ruid, nobody_uid, prev_suid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresuid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresuid (prev_euid, nobody_uid, nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != prev_euid || euid != nobody_uid || suid != nobody_uid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, prev_euid, nobody_uid, nobody_uid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresuid3 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_uid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresuid (nobody_uid, nobody_uid, nobody_uid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresuid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      uid_t ruid, euid, suid;
Packit 6c4009
      if (getresuid (&ruid, &euid, &suid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresuid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (ruid != nobody_uid || euid != nobody_uid || suid != nobody_uid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresuid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  ruid, euid, suid, nobody_uid, nobody_uid, nobody_uid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresuid4 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresuid (nobody_uid, nobody_uid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresuid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_ruid = nobody_uid;
Packit 6c4009
      prev_euid = nobody_uid;
Packit 6c4009
      nobody_uid = prev_suid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_setresuid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setgid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setgid (nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setgid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setgid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setgid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresgid (nobody_gid, nobody_gid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresgid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_rgid = nobody_gid;
Packit 6c4009
      prev_egid = nobody_gid;
Packit 6c4009
Packit 6c4009
      if (setresuid (nobody_uid, nobody_uid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresuid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_ruid = nobody_uid;
Packit 6c4009
      prev_euid = nobody_uid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setgid (prev_sgid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("setgid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != nobody_gid || egid != prev_sgid || sgid != prev_sgid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setgid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, nobody_gid, prev_sgid, prev_sgid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setegid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setegid (nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setegid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != prev_rgid || egid != nobody_gid || sgid != prev_sgid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setegid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, prev_rgid, nobody_gid, prev_sgid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setegid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresgid (nobody_gid, nobody_gid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresgid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_rgid = nobody_gid;
Packit 6c4009
      prev_egid = nobody_gid;
Packit 6c4009
      nobody_gid = prev_sgid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_setegid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setregid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setregid (-1, nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setregid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid, esgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (prev_rgid != nobody_gid)
Packit 6c4009
	esgid = nobody_gid;
Packit 6c4009
      else
Packit 6c4009
	esgid = prev_sgid;
Packit 6c4009
Packit 6c4009
      if (rgid != prev_rgid || egid != nobody_gid || sgid != esgid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, prev_rgid, nobody_gid, esgid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setregid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setregid (nobody_gid, -1) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setregid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != nobody_gid || egid != prev_egid || sgid != prev_egid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, nobody_gid, prev_egid, prev_egid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setregid3 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setregid (nobody_gid, nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setregid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setregid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setregid4 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresgid (nobody_gid, nobody_gid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresgid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_rgid = nobody_gid;
Packit 6c4009
      prev_egid = nobody_gid;
Packit 6c4009
      nobody_gid = prev_sgid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_setregid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresgid1 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresgid (-1, nobody_gid, -1) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresgid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != prev_rgid || egid != nobody_gid || sgid != prev_sgid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, prev_rgid, nobody_gid, prev_sgid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresgid2 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresgid (prev_egid, nobody_gid, nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresgid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != prev_egid || egid != nobody_gid || sgid != nobody_gid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, prev_egid, nobody_gid, nobody_gid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresgid3 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  if (action != CHECK_AFTER)
Packit 6c4009
    check_prev_gid (tno);
Packit 6c4009
Packit 6c4009
  if (action == SET && setresgid (nobody_gid, nobody_gid, nobody_gid) < 0)
Packit 6c4009
    {
Packit 6c4009
       printf ("setresgid failed: %m\n");
Packit 6c4009
       exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (action != CHECK_BEFORE)
Packit 6c4009
    {
Packit 6c4009
      gid_t rgid, egid, sgid;
Packit 6c4009
      if (getresgid (&rgid, &egid, &sgid) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("getresgid failed: %d %m\n", tno);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      if (rgid != nobody_gid || egid != nobody_gid || sgid != nobody_gid)
Packit 6c4009
	{
Packit 6c4009
	  printf ("after setresgid %d (%d %d %d) != (%d %d %d)\n", tno,
Packit 6c4009
		  rgid, egid, sgid, nobody_gid, nobody_gid, nobody_gid);
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_setresgid4 (enum ACTION action, int tno)
Packit 6c4009
{
Packit 6c4009
  if (action == PREPARE)
Packit 6c4009
    {
Packit 6c4009
      if (setresgid (nobody_gid, nobody_gid, -1) < 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("setresgid failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      prev_rgid = nobody_gid;
Packit 6c4009
      prev_egid = nobody_gid;
Packit 6c4009
      nobody_gid = prev_sgid;
Packit 6c4009
      return;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  test_setresgid1 (action, tno);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static struct setuid_test
Packit 6c4009
{
Packit 6c4009
  const char *name;
Packit 6c4009
  void (*test) (enum ACTION, int tno);
Packit 6c4009
} setuid_tests[] =
Packit 6c4009
{
Packit 6c4009
  { "setuid1", test_setuid1 },
Packit 6c4009
  { "setuid2", test_setuid2 },
Packit 6c4009
  { "seteuid1", test_seteuid1 },
Packit 6c4009
  { "seteuid2", test_seteuid2 },
Packit 6c4009
  { "setreuid1", test_setreuid1 },
Packit 6c4009
  { "setreuid2", test_setreuid2 },
Packit 6c4009
  { "setreuid3", test_setreuid3 },
Packit 6c4009
  { "setreuid4", test_setreuid4 },
Packit 6c4009
  { "setresuid1", test_setresuid1 },
Packit 6c4009
  { "setresuid2", test_setresuid2 },
Packit 6c4009
  { "setresuid3", test_setresuid3 },
Packit 6c4009
  { "setresuid4", test_setresuid4 },
Packit 6c4009
  { "setgid1", test_setgid1 },
Packit 6c4009
  { "setgid2", test_setgid2 },
Packit 6c4009
  { "setegid1", test_setegid1 },
Packit 6c4009
  { "setegid2", test_setegid2 },
Packit 6c4009
  { "setregid1", test_setregid1 },
Packit 6c4009
  { "setregid2", test_setregid2 },
Packit 6c4009
  { "setregid3", test_setregid3 },
Packit 6c4009
  { "setregid4", test_setregid4 },
Packit 6c4009
  { "setresgid1", test_setresgid1 },
Packit 6c4009
  { "setresgid2", test_setresgid2 },
Packit 6c4009
  { "setresgid3", test_setresgid3 },
Packit 6c4009
  { "setresgid4", test_setresgid4 }
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf2 (void *arg)
Packit 6c4009
{
Packit 6c4009
  int e = pthread_barrier_wait (&b4;;
Packit 6c4009
  if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
Packit 6c4009
    {
Packit 6c4009
      puts ("barrier_wait failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  setuid_tests[TESTNO (arg)].test (CHECK_AFTER, THREADNO (arg));
Packit 6c4009
  return NULL;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf (void *arg)
Packit 6c4009
{
Packit 6c4009
  setuid_tests[TESTNO (arg)].test (CHECK_BEFORE, THREADNO (arg));
Packit 6c4009
Packit 6c4009
  int e = pthread_barrier_wait (&b3;;
Packit 6c4009
  if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
Packit 6c4009
    {
Packit 6c4009
      puts ("barrier_wait failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  return tf2 (arg);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_one_test (long int testno)
Packit 6c4009
{
Packit 6c4009
  printf ("%s test\n", setuid_tests[testno].name);
Packit 6c4009
Packit 6c4009
  pid_t pid = fork ();
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      setuid_tests[testno].test (PREPARE, 0);
Packit 6c4009
      setuid_tests[testno].test (SET, 0);
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (pid < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("fork failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  int status;
Packit 6c4009
  if (waitpid (pid, &status, 0) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("waitpid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (!WIFEXITED (status))
Packit 6c4009
    {
Packit 6c4009
      puts ("child did not exit");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (WEXITSTATUS (status))
Packit 6c4009
    {
Packit 6c4009
      printf ("skipping %s test\n", setuid_tests[testno].name);
Packit 6c4009
      return 0;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  pid = fork ();
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      setuid_tests[testno].test (PREPARE, 0);
Packit 6c4009
Packit 6c4009
      pthread_t th;
Packit 6c4009
      int e = pthread_create (&th, NULL, tf, (void *) (testno | 0x100L));
Packit 6c4009
      if (e != 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("create failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      pthread_t th2;
Packit 6c4009
      e = pthread_create (&th2, NULL, tf, (void *) (testno | 0x200L));
Packit 6c4009
      if (e != 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("create failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      e = pthread_barrier_wait (&b3;;
Packit 6c4009
      if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
Packit 6c4009
	{
Packit 6c4009
	  puts ("barrier_wait failed");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      setuid_tests[testno].test (SET, 0);
Packit 6c4009
Packit 6c4009
      pthread_t th3;
Packit 6c4009
      e = pthread_create (&th3, NULL, tf2, (void *) (testno | 0x300L));
Packit 6c4009
      if (e != 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("create failed: %m\n");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      e = pthread_barrier_wait (&b4;;
Packit 6c4009
      if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
Packit 6c4009
	{
Packit 6c4009
	  puts ("barrier_wait failed");
Packit 6c4009
	  exit (1);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (pid < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("fork failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (waitpid (pid, &status, 0) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("waitpid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (!WIFEXITED (status))
Packit 6c4009
    {
Packit 6c4009
      puts ("second child did not exit");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (WEXITSTATUS (status))
Packit 6c4009
    exit (WEXITSTATUS (status));
Packit 6c4009
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  struct passwd *pwd = getpwnam ("nobody");
Packit 6c4009
  if (pwd == NULL)
Packit 6c4009
    {
Packit 6c4009
      puts ("User nobody doesn't exist");
Packit 6c4009
      return 0;
Packit 6c4009
    }
Packit 6c4009
  nobody_uid = pwd->pw_uid;
Packit 6c4009
  nobody_gid = pwd->pw_gid;
Packit 6c4009
Packit 6c4009
  if (getresuid (&prev_ruid, &prev_euid, &prev_suid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("getresuid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (getresgid (&prev_rgid, &prev_egid, &prev_sgid) < 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("getresgid failed: %m\n");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (prev_ruid == nobody_uid || prev_euid == nobody_uid
Packit 6c4009
      || prev_suid == nobody_uid)
Packit 6c4009
    {
Packit 6c4009
      puts ("already running as user nobody, skipping tests");
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (prev_rgid == nobody_gid || prev_egid == nobody_gid
Packit 6c4009
      || prev_sgid == nobody_gid)
Packit 6c4009
    {
Packit 6c4009
      puts ("already running as group nobody, skipping tests");
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (pthread_barrier_init (&b3, NULL, 3) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("barrier_init failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (pthread_barrier_init (&b4, NULL, 4) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("barrier_init failed");
Packit 6c4009
      exit (1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  for (unsigned long int testno = 0;
Packit 6c4009
       testno < sizeof (setuid_tests) / sizeof (setuid_tests[0]);
Packit 6c4009
       ++testno)
Packit 6c4009
    do_one_test (testno);
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"