Usted necesita la forma de tres argumentos de open()
cuando se especifica O_CREAT. Cuando se omite el tercer argumento, open()
usa cualquier valor que esté en la pila donde se esperaba el tercer argumento; esto rara vez es un conjunto coherente de permisos (en su ejemplo, parece que el decimal 12 = octal 014 estaba en la pila).
El tercer argumento son los permisos del archivo, que se modificarán con el valor umask()
.
int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);
Tenga en cuenta que se puede crear un archivo sin permisos de escritura (a cualquier otra persona, o cualquier otro proceso) sin dejar de ser capaz de escribir en él desde el proceso actual. Rara vez es necesario utilizar bits de ejecución en archivos creados a partir de un programa, a menos que esté escribiendo un compilador (¡y los archivos '.svg' no son normalmente ejecutables!).
Las banderas S_xxxx provienen de <sys/stat.h>
y <fcntl.h>
- puede utilizar cualquiera de cabecera para obtener la información (pero sí open()
se declara en <fcntl.h>
).
Tenga en cuenta que el nombre del archivo fijo y la ausencia de opciones de protección como O_EXCL
hacen que incluso la llamada revisada open()
sea un tanto insegura.
Ejemplo impresionante de código inseguro. –
@Michael Foukarakis: temporalmente, hay problemas más grandes con los que lidiar, pero tienes razón. Se debe agregar O_EXCL (para evitar el seguimiento de enlaces simbólicos maliciosos y evitar el archivo de otras personas cuando ejecutan el mismo programa en la misma máquina); el nombre fijo será problemático en el código de producción, por lo que debería estar usando '' mkstemp() ''o un pariente para crear el nombre del archivo. Y la lista continúa, sin duda. –