Beispiel #1
0
int
__setregid (gid_t rgid, gid_t egid)
{
#ifdef __NR_setregid32
  return INLINE_SETXID_SYSCALL (setregid32, 2, rgid, egid);
#else
  return INLINE_SETXID_SYSCALL (setregid, 2, rgid, egid);
#endif
}
Beispiel #2
0
int
__setuid (uid_t uid)
{
#ifdef __NR_setuid32
  return INLINE_SETXID_SYSCALL (setuid32, 1, uid);
#else
  return INLINE_SETXID_SYSCALL (setuid, 1, uid);
#endif
}
int
seteuid (uid_t uid)
{
  int result;

  if (uid == (uid_t) ~0)
    {
      __set_errno (EINVAL);
      return -1;
    }

#if __ASSUME_32BITUIDS > 0
  result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);
#else
  /* First try the syscall.  */
# ifdef __NR_setresuid
  result = __setresuid (-1, uid, -1);
#  if __ASSUME_SETRESUID_SYSCALL > 0
  if (0)
#  else
  if (result == -1 && errno == ENOSYS)
#  endif
    /* No system call available.  Use emulation.  This may not work
       since `setreuid' also sets the saved user ID when UID is not
       equal to the real user ID, making it impossible to switch back.  */
# endif
    result = __setreuid (-1, uid);
#endif

  return result;
}
Beispiel #4
0
int
setegid (gid_t gid)
{
  int result;

  if (gid == (gid_t) ~0)
    return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);

#ifdef __NR_setresgid32
  result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
#else
  result = INLINE_SETXID_SYSCALL (setresgid, 3, -1, gid, -1);
#endif

  return result;
}
/* Set the group set for the current user to GROUPS (N of them).  For
   Linux we must convert the array of groups into the format that the
   kernel expects.  */
int
setgroups (size_t n, const gid_t *groups)
{
#if __ASSUME_32BITUIDS > 0
  return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
#else
  if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
    {
      __set_errno (EINVAL);
      return -1;
    }
  else
    {
      size_t i;
      __kernel_gid_t kernel_groups[n];

# ifdef __NR_setgroups32
      if (__libc_missing_32bit_uids <= 0)
	{
	  int result;
	  int saved_errno = errno;

	  result = INLINE_SETXID_SYSCALL (setgroups32, 2, n,
					  CHECK_N (groups, n));
	  if (result == 0 || errno != ENOSYS)
	    return result;

	  __set_errno (saved_errno);
	  __libc_missing_32bit_uids = 1;
	}
# endif /* __NR_setgroups32 */
      for (i = 0; i < n; i++)
	{
	  kernel_groups[i] = (__ptrvalue (groups))[i];
	  if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i]))
	    {
	      __set_errno (EINVAL);
	      return -1;
	    }
	}

      return INLINE_SETXID_SYSCALL (setgroups, 2, n,
				    CHECK_N (kernel_groups, n));
    }
#endif
}
Beispiel #6
0
int
__setgid (gid_t gid)
{
  int result;

  result = INLINE_SETXID_SYSCALL (setgid32, 1, gid);

  return result;
}
Beispiel #7
0
int
__setreuid (uid_t ruid, uid_t euid)
{
  int result;

  result = INLINE_SETXID_SYSCALL (setreuid32, 2, ruid, euid);

  return result;
}
Beispiel #8
0
int
__setregid (gid_t rgid, gid_t egid)
{
  int result;

  result = INLINE_SETXID_SYSCALL (setregid32, 2, rgid, egid);

  return result;
}
Beispiel #9
0
int
setegid (gid_t gid)
{
    int result;

    if (gid == (gid_t) ~0)
    {
        __set_errno (EINVAL);
        return -1;
    }

#ifdef __NR_setresgid32
    result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
#else
    result = INLINE_SETXID_SYSCALL (setresgid, 3, -1, gid, -1);
#endif

    return result;
}
Beispiel #10
0
int
seteuid (uid_t uid)
{
    int result;

    if (uid == (uid_t) ~0)
        return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);

    result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);

    return result;
}
int
__setresuid (uid_t ruid, uid_t euid, uid_t suid)
{
  int result;

# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresuid
  result = INLINE_SETXID_SYSCALL (setresuid32, 3, ruid, euid, suid);
# else
#  ifdef __NR_setresuid32
  if (__libc_missing_32bit_uids <= 0)
    {
      int saved_errno = errno;

      result = INLINE_SETXID_SYSCALL (setresuid32, 3, ruid, euid, suid);
      if (result == 0)
	goto out;
      if (errno != ENOSYS)
	return result;

      __set_errno (saved_errno);
      __libc_missing_32bit_uids = 1;
    }
#  endif /* __NR_setresuid32 */

  if (((ruid + 1) > (uid_t) ((__kernel_uid_t) -1U))
      || ((euid + 1) > (uid_t) ((__kernel_uid_t) -1U))
      || ((suid + 1) > (uid_t) ((__kernel_uid_t) -1U)))
    {
      __set_errno (EINVAL);
      return -1;
    }

  result = INLINE_SETXID_SYSCALL (setresuid, 3, ruid, euid, suid);
#  ifdef __NR_setresuid32
 out:
#  endif
# endif

  return result;
}
int
__setgid (gid_t gid)
{
  return INLINE_SETXID_SYSCALL (setgid, 1, gid);
}
Beispiel #13
0
int
__setreuid (uid_t ruid, uid_t euid)
{
  return INLINE_SETXID_SYSCALL (setreuid, 2, ruid, euid);
}
Beispiel #14
0
int
__setuid (uid_t uid)
{
  return INLINE_SETXID_SYSCALL (setuid, 1, uid);
}
Beispiel #15
0
/* Set the group set for the current user to GROUPS (N of them).  For
   Linux we must convert the array of groups into the format that the
   kernel expects.  */
int
setgroups (size_t n, const gid_t *groups)
{
  return INLINE_SETXID_SYSCALL (setgroups32, 2, n, groups);
}
Beispiel #16
0
int
__setregid (gid_t rgid, gid_t egid)
{
  return INLINE_SETXID_SYSCALL (setregid, 2, rgid, egid);
}