Pufferüberlauf-sicheres readlink() in C++

English Deutsch

Problem:

Du möchtest readlink() verwenden, um die Datei oder das Verzeichnis zu ermitteln, auf das ein symbolischer Link zeigt, aber du kennst nicht die Puffergröße, die zum Speichern des Symlink-Ziels erforderlich ist. Du möchtest keine unglaublich große Speichermenge allozieren (egal welche Menge man wählt, sie könnte immer unzureichend sein), aber du möchtest auch keine Pufferüberläufe riskieren.

Lösung: readlink() gibt -1 mit errno == EINVAL zurück, wenn der Puffer zu klein ist. Daher kann man readlink einfach iterativ mit zunehmenden Puffergrößen aufrufen.

Diese Implementierung verwendet std::string und gibt im Fehlerfall einen leeren String zurück (errno ist in diesem Fall weiterhin gesetzt). Wenn die Datei kein Symlink ist, wird das Argument filename zurückgegeben.


Check out similar posts by category: C/C++