Salut,
Je vois deux probl�mes potentiels:
> # attend une �ventuelle fin
> while (-e "/tmp/__script_pwd") {
> }
> #Path securit�
> $ex_path = $ENV{"PATH"};
> $ENV{"PATH"} = "/bin:/usr/bin";
>
> #let'sgo 1) drapeau
> system("touch /tmp/__script_pwd");
Ok, tu t'es prot�g� contre plusieurs ex�cutions de ton
script; mais que ce passe-t-il si un autre processus �crit
dans le fichier? AMA il faudrait au moins flock-er le
fichier.
> print FIN $qui,":",$new_pwd,":",$fin,"\n";
Potentiellement, le print peut �chouer (cas de disque plein
par exemple).
Et enfin:
1> unlink ($RACINE.$PASS.".old");
2> rename $RACINE.$PASS , $RACINE.$PASS.".old";
3> rename $RACINE.$PASS_TMP , $RACINE.$PASS;
4> chown 0,0,$RACINE.$PASS;
Entre la ligne 2 et la ligne 3, il n'y a plus de fichier
/etc/passwd. Si un autre programme suit le m�me algorithme
et lit /etc/passwd entre ces deux lignes, il viendra ensuite
r��crire un /etc/passwd vide. Je changerais �a en:
1> unlink ($RACINE.$PASS.".old");
2> copy $RACINE.$PASS , $RACINE.$PASS.".old";
3> rename $RACINE.$PASS_TMP , $RACINE.$PASS;
4> chown 0,0,$RACINE.$PASS;
(rename est garanti atomique, donc ne pose pas de probl�mes
de concurrence).
Cela dit, si un autre programme a modifi� /etc/passwd entre
le moment o� tu l'as ouvert et le moment o� tu execute la
ligne 4, tu vas perdres ces modifications...
En fait, consid�rant l'importance de /etc/passwd, j'aurais
tendance � r��crire le script enti�rement en utilisant
putpwent, qui, je suppose, prend toutes les pr�cautions
n�cessaires. Ou bien en appellant passwd par le shell.
Y.