El setfsuid()
específico de Linux / setfsgid()
son por subproceso en lugar de por proceso. Están diseñados específicamente para este caso de uso (servidor de archivos).
Tenga en cuenta que access()
aún verificará el acceso utilizando el uid y el gid reales, eso es por diseño (tiene la intención de responder a la pregunta "¿debería el usuario que ejecutó este binario tener el acceso dado a este archivo" ). Para el setfsuid()
/ setfsgid()
caso, solo debe probar la operación solicitada y detectar la falla debido a la falta de permiso en ese punto.
Para cambiar el uid solo para un subproceso, debe usar syscall directamente:syscall (SYS_setresuid, ...); ¡La función libc setresuid() lo sincronizará para todos los subprocesos (usando un singal que envía a todos los subprocesos)!