(root)/
glibc-2.38/
hurd/
hurdid.c
       1  /* Copyright (C) 1993-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <hurd.h>
      19  #include <hurd/id.h>
      20  #include "set-hooks.h"
      21  
      22  struct hurd_id_data _hurd_id;
      23  
      24  
      25  /* Check that _hurd_id.{gen,aux} are valid and update them if not.
      26     Expects _hurd_id.lock to be held and does not release it.  */
      27  
      28  error_t
      29  _hurd_check_ids (void)
      30  {
      31    if (! _hurd_id.valid)
      32      {
      33        inline void dealloc (__typeof (_hurd_id.gen) *p)
      34  	{
      35  	  if (p->uids)
      36  	    {
      37  	      __vm_deallocate (__mach_task_self (),
      38  			       (vm_address_t) p->uids,
      39  			       p->nuids * sizeof (uid_t));
      40  	      p->uids = NULL;
      41  	    }
      42  	  p->nuids = 0;
      43  	  if (p->gids)
      44  	    {
      45  	      __vm_deallocate (__mach_task_self (),
      46  			       (vm_address_t) p->gids,
      47  			       p->ngids * sizeof (gid_t));
      48  	      p->gids = NULL;
      49  	    }
      50  	  p->ngids = 0;
      51  	}
      52  
      53        error_t err;
      54  
      55        dealloc (&_hurd_id.gen);
      56        dealloc (&_hurd_id.aux);
      57  
      58        if (_hurd_id.rid_auth != MACH_PORT_NULL)
      59  	{
      60  	  __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth);
      61  	  _hurd_id.rid_auth = MACH_PORT_NULL;
      62  	}
      63  
      64        if (err = __USEPORT (AUTH, __auth_getids
      65  			   (port,
      66  			    &_hurd_id.gen.uids, &_hurd_id.gen.nuids,
      67  			    &_hurd_id.aux.uids, &_hurd_id.aux.nuids,
      68  			    &_hurd_id.gen.gids, &_hurd_id.gen.ngids,
      69  			    &_hurd_id.aux.gids, &_hurd_id.aux.ngids)))
      70  	return err;
      71  
      72        _hurd_id.valid = 1;
      73      }
      74  
      75    return 0;
      76  }
      77  
      78  static void attribute_used_retain
      79  init_id (void)
      80  {
      81    __mutex_init (&_hurd_id.lock);
      82    _hurd_id.valid = 0;
      83    _hurd_id.rid_auth = MACH_PORT_NULL;
      84    _hurd_id.gen.uids = _hurd_id.aux.uids = NULL;
      85    _hurd_id.gen.nuids = _hurd_id.aux.nuids = 0;
      86    _hurd_id.gen.gids = _hurd_id.aux.gids = NULL;
      87    _hurd_id.gen.ngids = _hurd_id.aux.ngids = 0;
      88  }
      89  SET_RELHOOK (_hurd_preinit_hook, init_id);