50 votes

Existe-t-il un moyen de marquer un bloc de mémoire alloué en lecture seule?

si j'alloue de la mémoire à l'aide de malloc() est-il un moyen de le marquer en lecture seule. Afin de memcpy() échoue si quelqu'un essaie de lui écrire?

Ceci est lié à un défaut de conception d'api où les utilisateurs sont de miss-à l'aide d'un const pointeur retourné par une méthode GetValue() qui fait partie de la grande structure de mémoire. Puisque nous voulons éviter de copier de gros morceau de la mémoire, nous retourner vivre pointeur à l'intérieur d'un structurés de la mémoire qui est d'un format spécifique. Maintenant le problème est que certains de l'utilisateur de trouver hack pour y arriver des trucs de travail par l'écriture de ce mémoire directement et éviter SetValue() appel qui ne l'allocation et bien remise en mémoire format binaire que nous avons développé. Bien qu'il n'y hack parfois le travail, mais parfois il provoque la violation d'accès mémoire due à une mauvaise interprétation des indicateurs de contrôle qui a été remplacé par l'utilisateur.

Éduquer l'utilisateur est une tâche mais disons que pour l'instant, nous voulons qu'il n'y code à l'échec.

Je me demandais simplement si l'on peut simplement se protéger contre ce cas.

Par analogie supposer que quelqu'un d'obtenir une colonne blob d'instruction sqlite et puis écrire de nouveau à elle. Bien que dans le cas de sqlite, il ne fera pas de sens, mais ce peu happing dans notre cas.

63voto

NPE Points 169956

Sur la plupart des architectures matérielles, vous pouvez uniquement modifier les attributs de protection sur l'ensemble des pages de mémoire; vous ne pouvez pas marquer un fragment d'une page en lecture seule.

Pertinentes de l'Api sont:

Vous devez vous assurer que la page de mémoire ne contient pas quelque chose que vous ne voulez pas faire en lecture seule. Pour ce faire, vous devrez vous de overallocate avec malloc(), ou l'utilisation d'une répartition différente de l'API, comme mmap(), posix_memalign() ou VirtualAlloc().

37voto

Nikos C. Points 18676

Dépend de la plate-forme. Sur Linux, vous pouvez utiliser mprotect() (http://linux.die.net/man/2/mprotect).

Sur Windows, vous pouvez essayer VirtualProtect() (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs. 85).aspx). Je n'ai jamais utilisé.

Edit: Ce n'est pas un doublon de NPE réponse. NPE avait à l'origine une réponse différente; il a été édité à plus tard et mprotect() et VirtualProtect() ont été ajoutées.

5voto

Raedwald Points 8862

un défaut de conception d'api où les utilisateurs sont de miss-à l'aide d'un const pointeur retourné par la méthode GetValue (), qui fait partie de la grande structure de mémoire. Puisque nous voulons éviter de copier de gros morceau de la mémoire, nous retourner vivre pointeur à l'intérieur d'un structurés de la mémoire qui est d'un format spécifique

Qui n'est pas clairement un défaut de conception d'API. Une API est un contrat: vous promettons que votre classe se comportent d'une manière particulière, les clients de la classe promesse de l'utilisation de l'API de manière appropriée. Sale des astuces comme const_cast sont mauvais (et dans certains cas mais pas tous, ont un comportement indéterminé).

Il serait défectueux conception d'API si vous utilisez const_cast d'entraîner un problème de sécurité. Dans ce cas, vous devez copier la partie de la mémoire, ou la refonte de l'API. C'est la norme en Java, qui n'ont pas l'équivalent d' const (malgré const être un mot réservé en Java).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X