Trzeba formę trzech argument open()
gdy podasz O_CREAT. Gdy pominiesz trzeci argument, open()
używa jakiejkolwiek wartości na stosie, gdzie oczekiwano trzeciego argumentu; rzadko jest to spójny zestaw uprawnień (w twoim przykładzie wydaje się, że dziesiętny 12 = ósemkowy 014 był na stosie).
Trzeci argument to uprawnienia do pliku - które zostaną zmodyfikowane wartością umask()
.
int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);
Zauważ, że można utworzyć plik bez uprawnień zapisu (do kogoś innego, lub jakiegokolwiek innego procesu), a jednocześnie jest w stanie napisać do niego z bieżącego procesu. Rzadko trzeba używać bitów exec do plików utworzonych z programu - chyba że piszesz kompilator (a pliki ".svg" nie są normalnie plikami wykonywalnymi!).
Flagi S_xxxx pochodzą z <sys/stat.h>
i <fcntl.h>
- można użyć nagłówka, aby uzyskać informacje (ale open()
sama jest zadeklarowana w <fcntl.h>
).
Należy pamiętać, że stała nazwa pliku i brak opcji ochronnych, takich jak O_EXCL
, powodują, że nawet zmienione wywołanie open()
jest niebezpieczne.
Niesamowity przykład niebezpiecznego kodu. –
@Michael Foukarakis: Tymczasowo są większe problemy, z którymi trzeba sobie poradzić, ale masz rację. O_EXCL powinien zostać dodany (aby uniknąć niszczenia złośliwych zepsutych dowiązań symbolicznych i unikania przekręcenia plików innych osób, gdy uruchamiają ten sam program na tym samym komputerze); stała nazwa będzie problematyczna w kodzie produkcyjnym, więc powinna używać "mkstemp()" lub względnego, aby utworzyć nazwę pliku. A lista jest długa, bez wątpienia. –