# setregid

## PROLOG



           This manual page is part of the POSIX Programmer's Manual.  The
           Linux implementation of this interface may differ (consult the
           corresponding Linux manual page for details of Linux behavior), or
           the interface may not be implemented on Linux.
    


## NAME



           setregid — set real and effective group IDs
    


## SYNOPSIS



           #include <unistd.h>
    
           int setregid(gid_t _rgid_ , gid_t _egid_);
    


## DESCRIPTION



           The _setregid_() function shall set the real and effective group IDs
           of the calling process.
    
           If _rgid_ is -1, the real group ID shall not be changed; if _egid_ is
           -1, the effective group ID shall not be changed.
    
           The real and effective group IDs may be set to different values in
           the same call.
    
           Only a process with appropriate privileges can set the real group
           ID and the effective group ID to any valid value.
    
           A non-privileged process can set either the real group ID to the
           saved set-group-ID from one of the _exec_ family of functions, or
           the effective group ID to the saved set-group-ID or the real group
           ID.
    
           If the real group ID is being set (_rgid_ is not -1), or the
           effective group ID is being set to a value not equal to the real
           group ID, then the saved set-group-ID of the current process shall
           be set equal to the new effective group ID.
    
           Any supplementary group IDs of the calling process remain
           unchanged.
    


## RETURN VALUE



           Upon successful completion, 0 shall be returned. Otherwise, -1
           shall be returned and _errno_ set to indicate the error, and neither
           of the group IDs are changed.
    


## ERRORS



           The _setregid_() function shall fail if:
    
           **EINVAL** The value of the _rgid_ or _egid_ argument is invalid or out-
                  of-range.
    
           **EPERM** The process does not have appropriate privileges and a
                  change other than changing the real group ID to the saved
                  set-group-ID, or changing the effective group ID to the
                  real group ID or the saved set-group-ID, was requested.
    
           _The following sections are informative._
    


## EXAMPLES



           None.
    


## APPLICATION USAGE



           If a non-privileged set-group-ID process sets its effective group
           ID to its real group ID, it can only set its effective group ID
           back to the previous value if _rgid_ was -1 in the _setregid_() call,
           since the saved-group-ID is not changed in that case. If _rgid_ was
           equal to the real group ID in the _setregid_() call, then the saved
           set-group-ID will also have been changed to the real user ID.
    


## RATIONALE



           Earlier versions of this standard did not specify whether the
           saved set-group-ID was affected by _setregid_() calls. This version
           specifies common existing practice that constitutes an important
           security feature. The ability to set both the effective group ID
           and saved set-group-ID to be the same as the real group ID means
           that any security weakness in code that is executed after that
           point cannot result in malicious code being executed with the
           previous effective group ID. Privileged applications could already
           do this using just _setgid_(), but for non-privileged applications
           the only standard method available is to use this feature of
           _setregid_().
    


## FUTURE DIRECTIONS



           None.
    


* * *