Hallo,
ich bin letztens über einen versteckten Bug gestolpert, und weil er so fies war, schreib ich gleich mal ein paar Worte dazu...
Die Funktion getpwnam(), Bestandteil der libc, konform zu 4.3BSD und POSIX, liefert eine Struktur, die im großen und ganzen einer Zeile in der /etc/passwd entspricht. Sehr praktisch, wenn man z.B. die User-ID und die Shell eines Nutzers herausfinden möchte. Es gibt 2 Situationen, in denen NULL zurückgegeben wird: - der Nutzer existiert nicht - es tritt ein Fehler auf
Da bei mir nach einer gewissen Zeit immer NULL geliefert wurde und der Nutzer ziemlich existent ist, blieb mir also nichts anderes übrig als die Variable errno auszuwerten, die aber dummerweise für getpwnam() nur den Wert ENOMEM annehmen kann, und Speicher war genügend vorhanden.
Der Bug befindet sich in der Manpage; diese verschweigt, daß auch EMFILE auftreten kann, weil nämlich für getpwnam() die Datei /etc/passwd geöffnet werden muß, und damit auch bei Mangel an Dateideskriptoren der Aufruf fehlschlagen muß. (Die glibc-2.2.5-Quellen dazu sind nicht wirklich lesbar...)
Wo liegt der Bug nun genau? Manpage oder POSIX oder glibc-Implementation? Das EMFILE sollte auf alle Fälle mit dokumentiert sein, da das Öffnen von /etc/passwd transparent erfolgt. Nach einem Update von manpages-dev liest sich getpwnam(3) etwas anders, dabei wird die /etc/nsswitch.conf mit erwähnt, das sollte aber nichts an der Sache ändern.
Josef Spillner