.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2007 Michael Kerrisk .\" and Copyright (C) 1995 Michael Shields . .\" .\" %%%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 author of this work. .\" %%%LICENSE_END .\" .\" Modified 1996-10-22 by Eric S. Raymond .\" Modified 1997-05-31 by Andries Brouwer .\" Modified 2003-08-24 by Andries Brouwer .\" Modified 2004-08-16 by Andi Kleen .\" 2007-06-02, mtk: Fairly substantial rewrites and additions, and .\" a much improved example program. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MPROTECT 2 "2 août 2019" Linux "Manuel du programmeur Linux" .SH NOM mprotect, pkey_mprotect \- Définir la protection d'une partie de la mémoire .SH SYNOPSIS .nf \fB#include \fP .PP \fBint mprotect(void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB, int \fP\fIprot\fP\fB);\fP \fB#define _GNU_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP .PP \fBint pkey_mprotect(void *\fP\fIaddr\fP\fB, size_t \fP\fIlen\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIpkey\fP\fB);\fP .fi .SH DESCRIPTION \fBmprotect\fP() change les protections d'accès pour la (les) page(s) de mémoire du processus appelant contenant tout ou une partie de l'intervalle [\fIaddr\fP,\ \fIaddr\fP+\fIlen\fP\-1]. \fIaddr\fP doit être aligné sur une limite de page. .PP Si le processus appelant essaie d'accéder à la mémoire en violant la protection, le noyau génère un signal \fBSIGSEGV\fP pour ce processus. .PP \fIprot\fP est une combinaison des attributs d'accès suivants\ : \fBPROT_NONE\fP ou le résultat d’une opération OU bit à bit parmi les autres valeurs de la liste suivante\ : .TP 1.1i \fBPROT_NONE\fP On ne peut pas accéder du tout à la zone de mémoire. .TP \fBPROT_READ\fP On peut lire la zone de mémoire. .TP \fBPROT_WRITE\fP On peut modifier la zone de mémoire. .TP \fBPROT_EXEC\fP La zone de mémoire peut contenir du code exécutable. .TP \fBPROT_SEM\fP (depuis Linux 2.5.7) La mémoire peut être utilisée pour des opérations atomiques. Cet attribut a été introduit dans l'implémentation de \fBfutex\fP(2) (afin de garantir la possibilité d'effectuer des opérations atomiques exigées par des commandes comme \fBFUTEX_WAIT\fP), mais il n'est actuellement utilisé sur aucune architecture. .TP \fBPROT_SAO\fP (depuis Linux 2.6.26) .\" commit aba46c5027cb59d98052231b36efcbbde9c77a1d .\" commit ef3d3246a0d06be622867d21af25f997aeeb105f La mémoire devrait avoir une forte organisation de son accès. Cette fonctionnalité est spécifique à l'architecture PowerPC (la version 2.06 de la spécification de l'architecture ajoute la fonction SAO du processeur, disponible par exemple sur POWER 7 ou PowerPC A2). .PP En outre (depuis Linux 2.6.0), il est possible de positionner les attributs suivants sur \fIprot\fP\ : .TP 1.1i .\" mm/mmap.c: .\" vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) | .\" mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; .\" And calc_vm_flag_bits converts only GROWSDOWN/DENYWRITE/LOCKED. \fBPROT_GROWSUP\fP .\" The VMA is one that was marked with VM_GROWSUP by the kernel .\" when the stack was created. Note that (unlike VM_GROWSDOWN), .\" there is no mmap() flag (analogous to MAP_GROWSDOWN) for .\" creating a VMA that is marked VM_GROWSUP. Appliquer le mode de protection jusqu'à la fin d'une projection qui grandit vers le haut (de telles projections sont créées pour la zone de la pile sur une architecture —\ par exemple HP\-PARISC\ — dont la pile a tendance à s'accroître vers le haut). .TP \fBPROT_GROWSDOWN\fP Appliquer le mode de protection vers le bas jusqu'au début d'une projection qui grandit vers le bas (il pourrait s'agir d'un segment de pile ou d'un segment projeté avec un drapeau \fBMAP_GROWSDOWN\fP positionné). .PP Comme \fBmprotect\fP(), \fBpkey_mprotect\fP() modifie la protection des pages indiquées par \fIaddr\fP et \fIlen\fP. Le paramètre \fIpkey\fP indique la clé de protection (voir \fBpkeys\fP(7))) à assigner à la mémoire. La clé de protection doit être allouée avec \fBpkey_alloc\fP(2) avant d'être passée à \fBpkey_mprotect\fP(). Pour un exemple d'utilisation de cet appel système, voir \fBpkeys\fP(7). .SH "VALEUR RENVOYÉE" \fBmprotect\fP() et \fBpkey_mprotect\fP() renvoient \fB0\fP s'ils réussissent. En cas d'erreur, ces appels système renvoient \fB\-1\fP et \fIerrno\fP est positionné adéquatement. .SH ERREURS .TP \fBEACCES\fP L'accès spécifié n'est pas possible sur ce type de mémoire. Cela se produit par exemple si vous utilisez \fBmmap\fP(2) pour représenter un fichier en lecture seule en mémoire, et puis demandez de marquer cette zone avec \fBPROT_WRITE\fP. .TP \fBEINVAL\fP \fIaddr\fP n'est pas un pointeur valable, ou ce n'est pas un multiple de la taille de page du système. .TP \fBEINVAL\fP (\fBpkey_mprotect\fP()) \fIpkey\fP n'a pas été alloué avec \fBpkey_alloc\fP(2) .TP \fBEINVAL\fP \fBPROT_GROWSUP\fP et \fBPROT_GROWSDOWN\fP étaient indiqués tous les deux dans \fIprot\fP. .TP \fBEINVAL\fP Drapeaux non valables indiqués dans \fIprot\fP. .TP \fBEINVAL\fP (Architecture PowerPC) \fBPROT_SAO\fP était indiqué dans \fIprot\fP, mais la fonctionnalité matérielle SAO n'est pas disponible. .TP \fBENOMEM\fP Impossible d'allouer des structures internes au noyau. .TP \fBENOMEM\fP Les adresses dans l'intervalle [\fIaddr\fP, \fIaddr\fP+\fIlen\fP\-1] ne sont pas valables dans l'espace d'adressage du processus, ou l'intervalle s'étend sur des pages non projetées (dans les noyaux antérieurs à 2.4.19, l'erreur \fBEFAULT\fP était produite à tort dans ce cas). .TP \fBENOMEM\fP .\" I.e., the number of VMAs would exceed the 64 kB maximum La modification de la protection d'une zone de la mémoire ferait dépasser le nombre maximal autorisé de projections avec des attributs différents (comme la protection en lecture vs lecture/écriture) (par exemple, positionner une protection d'une plage \fBPROT_READ\fP au milieu d'une zone protégée par \fBPROT_READ|PROT_WRITE\fP donnerait trois projections\ : deux en lecture/écriture aux extrémités et une en lecture seule au milieu). .SH VERSIONS \fBpkey_mprotect\fP() est apparu dans Linux 4.9\ ; la bibliothèque glibc le gère depuis la version 2.27. .SH CONFORMITÉ .\" SVr4 defines an additional error .\" code EAGAIN. The SVr4 error conditions don't map neatly onto Linux's. \fBmprotect\fP()\ : POSIX.1\-2001, POSIX.1\-2008, SVr4. POSIX indique que le comportement de \fBmprotect\fP() n'est pas spécifié s'il s'applique à une zone de mémoire non obtenue à l'aide de \fBmmap\fP(2). .PP \fBpkey_mprotect\fP() est une extension Linux non portable. .SH NOTES Sous Linux, il est toujours autorisé d'appeler \fBmprotect\fP() sur une adresse de l'espace d'adressage du processus (excepté pour la zone vsyscall du noyau). En particulier, il peut être utilisé pour rendre une projection de code existante accessible en écriture. .PP La différence entre \fBPROT_EXEC\fP et \fBPROT_READ\fP dépend de l'architecture, de la version du noyau et de l'état du processus. Sur certaines, si \fBREAD_IMPLIES_EXEC\fP est positionné dans les drapeaux de la personnalité d'un processus (voir \fBpersonality\fP(2)), le fait d'indiquer \fBPROT_READ\fP ajoutera implicitement \fBPROT_EXEC\fP. .PP Sur certaines architectures matérielles (comme i386), \fBPROT_WRITE\fP implique \fBPROT_READ\fP. .PP POSIX.1 indique qu'une implémentation peut autoriser un accès autre que celui donné dans \fIprot\fP, mais doit au minimum autoriser l'accès en écriture si \fBPROT_WRITE\fP était passé, et ne doit autoriser aucun accès si \fBPROT_NONE\fP était passé. .PP Les applications devraient faire attention quand elles mélangent l'utilisation de \fBmprotect\fP() et de \fBpkey_mprotect\fP(). Sur x86, quand \fBmprotect\fP() est utilisé avec \fIprot\fP positionné sur \fBPROT_EXEC\fP, une pkey peut être allouée et positionnée implicitement sur la mémoire par le noyau, mais uniquement quand la pkey était de \fB0\fP précédemment. .PP Sur les systèmes qui ne gèrent pas les clés de protection dans le matériel, \fBpkey_mprotect\fP() peut toujours être utilisé, mais \fIpkey\fP doit être positionné sur \fB\-1\fP. Si elle est appelée ainsi, l'opération \fBpkey_mprotect\fP() est équivalente à \fBmprotect\fP(). .SH EXEMPLE .\" sigaction.2 refers to this example .PP Le programme ci\-dessous montre l'utilisation de \fBmprotect\fP(). Il alloue quatre pages de mémoire, rend la troisième accessible en lecture seule, puis exécute une boucle qui se déplace en avançant dans la région allouée et en modifiant son contenu. .PP Voici un exemple d'exécution de ce programme\ : .PP .in +4n .EX $\fB ./a.out\fP Début de la région\ : 0x804c000 Reçu SIGSEGV à l'adresse\ : 0x804e000 .EE .in .SS "Source du programme" \& .EX #include #include #include #include #include #include #include #define handle_error(msg) \e do { perror(msg); exit(EXIT_FAILURE); } while (0) static char *buffer; static void handler(int sig, siginfo_t *si, void *unused) { /* Remarque\ : appeler printf() à partir d'un gestionnaire de signal n'est pas sûr (vous ne devriez pas le faire dans des programmes en production) car printf() n'est pas async\-signal\-safe\ ; voir signal\-safety(7). Cependant, nous utilisons printf() ici comme façon simple de montrer que le gestionnaire a été appelé. */ printf("Reçu SIGSEGV à l'adresse\ : 0x%lx\en", (long) si\->si_addr); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { char *p; int pagesize; struct sigaction sa; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sa.sa_sigaction = handler; if (sigaction(SIGSEGV, &sa, NULL) == \-1) handle_error("sigaction"); pagesize = sysconf(_SC_PAGE_SIZE); if (pagesize == \-1) handle_error("sysconf"); /* Allouer un tampon aligné sur une limite de page ; la protection initiale est PROT_READ | PROT_WRITE */ buffer = memalign(pagesize, 4 * pagesize); if (buffer == NULL) handle_error("memalign"); printf("Début de la région\ : 0x%lx\en", (long) buffer); if (mprotect(buffer + pagesize * 2, pagesize, PROT_READ) == \-1) handle_error("mprotect"); for (p = buffer ; ; ) *(p++) = \(aqa\(aq; printf("Boucle terminée\en"); /* Ne devrait jamais arriver */ exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" \fBmmap\fP(2), \fBsysconf\fP(3), \fBpkeys\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.04 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .