Le setfsuid()
spécifique à Linux / setfsgid()
sont par thread plutôt que par processus. Ils sont conçus spécifiquement pour ce cas d'utilisation (serveur de fichiers).
Notez que access()
vérifiera toujours l'accès en utilisant les vrais uid et gid - c'est par conception (il est prévu de répondre à la question "l'utilisateur qui a exécuté ce binaire devrait-il avoir l'accès donné à ce fichier" ). Pour le setfsuid()
/ setfsgid()
Dans ce cas, vous devez simplement essayer l'opération demandée et détecter l'échec en raison d'un manque d'autorisation à ce stade.
Pour changer l'uid d'un seul thread, vous devez utiliser directement l'appel système :syscall(SYS_setresuid, ...); La fonction libc setresuid() le synchronisera pour tous les threads (en utilisant un singal qu'il envoie à tous les threads) !