Ich musste es schnell schreiben, weil ich zum Mittagessen gegangen bin.
Wo ist das Problem? Der Vorteil von statischen Tests ist, dass man, im Gegensatz zu dynamischen Tests, Fehler entdecken kann, die sonst entweder unentdeckt bleiben oder nur sehr schwer und aufwändig zu entdecken wären.
- Die Speichergrößen (1024) kann zu klein oder viel zu groß sein für einen SecurityDescriptor. Sobald jemand den Code erweitert, um mehr als nur den Besitzer zu erfahren kann das zu einem Problem werden. Der SD wird in einem zusammenhängenden Speicherblock geschrieben, und z.B. ACL Strukturen können bis zu 64kb groß werden, so dass es nicht mehr funktioniert. Also sollte man GetFileSecurity zweimal aufrufen, damit man die richtige Größe erfährt.
Fast dasselbe gilt für LookupAccountSid.
- "GetMem(OwnerSID, SizeOf(PSID));" wird verwendet, was völliger blödsinn ist, da GetSecurityDescriptorOwner den Zeiger eh ändert auf die Speicheradresse des Owners innerhalb von SecDescr. Der Autor gibt am Ende diese Variable nicht frei, weil er vermutlich Zugriffsfehler bekommen hat, denn der Speicher wird ja schon mit "FreeMem(SecDescr);" freigegeben. Ergo hat man ein Leak und sollte diese Funktion auf große Ordner angewendet werden, kommt es schnell zu einem Speicherproblem.
- Und dann die Auflistung von GetMem:
Delphi-Quellcode:
GetMem(SecDescr, 1024);
GetMem(OwnerName, 1024);
GetMem(DomainName, 1024);
try
...
finally
FreeMem(SecDescr);
FreeMem(OwnerName);
FreeMem(DomainName);
end;
Wenn GetMem nicht genug Speicher allokieren kann, dann wirft es eine EOutOfMemory Exception. Geschieht das z.B. beim dritten Aufruf von GetMem so werden die vorangegangenen Speicherallokationen nicht freigegeben. Ziemlich schlecht bei Speicherknappheit oder?
- ADD: Ach ja, eben gesehen : Wenn die Besitzer SID nicht in einen Namen aufgelöst werden kann, dann schlägt LookupAccountSid mit ERROR_NONE_MAPPED fehl und damit die gesamte Funktion. Dies kann vorkommen, wenn man z.B. Dateien von anderen Systemen verwendet.
- Es gibt noch ein paar andere Kleinigkeiten (z.B. var statt out), die aber nicht so schlimm sind. Daher lasse ich sie aus.
Wie du siehst, kann man durch logisches Denken oftmals mehr Fehler finden, als durch Tests. Ich will aber Tests nicht kleinreden. Im Gegenteil. Nur die Kombination von mehreren Testarten führt zur kleinsten Fehlerrate.