.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" and Copyright (c) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified by Michael Haardt .\" Modified 1993-07-21 by Rik Faith .\" Modified 1994-08-21 by Michael Chastain : .\" Modified 1997-01-31 by Eric S. Raymond .\" Modified 1999-11-12 by Urs Thuermann .\" Modified 2004-06-23 by Michael Kerrisk .\" 2006-09-04 Michael Kerrisk .\" Added list of process attributes that are not preserved on exec(). .\" 2007-09-14 Ollie Wild , mtk .\" Add text describing limits on command-line arguments + environment .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH execve 2 "3 mei 2023" "Linux man\-pagina's 6.05.01" .SH NAAM execve \- voer programma uit .SH BIBLIOTHEEK Standard C bibliotheek (\fIlibc\fP, \fI\-lc\fP) .SH SAMENVATTING .nf \fB#include \fP .PP \fBint execve(const char *\fP\fIpadnaam\fP\fB, char *const \fP\fIargv\fP\fB[],\fP \fB char *const _NULL_baar\fP\fIenvp\fP\fB[]);\fP .fi .SH BESCHRIJVING \fBexecve\fP() voert het programma uit waar \fIpadnaam\fP naar wijst. Dit zorgt er voor dat het programma dan momenteel wordt uitgevoerd door het aanroepende proces wordt vervangen door een nieuw programma, met een niet\-geïnitialiseerde stack, heap en (geïnitialiseerde en niet\-geïnitialiseerde) data segmenten. .PP \fIpadnaam\fP moet ofwel een binair uitvoerbaar bestand zijn, ofwel een script dat begint met een regel van de vorm: .PP .in +4n .EX \fB#!\fP\fIinterpreter\fP[optioneel\-arg] .EE .in .PP Voor details over het laatste geval, zie "Interpreter scripts" hieronder. .PP \fIargv\fP is een lijst van wijzers naar tekenreeksen die worden doorgegeven naar een nieuw programma als zijn commando\-regel argumenten. Per conventie zou de eerste van deze tekenreeksen (m.a.w. \fIargv[0]\fP) de bestandsnaam moeten zijn van het bestand dat uitgevoerd wordt. De \fIargv\fP lijst moet worden afgesloten met een NULL wijzer. (Daarom, zal in het nieuwe programma, \fIargv[argc]\fP NULL zijn.) .PP \fIenvp\fP is een lijst van wijzers naar tekenreeksen, bij conventie van de vorm \fBkey=value\fP, die worden doorgegeven als omgeving van een nieuw programma. De \fIenvp\fP lijst moet worden afgesloten met een NULL wijzer. .PP Deze handleiding beschrijft de Linux systeem aanroep in detail; voor een overzicht van de nomenclatuur en de vele, vaak te prefereren, gestandaardiseerde varianten van de functie voorzien in libc, inclusief die de \fBPATH\fP omgevingsvariabele doorzoeken, zie \fBexec\fP(3). .PP De argumenten vector en omgeving kunnen worden benaderd door de main\-functie van het nieuwe programma, mits deze is gedefinieerd als: .PP .in +4n .EX int main(int argc, char *argv[], char *envp[]) .EE .in .PP Let evenwel op dat het gebruik van het derde argument van de main\-functie niet gespecificeerd is in POSIX.1; volgens POSIX.1, zou de omgeving moeten worden benaderd via de externe variabele \fBenviron\fP(7). .PP Bij succes keert \fBexecve\fP() niet terug, en de text, geïnitialiseerde data, niet\-geinitialiseerde data (bss) en stack van het aanroepende proces worden overschreven volgens de inhoud van het nieuw geladen programma. .PP Als het huidige programma momenteel wordt ge\-ptrace´ed, dan wordt er een \fBSIGTRAP\fP signaal naar verstuurd na een succesvolle \fBexecve\fP() aanroep . .PP Als het set\-user\-ID bit is gezet op het programma bestand aangewezen door \fIpadnaam\fP, dan wordt het effectieve gebruiker ID van het aanroepende proces veranderd naar dat van de eigenaar van het programma bestand. Vergelijkbaar, is het set\-group\-ID bit is gezet op het programma bestand, dan wordt het effectieve group ID van het aanroepende proces gezet op de groep van het programma bestand. .PP De hiervoor genoemde transformaties van de effectieve ID worden \fIniet\fP uitgevoerd (m.a.w. de set\-user\-ID en set\-group\-ID bits worden genegeerd) als een van de volgende waar is: .IP \[bu] 3 het \fIno_new_privs\fP attribuut wordt gezet voor de aanroepende thread (zie \fBprctl\fP(2)); .IP \[bu] het onderliggende bestandssysteem is gekoppeld \fInosuid\fP (de \fBMS_NOSUID\fP vlag voor \fBmount\fP(2)); of .IP \[bu] het aanroepende proces wordt ge\-ptrace´d. .PP De capaciteiten van het programma bestand (zie \fBcapabilities\fP(7) worden ook genegeerd als enig van de bovenstaande waar is. .PP Het effectieve gebruiker ID van het proces wordt gekopieerd naar het bewaarde set\-user\-ID; vergelijkbaar, het effectieve groep ID wordt gekopieerd naar het bewaarde set\-group\-ID. Het kopiëren vindt plaats na effectieve ID veranderingen die optreden vanwege de set\-user\-ID en set\-group\-ID modus bits. .PP De echte UID en echte GID van het proces, zowel als zijn supplementaire groep ID´s blijven onveranderd door de aanroep van \fBexecve\fP(). .PP Als het uitvoerbaar bestand een a.out dynamisch gelinked binair uitvoerbaar bestand is dat ook shared\-library stompjes bevat, dan wordt de Linux dynamische linker \fBld.so\fP(8) aangeroepen na de aanvang van uitvoering, om zo de benodigde gedeelde objecten in het geheugen te laden en het uitvoerbaar bestand hiermee te linken. .PP .\" Als de executable een dynamisch gelinkte ELF executable is, dan wordt de interpreter genoemd in het PT_INTERP segment gebruikt om de benodigde gedeelde objecten te laden. Deze interpreter is typisch \fI/lib/ld\-linux.so.2\fP voor binaire bestanden gelinked met glibc (zie \fBld\-linux.so\fP(8)). .SS "Effect op proces attributen" Alle proces attributen blijven behouden tijdens een \fBexecve\fP(), behalve de volgende: .IP \[bu] 3 De disposities van elk signaal dat wordt gevangen wordt gereset naar het standaard (\fBsignal\fP(7)). .IP \[bu] Alle afwisselende signaal stacks blijven niet behouden (\fBsigaltstack\fP(2)). .IP \[bu] Geheugen indelingen blijven niet behouden (\fBmmap\fP(2)). .IP \[bu] Aangekoppelde System\ V gedeelde geheugen segmenten worden los gekoppeld (\fBshmat\fP(2)). .IP \[bu] POSIX gedeelde geheugen regionen worden vrijgegeven (\fBshm_open\fP(3)). .IP \[bu] Open POSIX berichtrij beschrijvingen worden gesloten (\fBmq_overview\fP(7)). .IP \[bu] Alle open POSIX genaamde semaforen worden gesloten (\fBsem_overview\fP(7)). .IP \[bu] POSIX timers blijven niet behouden (\fBtimer_create\fP(2)). .IP \[bu] Alle open map streams worden gesloten (\fBopendir\fP(3)). .IP \[bu] Geheugen sloten blijven niet behouden \fBmlock\fP(2), \fBmlockall\fP(2)). .IP \[bu] Beëindiging afhandelaren blijven niet behouden (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP \[bu] De drijvende\-komma omgeving wordt gereset naar de standaard (zie \fBfenv\fP(3)). .PP De proces attributen in de voorafgaande lijst zijn alle gespecificeerd in POSIX.1. De volgende Linux\-specifieke proces attributen blijven niet behouden tijdens een \fBexecve\fP(): .IP \[bu] 3 Het "dumpable" attribuut van het proces is gezet op de waarde 1, behalve als een set\-user\-ID programma, of een programma met capaciteiten wordt uitgevoerd, in welk geval de "dumpable" vlag mag worden gereset op de waarde in \fI/proc/sys/fs/suid_dumpable\fP, in de omstandigheden zoals beschreven in \fBPR_SET_DUMPABLE\fP in \fBprctl\fP(2). Merk op dat veranderingen in het ¨dumpable" attribuut ervoor kunnen zorgen dat het eigenaarschap van de bestanden in de \fI/proc/\fPpid map van het proces kunnen worden veranderd naar \fIroot:root\fP, zoals beschreven in \fBproc\fP(5). .IP \[bu] De \fBprctl\fP(2) \fBPR_SET_KEEPCAPS\fP vlag wordt gewist. .IP \[bu] (Vanaf Linux 2.4.36 / 2.6.23) Als een set\-user\-ID of set\-user\-ID programma wordt uitgevoerd, dan wordt het dood signaal van de ouder, gezet door de \fBprctl\fP(2) \fBPR_SET_PDEATHSIG\fP vlag, gewist. .IP \[bu] De proces naam, zoals gezet door \fBprctl\fP(2) \fBPR_SET_NAME\fP (en getoond door \fIps\ \-o comm\fP), wordt gereset naar de naam van het nieuwe uitvoerbare bestand. .IP \[bu] De \fBSECBIT_KEEP_CAPS\fP \fIsecurebits\fP vlag wordt gewist. Zie \fBcapabilities\fP(7). .IP \[bu] Het beëindiging signaal wordt gereset naar \fBSIGCHLD\fP (zie \fBclone\fP(2)). .IP \[bu] De bestandsindicator tabel is niet meer gedeeld, daarbij het effect van de \fBCLONE_FILES\fP vlag van \fBclone\fP(2) ongedaan makend. .PP Let op de volgende punten: .IP \[bu] 3 Alle thread anders dan de aanroepende thread worden vernietigd tijdens een \fBexecve\fP(). Mutexes, conditie variabelen, en andere pthreads objecten blijven niet behouden. .IP \[bu] Het equivalent van \fIsetlocale(LC_ALL, "C")\fP wordt uitgevoerd bij de start van een programma. .IP \[bu] POSIX.1 specificeert dat de disposities van enig signaal dat wordt genegeerd of gezet op de standaard onveranderd zullen blijven. POSIX.1 specificeer een uitzondering: als \fBSIGCHLD\fP wordt genegeerd, dan mag de implementatie deze dispositie onveranderd laten of deze op de standaard zetten; Linux doet het eerste. .IP \[bu] Alle uitstaande asynchrone Invoer/Uitvoer operaties worden beëindigd (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP \[bu] Voor de behandeling van capaciteiten tijdens \fBexecve\fP(), zie \fBcapabilities\fP(7). .IP \[bu] .\" 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 Standaard blijven bestandsindicatoren open langs een \fBexecve\fP(). Bestandsindicatoren die zijn gemarkeerd als close\-on\-exec worden gesloten; die de beschrijving van \fBFD_CLOEXEC\fP in \fBfcntl\fP(2). (Als een bestandsindicator wordt gesloten, dan zal dit de vrijgave van alle locks op het onderliggende bestand door dit proces veroorzaken. Zie \fBfcntl\fP(2) voor details.) POSIX.1 zegt dat als de bestandsindicatoren 0, 1 en 2 ook zouden worden gesloten na een succesvolle \fBexecve\fP(), en het proces zou privileges verkrijgen omdat het set\-user\-ID of set\-group\-ID bit werd gezet om het uitgevoerde bestand, dan mag het systeem een niet gespecificeerd bestand voor elk van deze bestandsindicatoren openen. Als een algemeen principe kan een niet\-overdraagbaar programma, al dan niet geprivilegieerd, aannemen dat deze drie bestandsindicatoren gesloten blijven langs een \fBexecve\fP(). .SS "Interpreter scripts" Een interpreter script is een tekst bestand met de uitvoer permissie aan gezet en wiens eerste regel van de vorm is: .PP .in +4n .EX \fB#!\fP\fIinterpreter\fP[optioneel\-arg] .EE .in .PP De \fIinterpreter\fP moet een geldige padnaam voor een uitvoerbaar bestand zijn. .PP Als het \fIpadnaam\fP argument van \fBexecve\fP() een interpreter script specificeert dan zal de \fIinterpreter\fP worden aangeroepen met de volgende argumenten: .PP .in +4n .EX \fIinterpreter\fP [optional\-arg] \fIpadnaam\fP arg... .EE .in .PP .\" See the P - preserve-argv[0] option. .\" Documentation/admin-guide/binfmt-misc.rst .\" https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html waar \fIpadnaam\fP de padnaam van het bestand dat als eerste argument werd gespecificeerd van \fBexecve\fP(), en \fIarg...\fP is een serie woorden aangewezen door het \fIargv\fP argument van \fBexecve\fP() beginnende bij \fIargv[1]\fP. Merk op dat er geen manier is om \fIargv[0]\fP te verkrijgen die doorgegeven werd naar de \fBexecve\fP() aanroep. .PP Voor overdraagbaar gebruik, zou \fIoptional\-arg\fP afwezig moeten zijn of moeten worden gespecificeerd als een enkel woord (m.a.w. het zou geen witruimtes moeten bevatten); zie OPMERKINGEN hieronder. .PP .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 Vanaf Linux 2.6.28 staat de kernel toe dat de interpreter van een script, zelf een script is. Dit recht is recursief, tot aan een limiet van vier recursies, zodat de interpreter een script mag zijn dat wordt geïnterpreteerd door een script, en zo voorts. .SS "Limieten op de grootte van argumenten en omgeving" De meeste UNIX implementaties stellen een limiet aan de totale lengte van het argument op de commando regel (\fIargv\fP) en de omgevings (\fIenvp\fP) tekenreeksen die mogen worden doorgegeven aan een nieuw programma. POSIX.1 staat een implementatie toe deze limiet te adverteren gebruikmakend van de \fBARG_MAX\fP constante (ofwel gedefinieerd in \fI\fP ofwel beschikbaar tijdens de uitvoering door gebruik te maken van de aanroep \fIsysconf(_SC_ARG_MAX)\fP). .PP Voor Linux 2.6.23, was het geheugen dat gebruikt wordt om de omgeving en de argument tekenreeksen op te slaan beperkt tot 32 pagina´s (gedefinieerd in de kernel constante \fBMAX_ARG_PAGES\fP). Bij architecturen met een 4\-kB pagina grootte, dit geeft een maximum grootte van 128\ kB. .PP .\" For some background on the changes to ARG_MAX in Linux 2.6.23 and .\" Linux 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 Linux 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). Op Linux 2.6.23 en later, ondersteunen de meeste architecturen een grootte limiet afgeleid van de zachte \fBRLIMIT_STACK\fP hulpbron limiet (zie \fBgetrlimit\fP(2)) die geldig is te tijde van de \fBexecve\fP() aanroep. (Architecturen zonder geheugen management unit zijn uitgezonderd: deze behouden de limiet die geldig was voor Linux 2.6.23.) Deze verandering staat programma´s toe een veel grotere argument en/of omgevings lijst te hebben. Voor deze architecturen, is de totale grootte beperkt tot 1/4 van de toegestane stack grootte. (Het opleggen van de 1/4\-limiet verzekert dat een nieuw programma altijd enige stack ruimte heeft.) Daarenboven is de totale grootte beperkt tot 3/4 van de waarde van de constante \fB_STK_LIM\fP (8 MiB). Vanaf Linux 2.6.25, zet de kernel een ondergrens van 32 pagina´s o deze grootte limiet, zodat zelfs, wanneer \fBRLIMIT_STACK\fP erg laag is gezet, applicaties worden gegarandeerd dat ze op zijn minst evenveel argument en omgevingsruimte hebben zoals voorzien door Linux 2.6.22 en eerder. (Deze garantie werd niet voorzien in Linux 2.6.23 en 2.6.24.) Aanvullend: de limiet per tekenreeks is 32 pagina´s (de kernel constante \fBMAX_ARG_STRLEN\fP), en het maximum aantal tekenreeksen is 0x7FFFFFFF. .SH "EIND WAARDE" Bij succes keert \fBexecve\fP() niet terug, bij falen wordt \-1 teruggegeven, en wordt \fIerrno\fP overeenkomstig gezet. .SH FOUTEN .TP \fBE2BIG\fP Het totaal aantal bytes in de omgeving (\fIenvp\fP) en de argumenten lijst (\fIargv\fP) is te groot. .TP \fBEACCES\fP Zoek recht wordt geweigerd op een component van het pad voorvoegsel van \fIpadnaam\fP of de naam van een script interpreter. Zie ook \fBpath_resolution\fP(7).) .TP \fBEACCES\fP Het bestand of de script interpreter is geen normaal bestand. .TP \fBEACCES\fP Uitvoer toestemming werd geweigerd voor het bestand of een script of ELF interpreter. .TP \fBEACCES\fP Het bestandsysteem is gemount met \fInoexec\fP. .TP \fBEAGAIN\fP (sinds Linux 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c Ondanks dat de echte UID van de aanroeper is verandert door een van de \fBset*uid\fP() aanroepen, was en \[em] is nog steeds\[em] de aanroeper nog steeds boven zijn \fBRLIMIT_NPROC\fP resource limiet (zie \fBsetrlimit\fP(2)). Voor een gedetailleerde verklaring van deze fout, zie OPMERKINGEN. .TP \fBEFAULT\fP \fIpadnaam\fP of een van de wijzers in de vectoren \fIargv\fP of \fIenvp\fP wijst buiten door de, voor u, toegankelijke adres ruimte. .TP \fBEINVAL\fP Een ELF uitvoerbaar bestand heeft meer dan 1 PT_INTERP segment (probeerde meer dan 1 interpreter te benoemen). .TP \fBEIO\fP Een Invoer/Uitvoer fout trad op. .TP \fBEISDIR\fP Een ELF interpreter was een map. .TP \fBELIBBAD\fP Een ELF interpreter had een onbekende vorm. .TP \fBELOOP\fP Teveel symbolische koppelingen werden tegengekomen bij het "oplossen" van \fIpadnaam\fP of de naam van een script of ELF interpreter. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 De maximale recursie limiet werd bereikt door uitvoeren van de recursieve script interpreter (zie "Interpreter scripts", hierboven) Voor Linux 3.8 werd de fout \fBENOEXEC\fP geproduceerd voor dit geval. .TP \fBEMFILE\fP De per\-proces limiet van het aantal open bestandsbeschrijvingen werd bereikt. .TP \fBENAMETOOLONG\fP \fIpadnaam\fP is te lang. .TP \fBENFILE\fP De grens aan het aantal open bestanden van het systeem is bereikt. .TP \fBENOENT\fP Het bestand \fIpadnaam\fP of een script of een ELF interpreter bestaat niet. .TP \fBENOEXEC\fP Een uitvoerbaar bestand is niet in een bekende vorm: het is voor de verkeerde architectuur, of heeft een of andere vormfout waardoor het niet kan worden uitgevoerd. .TP \fBENOMEM\fP Onvoldoende kernelgeheugen voorhanden. .TP \fBENOTDIR\fP Een deel van het pad\-voorvoegsel van \fIpadnaam\fP of van een script of ELF interpreter is geen map. .TP \fBEPERM\fP Het bestandssysteem was gekoppeld met \fInosuid\fP, de gebruiker is niet de supergebruiker, en het bestand heeft het set\-user\-ID of set\-group\-ID bit aan staan. .TP \fBEPERM\fP Het proces wordt gevolgd, de gebruiker is niet de supergebruiker en het bestand heeft een set\-user\-ID of set\-group\-ID bit aan staan. .TP \fBEPERM\fP Een "domme\-capaciteiten" toepassing zou niet de volledige verzameling van toegestane capaciteiten die door het uitvoerbaar bestand zijn toegekend kunnen verkrijgen. Zie \fBcapaciteiten\fP(7). .TP \fBETXTBSY\fP Uitvoerbaar bestand is open voor schrijven bij een of meer processen. .SH VERSIES POSIX documenteert het #! gedrag niet, maar het bestaat (met enige variaties) op andere UNIX systems. .PP .\" 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). .\" Op Linux kunnen \fIargv\fP en \fIenvp\fP worden opgegeven als NULL. In beide gevallen heeft dat hetzelfde effect als het opgeven van het argument als een wijzer naar een lijst die een enkele NULL wijzer bevat. \fBMaak geen gebruik van dit niet\-standaard en neit\-overdraagbaar gedrag\fP. Op veel andere Linux systemen zal het opgeven van \fIargv\fP als NULL resulteren in een fout (\fBEFAULT\fP). \fISommige\fP andere Linux systemen behandelen het \fIenvp==NULL\fP geval hetzelfde als Linux. .PP .\" POSIX.1 zegt dat waarden zoals teruggeven worden door \fBsysconf\fP(3) niet mogen veranderen gedurende de levensduur van een proces. Hoewel vanaf Linux 2.6.23 de door \fB_SC_ARG_MAX\fP gerapporteerde waarde zal veranderen zodra de \fBRLIMIT_STACK\fP resource limiet veranderd. Dit om het feit aan te geve dan de limiet op de ruimte die de argumenten en de omgevingsvariabelen op commando regel in beslag nemen werd veranderd. .SS "Interpreter scripts" .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 De kernel beperkt de maximale lengte van de tekst die volgt op de "#!" lettertekens aan het begin van een script; lettertekens voorbij deze limiet worden genegeerd. Voor Linux 5.1 bedroeg deze limiet 127 tekens. Vanaf Linux 5.1 bedraagt de limiet 255 tekens. .PP .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward De semantiek van het \fIoptional\-arg\fP argument van een interpreter script varieert per implementatie. Op Linux wordt de volledige tekenreeks die volgt op de \fIinterpreter\fP naam doorgegeven als één enkel argument aan de interpreter, en mag deze tekenreeks witte spaties bevatten. Hoewel dit gedrag verschilt op enkelen andere systemen. Sommige systemen gebruiken de eerste witte spatie om \fIoptional\-arg\fP te beëindigen. Op sommige systemen kan een interpeter\-script meerdere argumenten hebben, en kunnen witte spaties in \fIoptional\-arg\fP worden gebruikt om argumenten te onderscheiden. .PP Linux (net als andere moderne UNIX systemen) negeert de set\-user\-ID en set\-group\-ID bits bij scripts. .SH "VOLDOET AAN" POSIX.1\-2008. .SH GESCHIEDENIS .\" 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. POSIX.1\-2001, SVr4, 4.3BSD. .PP Met UNIX\ V6, eindigde de argumenten lijst van een \fBexec\fP() aanroep op 0, terwijl de argumenten lijst van \fImain\fP eindigde op \-1. Daarom was deze argumenten lijst niet meteen bruikbaar in een volgende \fBexec\fP() aanroep. Vanaf UNIX\ V7, zijn beiden NULL. .SH OPMERKINGEN Soms ziet men \fBexecve\fP() (en de gerelateerde functies beschreven in in \fBexec\fP(3)) beschreven als "uitvoeren van een \fInieuw\fP proces" (of vergelijkbaar). Dit is een hoogst misleidende beschrijving: er is geen nieuw proces; veel attributen van het aanroepende proces blijven onveranderd (in het bijzonder, zijn PID). Het enige dat \fBexecve\fP() doet is het regelen dat een bestand proces (het aanroepende proces) een nieuw program kan uitvoeren. .PP Set\-user\-ID en set\-group\-ID processen kunnen niet \fBptrace\fP(2)d zijn. .PP Het resultaat van het aankoppelen van een bestandssysteem \fInosuid\fP varieert van Linux kernel versies: sommigen weigeren het uitvoeren van set\-user\-ID en set\-group\-ID uitvoerbare bestanden als dat zou betekenen dat de gebruiker rechten zou krijgen die hij eerder niet had (en \fBEPERM\fP retourneren), sommige zullen de set\-user\-ID en set\-group\-ID bits negeren en \fBexec\fP() succesvol uitvoeren, .PP .\" commit 19d860a140beac48a1377f179e693abe86a9dac9 In de meeste gevallen waar \fBexecve\fP() faalt, wordt controle naar de originele uitvoerbare afbeelding teruggegeven, en kan de aanroeper van \fBexecve\fP() de foutmelding afhandelen. Hoewel, in (zeldzame) gevallen (typisch veroorzaakt door uitputting van hulpbronnen) kan een fout optreden voorbij het punt waarbij terugkeer niet mogelijk is: de oorspronkelijk uitvoerbare afbeelding is al afgebroken, maar de nieuwe nog niet compleet gebouwd. In deze gevallen, stopt de kernel het proces met een \fBSIGSEGV\fP (\fBSIGKILL\fP tot Linux 3.17) signaal. .SS "execve() en EAGAIN" Een meer gedetailleerde uitleg van de \fBEAGAIN\fP fout die kan optreden (vanaf Linux 3.1) bij het aanroepen van \fBexecve\fP() is als volgt. .PP .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 De \fBEAGAIN\fP fout kan optreden wanneer een \fIvoorafgaande\fP aanroep van \fBsetuid\fP(2), \fBsetreuid\fP(2), of \fBsetresuid\fP(2) ervoor zorgde dat het echte user ID van het proces veranderde, en dat deze verandering er voor zorgde dat het proces zijn \fBRLIMIT_NPROC\fP hulpbron limiet overschreed (m.a.w. het aantal processen behorende bij de nieuwe echte UID overschreed de hulpbron limiet). Van Linux 2.6.0 tot 3.0 zorgde dit voor het falen van de \fBset* uid\fP() aanroep. (Voor 2.6, werd deze resource limiet niet opgelegd op processen die hun user ID´s veranderden.) .PP Vanaf Linux 3.1 veroorzaakt het zojuist beschreven scenario het falen van de \fBset*uid\fP() aanroep niet langer, omdat het te vaak leidde tot veiligheids gaten waar foutieve applicaties niet de teruggeven status controleerden en aannamen dat\[em]als de aanroeper systeembeheerder rechten had\[em]de aanroep altijd zou slagen. In plaats daarvan verandert de \fBset*uid\fP() aanroep nu succesvol de echte UID maar zet de kernel een interne vlag, \fBPF_NPROC_EXCEEDED\fP genaamd, op aan te geven dat de limiet van de \fBRLIMIT_NPROC\fP hulpbron overschreden werd. Als de \fBPF_NPROC_EXCEEDED\fP vlag werd gezet en de hulpbron limiet is nog steeds overschreden op het tijdstip van een volgende \fBexecve\fP() aanroep, dan zal deze aanroep falen met de fout \fBEAGAIN\fP. Deze kernel logica verzekert dat de \fBRLIMIT_NPROC\fP hulpbron limiet afgedwongen blijft voor de gewoonlijke geprivilegieerde workflow\[en] namelijk \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP(). .PP .\" .\" .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 Linux 2.0.34 or Linux 2.2.15. Indien de hulpbron limiet nog niet overschreden was ten tijde van de \fBexecve\fP() aanroep (omdat andere processen behorende bij dit echte UID werden beëindigd tussen de \fBset*uid\fP() aanroep en de \fBexecve\fP() aanroep), dan is de \fBexecve\fP() aanroep succesvol en wist de kernel de \fBPF_NPROC_EXCEEDED\fP proces vlag. Deze vlag wordt ook gewist als een volgende aanroep van \fBfork\fP(2) door dit proces succesvol is. .SH VOORBEELDEN Het volgende programma is ontworpen om te worden uitgevoerd door het tweede programma daaronder. Het echo´d de commando\-regel argumenten, een per regel. .PP .in +4n .\" SRC BEGIN (myecho.c) .EX /* myecho.c */ \& #include #include \& int main(int argc, char *argv[]) { for (size_t j = 0; j < argc; j++) printf("argv[%zu]: %s\en", j, argv[j]); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .in .PP Dit programma kan worden gebruikt om het op de commando regel genoemde programma uit te voeren: .PP .in +4n .\" SRC BEGIN (execve.c) .EX /* execve.c */ \& #include #include #include \& int main(int argc, char *argv[]) { static char *newargv[] = { NULL, "hello", "world", NULL }; static char *newenviron[] = { NULL }; \& if (argc != 2) { fprintf(stderr, "Usage: %s \en", argv[0]); exit(EXIT_FAILURE); } \& newargv[0] = argv[1]; \& execve(argv[1], newargv, newenviron); perror("execve"); /* execve() stopt alleen bij een fout */ exit(EXIT_FAILURE); } .EE .\" SRC END .in .PP We kunnen het tweede programma om het eerste, als volgt, uit te voeren .PP .in +4n .EX $\fB cc myecho.c \-o myecho\fP $\fB cc execve.c \-o execve\fP $\fB ./execve ./myecho\fP argv[0]: ./myecho argv[1]: hello argv[2]: world .EE .in .PP We kunnen deze programma´s ook gebruiken om het gebruik van ee script interpreter te demonstreren. Om dit te doen creëren wij een script wiens "interpreter' on \fImyecho\fP programma is: .PP .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB\[ha]D\fP $\fB chmod +x script\fP .EE .in .PP We kunnen nu ons programma gebruiken om het script uit te voeren: .PP .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: hello argv[4]: world .EE .in .SH "ZIE OOK" \fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2), \fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetauxval\fP(3), \fBgetopt\fP(3), \fBsystem\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7), \fBld.so\fP(8) .PP .SH VERTALING De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema , Mario Blättermann en Luc Castermans . .PP Deze vertaling is vrije documentatie; lees de .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID. .PP Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar .MT debian-l10n-dutch@lists.debian.org .ME .