open () ne définit pas l’indicateur O_CLOEXEC

J’essaie de définir l’atsortingbut O_CLOEXEC en utilisant open () et je n’ai pas de succès.

Considérons le microtest suivant:

#include  #include  int main() { int fd = open("test.c", O_RDONLY | O_CLOEXEC); int ret = fcntl(fd, F_GETFL); if(ret & O_CLOEXEC) { printf("OK!\n"); } else { printf("FAIL!\n"); } printf("fd = %d\n", fd); printf("ret = %x, O_CLOEXEC = %x\n", ret, O_CLOEXEC); return 0; } 

Sous Linux avec la version 2.6 du kernel, le test réussit et affiche “OK!”, Mais échoue avec les kernelx 3.8 ou 3.9.

Qu’est-ce qui ne va pas? Merci!

Il a été décidé que l’exposition de l’indicateur O_CLOEXEC à fcntl(fd, F_GETFL) constitue une fuite de sécurité. Le changement a été effectué par cette validation dans le kernel 3.6-rc7:

 commit c6f3d81115989e274c42a852222b80d2e14ced6f Author: Al Viro  Date: Sun Aug 26 11:01:04 2012 -0400 don't leak O_CLOEXEC into ->f_flags Signed-off-by: Al Viro  

En d’autres termes, vous ne devriez pas vous fier à la O_CLOEXEC d’ O_CLOEXEC en premier lieu.

Le paramètre d’appel fcntl F_GETFD , l’indicateur est FD_CLOEXEC et le support O_CLOEXEC est apparu dans 2.6. 23 . Lisez les manuels:

  File descriptor flags The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC, the close-on-exec flag. If the FD_CLOEXEC bit is 0, the file descriptor will remain open across an execve(2), otherwise it will be closed. F_GETFD (void) Read the file descriptor flags; arg is ignored. F_SETFD (int) Set the file descriptor flags to the value specified by arg. 

Tu le fais de la mauvaise manière. Vous devriez le faire de cette façon:

 int ret = fcntl(fd, F_GETFD); if (ret & FD_CLOEXEC) { ... }