2010-03-07 23 views
19

Próbuję utworzyć plik tylko do zapisu w języku C na systemie Linux (Ubuntu). To jest mój kod: TrybTworzenie pliku w systemie Linux przy użyciu C

int fd2 = open ("/tmp/test.svg", O_RDWR|O_CREAT); 

if (fd2 != -1) { 
    //.... 
} 

Ale dlaczego ja pliki utworzone mieć „XR”? Jak mogę go utworzyć, aby móc go otworzyć w wierszu polecenia?

------xr-- 1 michael michael 55788 2010-03-06 21:57 test.txt* 
------xr-- 1 michael michael 9703 2010-03-06 22:41 test.svg* 
+2

Niesamowity przykład niebezpiecznego kodu. –

+2

@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. –

Odpowiedz

31

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.

+1

Jeśli masz najnowsze wersje zarówno nagłówków glibc, jak i gcc, gcc może ostrzegać o pozostawieniu trzeciego argumentu na "otwórz". – caf

+0

@ Jonathan: czy coś jest nie tak z tym, co napisałem? Wspomniałeś o złośliwych, zepsutych dowiązaniach symbolicznych i problemie ze stałą nazwą w kodzie produkcyjnym. Jakie/dlaczego są te problemy? –

+1

@nvl: Załóżmy, że dwóch użytkowników, rachunki i joe, uruchamiają jednocześnie Twój program. Obydwa tworzą plik /tmp/test.svg ... z którego danych korzysta się? Załóżmy, że Mr Malicious działa na twoim komputerze i potrafi: ln -s/etc/passwd/tmp/test.svg'. Teraz jedna z dwóch rzeczy ma się stać, gdy twój program działa: (1) otrzymujesz błąd otwarty, ponieważ nie możesz pisać do/etc/passwd (nie jesteś rootem) lub (2) otrzymujesz kopię Twój obraz SVG w/etc/passwd, ponieważ jesteś rootem. Żadne z nich nie jest zwykle uważane za pożądane. A Mr Malicious może również zrobić: 'ln -s /usr/lib/security/libmalpam.so/tmp/test.svg' ... –

1

Daj uprawnienia dostępu jako trzeci parametr:

int fd2 = open("/tmp/test.svg", O_RDWR|O_CREAT, 0777); // Originally 777 (see comments) 

if (fd2 != -1) { 
    // use file descriptor 
    close(fd2); 
} 

Dzięki temu wszystko czytać, pisać i wykonywać uprawnienia zostaną podane do użytkownika, grupy i innych. Zmodyfikuj trzeci parametr zgodnie z twoim użyciem.

+1

777 to nie to samo co S_IRWXU | S_IRWXG | S_IRWXO. 0x777 zdaje się być taki sam, ale jest kiepską praktyką kodowania. – prewett

+3

Należy zauważyć, że ani 777 (dziesiętnie) ani 0x777 (hex) nie są takie same jak normalne 0777 (ósemkowe) lub 'S_IRWXU | S_IRWXG | S_IRWXO', który zapewnia użytkownikowi, grupie i innym osobom dostęp do odczytu, zapisu i wykonywania w pliku. Tak więc poprzedni komentarz, że "0x777 zdaje się być taki sam" jest błędny. Odpowiada to: r-xrwSrwt (zestaw bitów SGID, zestaw bitów SVTX, a także uprawnienia 0567, i nie mam cierpliwości, aby to wypisać symbolicznie - wymaga to siedmiu terminów lub razem). –

Powiązane problemy