.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
.\" and Copyright (c) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 1993-07-21 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1994-08-21 by Michael Chastain <mec@shell.portal.com>:
.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified 1999-11-12 by Urs Thuermann <urs@isnogud.escape.de>
.\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" 2006-09-04 Michael Kerrisk <mtk.manpages@gmail.com>
.\"     Added list of process attributes that are not preserved on exec().
.\" 2007-09-14 Ollie Wild <aaw@google.com>, mtk
.\"     Add text describing limits on command-line arguments + environment
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\" This file is distributed under the same license as original manpage
.\" Copyright of the original manpage:
.\" Copyright © 1992 Drew Eckhardt, 2006 Michael Kerrisk 
.\" Copyright © of Polish translation:
.\" Przemek Borys (PTM) <pborys@dione.ids.pl>, 1998.
.\" Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, 2002.
.\" Robert Luberda <robert@debian.org>, 2013.
.\" Michał Kułach <michal.kulach@gmail.com>, 2014.
.TH EXECVE 2 2014\-08\-19 Linux "Podręcznik programisty Linuksa"
.SH NAZWA
execve \- uruchomienie programu
.SH SKŁADNIA
\fB#include <unistd.h>\fP
.sp
\fBint execve(const char *\fP\fIfilename\fP\fB, char *const \fP\fIargv\fP\fB[], \fP
.br
\fB char *const \fP\fIenvp\fP\fB[]);\fP
.SH OPIS
\fBexecve\fP() wykonuje program wskazywany przez \fIfilename\fP. \fIfilename\fP musi
być albo wykonywalnym plikiem binarnym, albo skryptem zaczynającym się od
linii w postaci:

.in +4n
.nf
\fB#!\fP \fIinterpreter \fP[opcjonalny\-parametr]
.fi
.in

Szczegóły tego ostatniego przypadku można znaleźć poniżej w rozdziale
"Skrypty interpretowane".

\fIargv\fP jest tablicą łańcuchów przekazywanych jako argumenty nowego
programu. Zgodnie z konwencją pierwszy z nich powinien zawierać nazwę pliku
skojarzonego z wykonywanym programem. \fIenvp\fP jest tablicą łańcuchów postaci
\fBklucz=wartość\fP, która jest przekazywana jako środowisko do nowego
programu. Zarówno \fIargv\fP, jak i \fIenvp\fP muszą być zakończone wskaźnikiem
pustym (NULL). Tablica argumentów oraz środowisko są dostępne w funkcji main
wywoływanego programu, jeżeli jest ona zdefiniowana jako:

.in +4n
.nf
int main(int argc, char *argv[], char *envp[])
.fi
.in

W razie powodzenia \fBexecve\fP() nie powraca, a sekcje tekstu, danych, bss i
stos wywołującego procesu są nadpisywane odpowiednimi sekcjami ładowanego
programu.

Jeśli obecny program jest śledzony za pomocą ptrace, wysyła się mu
\fBSIGTRAP\fP po pomyślnym \fBexecve\fP().

Jeżeli plik programu wskazywany przez \fIfilename\fP ma ustawiony bit
set\-user\-ID i plik ten jest umieszczony na systemie plików zamontowanym bez
opcji \fInosuid\fP (znacznika \fBMS_NOSUID\fP wywołania \fBmount\fP(2)) oraz proces
wywołujący nie jest śledzony (\fBptrace\fP(2)), to efektywny identyfikator
użytkownika procesu wywołującego jest ustawiany na właściciela pliku
programu. Podobnie, jeżeli dla pliku programu ustawiony jest bit
set\-group\-ID, to efektywnemu identyfikatorowi grupy procesu wywołującego
jest przypisywana grupa pliku programu.

Efektywny identyfikator użytkownika jest kopiowany do saved\-set\-user\-ID;
podobnie efektywny identyfikator grupy jest kopiowany do
saved\-set\-group\-ID. Kopiowanie odbywa się po zmianie  któregokolwiek z
efektywnych identyfikatorów związanej z bitami praw dostępu set\-user\-ID i
set\-group\-ID.

Jeśli program wykonywalny jest skonsolidowany dynamicznie w formacie a.out z
bibliotekami dzielonymi, to na początku uruchamiania wywoływany jest
konsolidator dynamiczny \fBld.so\fP(8), który ładuje wszystkie biblioteki do
pamięci i konsoliduje z nimi program wykonywalny.

Jeżeli program jest skonsolidowany dynamicznie jako ELF, to do załadowania
potrzebnych bibliotek współdzielonych używany jest interpreter określony w
segmencie PT_INTERP. Tym interpreterem jest zazwyczaj \fI/lib/ld\-linux.so.2\fP,
w wypadku programów skonsolidowanych z biblioteką glibc2.

Wszystkie atrybuty procesu są zachowywane podczas \fBexecve\fP(), z wyjątkiem
poniższych:
.IP * 3
Ustawienia obsługi sygnałów, które są przechwytywane, są zmieniane na
wartości domyślne (\fBsignal\fP(7)).
.IP *
Alternatywny stos sygnałów nie jest zachowywany (\fBsigaltstack\fP(2)).
.IP *
Mapowania pamięci nie są zachowywane (\fBmmap\fP(2))
.IP *
Dołączone segmenty pamięci dzielonej Systemu\ V są odłączane (\fBshmat\fP(2)).
.IP *
Regiony pamięci dzielonej POSIX są odmapowane (\fBshm_open\fP(3)).
.IP *
Otwarte kolejki komunikatów POSIX są zamykane (\fBmq_overview\fP(7)).
.IP *
Otwarte semafory nazwane POSIX są zamykane (\fBmq_overview\fP(7)).
.IP *
Timery POSIX nie są zachowywane (\fBtimer_create\fP(2)).
.IP *
Otwarte strumienie katalogów są zamykane (\fBopendir\fP(3)).
.IP *
Blokady pamięci nie są zachowywane (\fBmlock\fP(2), \fBmlockall\fP(2)).
.IP *
Zarejestrowanie funkcje wykonywanych po zakończeniu procesu nie są
zachowywane (\fBatexit\fP(3), \fBon_exit\fP(3)).
.IP *
Środowisko zmiennoprzecinkowe jest ustawiane na domyślne (patrz \fBfenv\fP(3)).
.PP
Atrybuty procesu w liście przedstawionej powyżej są określone w
POSIX.1\-2001. Następujące specyficzne dla Linuksa atrybuty procesu również
nie są zachowywane podczas \fBexecve\fP():
.IP * 3
Znacznik \fBPR_SET_DUMPABLE\fP \fBprctl\fP(2) jest ustawiany, chyba że wykonywany
program ma ustawiony bit set\-user\-ID lub set\-group\-ID, w którym przypadku
znacznik ten jest czyszczony.
.IP *
Znacznik \fBPR_SET_KEEPCAPS\fP \fBprctl\fP(2) jest czyszczony.
.IP *
(Od Linuksa 2.4.36 / 2.6.23) Jeśli wykonywany program ma ustawiony bit
set\-user\-ID lub set\-group\-ID, to jest czyszczony znacznik
\fBPR_SET_PDEATHSIG\fP  sygnału śmierci rodzica ustawiony przez  \fBprctl\fP(2).
.IP *
Nazwa procesu ustawiona przez \fBPR_SET_NAME\fP z \fBprctl\fP(2) (i wyświetlana
przez \fIps\ \-o comm\fP) jest ustawiana na nazwę nowego pliku wykonywalnego.
.IP *
Znacznik \fBSECBIT_KEEP_CAPS\fP w \fIsecurebits\fP jest czyszczony. Patrz
\fBcapabilities\fP(7).
.IP *
Sygnał zakończenia jest ustawiany na \fBSIGCHLD\fP (patrz \fBclone\fP(2)).
.PP
Dalsze uwagi:
.IP * 3
Wszystkie wątki oprócz wątku wywołującego są niszczone podczas
\fBexecve\fP(). Muteksy, zmienne warunkowe i inne obiekty pthreads nie są
zachowywane.
.IP *
Odpowiednik \fIsetlocale(LC_ALL, "C")\fP jest wykonywany po uruchomieniu
programu.
.IP *
POSIX.1\-2001 określa, że ustawienie procedur obsługi sygnału na ignorowanie
lub na wartość domyślną jest pozostawiane bez zmian. POSIX.1\-2001 przewiduje
jeden wyjątek od tej reguły: jeśli \fBSIGCHLD\fP jest ignorowany, to
implementacja może albo nie zmienić tego ustawienia, albo przestawić je na
wartość domyślną; Linux robi to pierwsze.
.IP *
Wszystkie asynchroniczne operacje wejścia/wyjście są anulowane
(\fBaio_read\fP(3), \fBaio_write\fP(3)).
.IP *
Sposób obsługi atrybutów (zdolności) procesu podczas \fBexecve\fP() opisano w
\fBcapabilities\fP(7).
.IP *
.\" On Linux it appears that these file descriptors are
.\" always open after an execve(), and it looks like
.\" Solaris 8 and FreeBSD 6.1 are the same. -- mtk, 30 Apr 2007
Domyślnie deskryptory plików pozostają otwarte po \fBexecve\fP(). Deskryptory
plików oznaczone jako "close\-on\-exec" są zamykane, patrz opis \fBFD_CLOEXEC\fP
w \fBfcntl\fP(2). (Jeśli deskryptor pliku zostanie zamknięty, to zwolnione
zostaną wszystkie blokady rekordów dotyczące pliku związanego z tym
deskryptorem. Szczegóły można znaleźć w \fBfcntl\fP(2)). POSIX.1\-2001 mówi, że
jeżeli deskryptory plików 0, 1 i 2 zostałyby zamknięte po pomyślnym
wykonaniu \fBexecve\fP(), a proces uzyskałby przywileje z powodu ustawionego na
wykonywanym pliku bitu uprawnień set\-user\-ID lub set\-group\-ID, to system
może otworzyć bliżej nieokreślony plik dla każdego z tych deskryptorów
plików. Jako zasadę należy przyjąć, że żaden przenośny program,
uprzywilejowany czy nie, nie może zakładać, że te trzy deskryptory plików
będą zamknięte po \fBexecve\fP().
.SS "Skrypty interpretowane"
Skrypt interpretowany jest plikiem tekstowym mającym ustawione prawo do
wykonywania. Pierwsza linia tego pliku jest w postaci:

.in +4n
.nf
\fB#!\fP \fIinterpreter \fP[opcjonalny\-parametr]
.fi
.in

\fIinterpreter\fP mus być poprawną nazwą ścieżki do pliku wykonywalnego, który
nie jest skryptem. Jeśli argument \fIfilename\fP wywołania \fBexecve\fP() określa
interpreter, to zostanie uruchomiony \fIinterpreter\fP z następującymi
argumentami:

.in +4n
.nf
\fIinterpreter\fP [opcjonalny\-arg] \fIfilename\fP arg...
.fi
.in

gdzie \fIarg...\fP jest serią słów, na które wskazuje argument \fIargv\fP
wywołania \fBexecve\fP(), poczynając od \fIargv\fP[1].

Dla zachowania przenośności na inne systemu \fIoptional\-arg\fP albo w ogóle nie
powinien być podawany, albo powinien być podany jako pojedyncze słowo (nie
powinien zawierać spacji); patrz UWAGI poniżej.
.SS "Ograniczenia rozmiaru argumentów i środowiska"
Większość implementacji Uniksa narzuca ograniczenia na całkowity rozmiar
argumentów linii poleceń (\fIargv\fP) i środowiska (\fIenvp\fP) przekazywanych do
nowego programu. POSIX.1 pozwala implementacji ogłosić te ograniczenia za
pomocą stałej \fBARG_MAX\fP (albo zdefiniowanej w \fI<limits.h>\fP, albo
dostępnej podczas wykonywania programu za pomocą wywołania
\fIsysconf(_SC_ARG_MAX)\fP).

W jadrach Linuksa wcześniejszych niż 2.6.23, pamięć używana do
przechowywania łańcuchów znaków środowiska i argumentów była ograniczana do
32 stron (zdefiniowane przez stałą jądra \fBMAX_ARG_PAGES\fP). W architekturach
mających strony o rozmiarze 4 kB oznaczało to maksymalny rozmiar równy 128
kB.

.\" For some background on the changes to ARG_MAX in kernels 2.6.23 and
.\" 2.6.25, see:
.\"     http://sourceware.org/bugzilla/show_bug.cgi?id=5786
.\"     http://bugzilla.kernel.org/show_bug.cgi?id=10095
.\"     http://thread.gmane.org/gmane.linux.kernel/646709/focus=648101,
.\"     checked into 2.6.25 as commit a64e715fc74b1a7dcc5944f848acc38b2c4d4ee2.
.\" Ollie: That doesn't include the lists of pointers, though,
.\" so the actual usage is a bit higher (1 pointer per argument).
W jądrze 2.6.23 i późniejszych większość architektur wspiera ograniczenie
rozmiaru wywodzące się z miękkiego limitu zasobu  \fBRLIMIT_STACK\fP (patrz
\fBgetrlimit\fP(2)), obowiązującego podczas wywołania \fBexecve\fP() (Wyjątek
stanowią architektury nie mające jednostki zarządzania pamięcią: przechowują
ograniczenie obowiązujące przed wersją jądra  2.6.23). Zmiana ta pozwala
programom na posiadanie znacznie większej listy argumentów lub
środowiska. Na tych architekturach całkowity rozmiar jest ograniczony do 1/4
dopuszczalnego rozmiaru stosu. (Limit  1/4 zapewnia, że zostanie jakaś
przestrzeń na stos dla nowego programu). Od Linuksa 2.6.25 jądro przyjmuje
wartość minimalną 32 stron dla tego limitu rozmiaru, tak żeby zagwarantować,
że w przypadku gdy \fBRLIMIT_STACK\fP ma niewielką wartość, aplikacje dostaną
co najmniej taką przestrzeń na argumenty i środowisko, jaką miały w Linuksie
2.6.23 i wcześniejszych. (Takiej gwarancji nie ma w Linuksach 2.6.23 i
2.6.24). Dodatkowo ograniczeniem na pojedynczy łańcuch znaków są 32 strony
(stała jądra \fBMAX_ARG_STRLEN\fP), a maksymalna liczba takich łańcuchów wynosi
0x7FFFFFFF.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu \fBexecve\fP() nie wraca, w wypadku błędu zwracane
jest \-1 i odpowiednio ustawiane \fIerrno\fP.
.SH BŁĘDY
.TP 
\fBE2BIG\fP
Całkowita liczba bajtów środowiska (\fIenvp\fP) i listy argumentów (\fIargv\fP)
jest za duża.
.TP 
\fBEACCES\fP
Brak praw do przeszukiwania dla składnika ścieżki \fIfilename\fP lub ścieżki
interpretera skryptu (patrz także \fBpath_resolution\fP(7)).
.TP 
\fBEACCES\fP
Plik lub interpreter skryptu nie jest zwykłym plikiem.
.TP 
\fBEACCES\fP
Brak praw wykonywania dla pliku, skryptu lub intepretera ELF.
.TP 
\fBEACCES\fP
System plików jest zamontowany jako \fInoexec\fP.
.TP 
\fBEAGAIN\fP (od Linuksa 3.1)
.\" commit 72fa59970f8698023045ab0713d66f3f4f96945c
Po zmianie swojego rzeczywistego UID za pomocą jednego z wywołań
\fBset*uid\fP(), wywołujący był\(emi wciąż jest\(empowyżej swojego limitu
zasobó \fBRLIMIT_NPROC\fP (zob. \fBsetrlimit\fP(2)). Więcej informacji o tym
błędzie znajduje się w rozdziale UWAGI.
.TP 
\fBEFAULT\fP
\fIfilename\fP lub jeden ze wskaźników w wektorach \fIargv\fP lub \fIenvp\fP wskazuje
poza dostępną dla użytkownika przestrzeń adresową.
.TP 
\fBEINVAL\fP
Plik wykonywalny w formacie ELF ma więcej niż jeden segment PT_INTERP
(tzn. ma więcej niż jeden interpreter).
.TP 
\fBEIO\fP
Wystąpił błąd wejścia\-wyjścia.
.TP 
\fBEISDIR\fP
Intepreter ELF jest katalogiem.
.TP 
\fBELIBBAD\fP
Nie został rozpoznany format interpretera ELF.
.TP 
\fBELOOP\fP
Podczas rozwiązywania \fIfilename\fP, nazwy skryptu lub interpretera ELF
napotkano zbyt wiele dowiązań symbolicznych.
.TP 
\fBEMFILE\fP
Proces osiągnął już maksymalną liczbę otwartych plików.
.TP 
\fBENAMETOOLONG\fP
\fIfilename\fP jest zbyt długie.
.TP 
\fBENFILE\fP
Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych
plików.
.TP 
\fBENOENT\fP
Plik \fIfilename\fP, skrypt, lub intepreter ELF nie istnieje albo nie można
znaleźć biblioteki współdzielonej potrzebnej do uruchomienia pliku lub
interpretera.
.TP 
\fBENOEXEC\fP
Nie rozpoznano formatu pliku binarnego, plik ten jest skompilowany dla innej
architektury albo wystąpił jakiś inny błąd formatu pliku, który powoduje, że
program nie może być uruchomiony.
.TP 
\fBENOMEM\fP
Brak dostępnej pamięci jądra.
.TP 
\fBENOTDIR\fP
Składnik ścieżki \fIfilename\fP, ścieżki skryptu lub ścieżki interpretera ELF
nie jest katalogiem.
.TP 
\fBEPERM\fP
System plików jest zamontowany jako \fInosuid\fP, użytkownik nie jest
administratorem, a plik ma ustawiony bit set\-user\-ID lub set\-group\-ID.
.TP 
\fBEPERM\fP
Proces jest śledzony (trace), użytkownik nie jest superużytkownikiem, a plik
ma ustawiony bit set\-user\-ID lub set\-group\-ID.
.TP 
\fBETXTBSY\fP
Plik wykonywalny był otwarty do zapisu przez jeden lub więcej procesów.
.SH "ZGODNE Z"
.\" SVr4 documents additional error
.\" conditions EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX does not
.\" document ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL,
.\" EISDIR or ELIBBAD error conditions.
SVr4, 4.3BSD, POSIX.1\-2001. POSIX.1\-2001 nie opisuje zachowania #!,oprócz
tego jest zgodny.
.SH UWAGI
Procesy z ustawionymi znacznikami set\-user\-ID oraz set\-group\-ID nie mogą być
śledzone za pomocą \fBptrace\fP(2).

.\" e.g., EFAULT on Solaris 8 and FreeBSD 6.1; but
.\" HP-UX 11 is like Linux -- mtk, Apr 2007
.\" Bug filed 30 Apr 2007: http://bugzilla.kernel.org/show_bug.cgi?id=8408
.\" Bug rejected (because fix would constitute an ABI change).
.\"
Efekt zamontowania systemu plików \fInosuid\fP jest różny dla różnych wersji
jądra Linuksa: niektóre odmówią uruchomienia programów set\-user\-ID i
set\-group\-ID, gdy spowodowałoby to udostępnienie użytkownikowi możliwości,
którymi w danym momencie nie dysponuje (i zwrócą \fBEPERM\fP), inne po prostu
zignorują bity set\-user\-ID i set\-group\-ID i pomyślnie wykonają \fBexec\fP(). W
Linuksie, \fIargv\fP i \fIenvp\fP mogą być określone jako NULL. W obu przypadkach
ma to ten sam skutek, co określenie argumentu jako wskaźnika do listy
zawierającej pojedynczy wskaźnik zerowy. \fBProszę nie korzystać z tej
"funkcji"!\fP Jest to zachowanie niestandardowe i nieprzenośne, większość
innych systemów uniksowych zwróci w takim przypadku błąd (\fBEFAULT\fP).

POSIX.1\-2001 określa, że wartości zwracane przez \fBsysconf\fP(3) nie powinny
się zmieniać przez cały czas życia procesu. Jednakże od wersji 2.6.23
Linuksa zmiana limitu zasobów \fBRLIMIT_STACK\fP powoduje również zmianę
wartości zwracanej przez \fB_SC_ARG_MAX\fP, żeby odzwierciedlić fakt, że
zmieniły się ograniczenia przestrzeni służącej do przechowywania argumentów
linii poleceń i zmiennych środowiska.

.\"
W większości sytuacji gdy \fBexecve\fP() zawiedzie, kontrola powraca do
oryginalnego obrazu wykonywalnego, a wywołujący \fBexecve\fP() może następnie
obsłużyć błąd. Jednak są (rzadkie) przypadki (zwykle przy braku zasobów),
gdy błąd może wystąpić w momencie bez powrotu: oryginalny obraz wykonywalne
został podzielony, a nie można całkowicie zbudować nowego obrazu. W takich
sytuacjach jądro zabija proces sygnałem \fBSIGKILL\fP.
.SS "Skrypty interpretowane"
Maksymalna długość pierwszego wiersza skryptu interpretera wynosi 127
znaków.

.\" e.g., Solaris 8
.\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward
Semantyka argumentu \fIoptional\-arg\fP skryptu interpretera różni się pomiędzy
implementacjami. Pod Linuksem cały łańcuch znaków występujący po nazwie
\fIinterpreter\fPa jest przekazywany jako pojedynczy argument. Jednakże inne
systemy zachowują się inaczej. Niektóre systemy traktują  pierwszy znaku
białej spacji jako znak kończący \fIoptional\-arg\fP. Na innych systemach skrypt
interpretera może przyjmować wiele argumentów i białe znaki \fIoptional\-arg\fP
służą do ich rozdzielania.

.\"
.\" .SH BUGS
.\" Some Linux versions have failed to check permissions on ELF
.\" interpreters.  This is a security hole, because it allows users to
.\" open any file, such as a rewinding tape device, for reading.  Some
.\" Linux versions have also had other security holes in
.\" .BR execve ()
.\" that could be exploited for denial of service by a suitably crafted
.\" ELF binary. There are no known problems with 2.0.34 or 2.2.15.
Linux ignoruje bity set\-user\-ID i set\-group\-ID dla skryptów.
.SS "execve() i EAGAIN"
Poniżej znajduje się bardziej szczegółowy opis błędu \fBEAGAIN\fP, który może
wystąpić (od Linuksa 3.1) przy wywoływaniu \fBexecve\fP().

.\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4
Błąd \fBEAGAIN\fP może wystąpić, gdy wywołanie \fIpoprzedzające\fP \fBsetuid\fP(2),
\fBsetreuid\fP(2) lub \fBsetresuid\fP(2) spowodowało, że rzeczywisty ID
użytkownika procesu zmienił się i ta zmiana doprowadziła do wyczerpania jego
limitu zasobów \fBRLIMIT_NPROC\fP (tzn. liczba procesów należących do nowego
rzeczywistego UID przekroczy limit zasobów). W wersjach Linuksa od 2.6.0 do
3.0 powodowało to niepowodzenie wywołania \fBset*uid\fP(). Przed wersja 2.6
limit zasobów nie był\ nakładany w przypadku procesów zmieniających swój
identyfikator użytkownika.

Od Linuksa 3.1, opisana sytuacja nie powoduje już niepowodzenia wywołania
\fBset*uid\fP(), ponieważ zbyt często prowadziło to do dziur bezpieczeństwa,
gdy nieprawidłowo napisane programy nie sprawdzały statusu zakończenia i
przyjmowały, że\(emjeśli wywołujący ma uprawnienia roota\(emwywołanie zawsze
powiedzie się. Obecnie wywołania \fBset*uid\fP() poprawnie zmieniają
rzeczywisty UID, lecz jądro ustawia wewnętrzną flagę \fBPF_NPROC_EXCEEDED\fP,
wskazując że przekroczono limit zasobów \fBRLIMIT_NPROC\fP. Jeśli flaga
\fBPF_NPROC_EXCEEDED\fP jest ustawiona, a limit zasobów jest wciąż przekroczony
w trakcie kolejnego wywołania \fBexecve\fP(), to wywołanie to zakończy się z
błędem \fBEAGAIN\fP.  Ta logika jądra zapewnia, że limit zasobów
\fBRLIMIT_NPROC\fP jest wciąż wymuszony dla zwykłej pracy demonów
uprzywilejowanych \(emprzykładem jest \fBfork\fP(2)  + \fBset*uid\fP()  +
\fBexecve\fP().

Jeśli jednak limit zasobów nie był już przekroczony w trakcie wywołania
\fBexecve\fP() (ponieważ zakończyły się inne procesy należące do tego
rzeczywistego UID pomiędzy wywołaniami \fBset*uid()\fP i \fBexecve\fP()), to
wywołanie \fBexecve\fP() powiedzie się, a jądro usunie flagę procesu
\fBPF_NPROC_EXCEEDED\fP. Flaga jest usuwana również wówczas, gdy kolejne
wywołanie do \fBfork\fP(2) przez ten proces powiedzie się.
.SS Historia
.\"
.\" .SH BUGS
.\" Some Linux versions have failed to check permissions on ELF
.\" interpreters.  This is a security hole, because it allows users to
.\" open any file, such as a rewinding tape device, for reading.  Some
.\" Linux versions have also had other security holes in
.\" .BR execve ()
.\" that could be exploited for denial of service by a suitably crafted
.\" ELF binary. There are no known problems with 2.0.34 or 2.2.15.
W Uniksie\ V6 lista argumentów wywołania \fBexec\fP() była kończona 0, podczas
gdy lista argumentów funkcji \fImain\fP była kończona \-1. Dlatego lista
argumentów przekazana do \fImain\fP nie mogła być bezpośrednio użyta w
wywołaniu \fBexec\fP(). Od Uniksa\ V7 obie te wartości są NULL.
.SH PRZYKŁAD
Następujący program jest zaprojektowany do wykonania przez drugi program
przedstawiony poniżej. Wyświetla swoje argumenty uruchomienia po jednym w
wierszu.

.in +4n
.nf
/* myecho.c */

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int j;

    for (j = 0; j < argc; j++)
        printf("argv[%d]: %s\en", j, argv[j]);

    exit(EXIT_SUCCESS);
}
.fi
.in

Tego programu można użyć do uruchomienia programu podanego w argumencie
linii poleceń:
.in +4n
.nf

/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "witaj", "świecie", NULL };
    char *newenviron[] = { NULL };

    if (argc != 2) {
        fprintf(stderr, "Użycie: %s <plik\-do\-uruchomienia>\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    newargv[0] = argv[1];

    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() wraca tylko w przypadku błędu */
    exit(EXIT_FAILURE);
}
.fi
.in

Możemy użyć drugiego programu do uruchomienia pierwszego:

.in +4n
.nf
$\fB cc myecho.c \-o myecho\fP
$\fB cc execve.c \-o execve\fP
$\fB ./execve ./myecho\fP
argv[0]: ./myecho
argv[1]: witaj
argv[2]: świecie
.fi
.in

Możemy także użyć tych programów do pokazania używania interpretera
skryptu. Aby to zrobić, tworzymy skrypt, którego "interpreterem"  jest nasz
program \fImyecho\fP:

.in +4n
.nf
$\fB cat > script.sh\fP
\fB#! ./myecho script\-arg\fP
\fB^D\fP
$\fB chmod +x script.sh\fP
.fi
.in

Następnie używamy naszego programu do wykonania skryptu:

.in +4n
.nf
$\fB ./execve ./script.sh\fP
argv[0]: ./myecho
argv[1]: script\-arg
argv[2]: ./script.sh
argv[3]: witaj
argv[4]: świecie
.fi
.in
.SH "ZOBACZ TAKŻE"
\fBchmod\fP(2), \fBfork\fP(2), \fBptrace\fP(2), \fBexecl\fP(3), \fBfexecve\fP(3),
\fBgetopt\fP(3), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7),
\fBld.so\fP(8)
.SH "O STRONIE"
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
\fIman\-pages\fP. Opis projektu, informacje dotyczące zgłaszania błędów, oraz
najnowszą wersję oryginału można znaleźć pod adresem
\%http://www.kernel.org/doc/man\-pages/.
.SH TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są:
Przemek Borys (PTM) <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>.
.PP
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją \fB 3.71 \fPoryginału.
