[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Phénomène curieux, /etc/passwd réduit à 0



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.



Reply to: