Bien que
tempnam()
génère des noms qui soient dificiles à deviner,
il est néanmoins possible qu'entre le moment où
tempnam()
renvoie le nom du chemin et le moment où le programme l'ouvre,
un autre programme a pu créer ce même nom de chemin avec
open(2),
ou l'avoir créer sous forme de lien symbolique.
Cela peut conduire à des trous de sécurité.
Pour éviter de telles possibilités, utilisez l'attribut
O_EXCL
de
open(2)
pour ouvrir le nom du chemin.
Ou encore mieux, utilisez
mkstemp(3)
ou
tmpfile(3).
SUSv2 ne mentionne pas l'utilisation de
TMPDIR,
la glibc ne l'emploiera que si le programme n'est pas Set-UID.
SVr4 indique que le répertoire pour le cas
d)
est
/tmp
(et c'est ce que fait la glibc).
SVID2 précise que la chaîne renvoyée par
Parce qu'elle alloue dynamiquement la mémoire utilisée
pour renvoyer le nom du chemin,
tempnam()
est ré-entrante, et donc sûre du point de vue des threads,
contrairement à
tmpnam(3).
La fonction
tempnam()
crée une chaîne différente à chaque fois qu'elle est appelée,
jusqu'à
TMP_MAX
(définie dans
<stdio.h>)
fois.
Si on l'appelle plus de
TMP_MAX
fois, le comportement dépend de l'implémentation.
tempnam()
utilise au plus les cinq premiers octets de
préfixe.
L'implémentation glibc de
tempnam()
échouera avec l'erreur
EEXIST
en cas d'échec pour trouver un nom unique.