Begutachtung von Source

So, wieder ein neuer Tag mit C, PHP und lausig konfigurierten Servern...

Mir ist grad in Deinem Code aufgefallen, dass Du cl_free() zu frueh aufrufst. Das wird Dir wohl nicht aufgefallen sein, da Du mit einer sauberen Datei arbeitest und ich zusaetzlich noch eine mit Test-String habe.
Das Resultat der verfruehten Freigabe durch cl_free() ist folgendes:
X-Virus-Checker: Scanned by mailscan 0.94 (Virus found: ðwr-Test-Signature)
Eigentlich sollte es so aussehen:
X-Virus-Checker: Scanned by mailscan 0.94 (Virus found: Eicar-Test-Signature)
Aber das ist ja nicht so tragisch.

Ansonsten ist unser Code ja nicht mehr so verschieden, ich werd mich noch etwas mit Deinen Aenderungen beschaeftigen und diese dann noch implementieren.

Macht es eigentlich einen Unterschied ob ich eine Variable in der Funktion deklariere (wie Du es mit *line machst) oder ausserhalb (wie ich mit *part1)?
Ich selbst find es ja nicht so schoen Variablen irgendwo mittem im Code zu deklarieren.
Wenn eine Variable nur innerhalb einer Funktion und nicht global existiert, dann erstell ich diese zu Beginn der Funktion, vor irgendwelchem Code.

Nachtrag: So, grad mal die Fehlerbehandlung fuer die Arbeit mit der temporaeren Datei eingeloetet und allen Fehlern eine Fehlermeldung verliehen. So langsam nimmt das ganze irgendwie echt Form an.

Nachtrag 2: Aus Spass hab ich grad mal alles entfernt was mit der LibClamAV zu tun hat und versucht es unter Windows zu kompilieren, und siehe da: es geht. :)
Nur ist das Windows-Binary mal eben 20K groesser als Linux-Binary.
 
Dennis Wronka hat gesagt.:
So, wieder ein neuer Tag mit C, PHP und lausig konfigurierten Servern...

Mir ist grad in Deinem Code aufgefallen, dass Du cl_free() zu frueh aufrufst. Das wird Dir wohl nicht aufgefallen sein, da Du mit einer sauberen Datei arbeitest und ich zusaetzlich noch eine mit Test-String habe.
Oh, da hab ich mich einfach auf die Dokumentation verlassen wo stand
Because the internal database uses a few megabytes of memory, you should release it if you no longer need to scan files.
Code:
void cl_free(struct cl_node *root);
Dateien wollte ich ja eigentlich auch nicht mehr scannen also brauch ich die Datenbank nicht mehr und kann den Speicher freigeben - dachte ich. Das virname ein intern allozierter String ist der dann auch freigegeben wird hab ich nicht gesehen.

Ansonsten hab ich auch eine Mail mit einem eicar Zip-Archiv getestet und prompt die falsche Ausgabe beim Virusnamen übersehen.

Dennis Wronka hat gesagt.:
Macht es eigentlich einen Unterschied ob ich eine Variable in der Funktion deklariere (wie Du es mit *line machst) oder ausserhalb (wie ich mit *part1)?
Der Unterschied ist das globale Variablen mit 0 beim Programmstart initialisiert werden - bei automatischen Variablen auf dem Stack geschieht das normalerweise nicht. Ich persönlich halte ganz und gar nichts davon globale Variablen zu verwenden wenn es nicht absolut notwendig ist. In einem größeren Programm wird das ziemlich unübersichtlich und man weiß gar nicht mehr wo jetzt welche Variable verwendet/verändert wird.

Dennis Wronka hat gesagt.:
Ich selbst find es ja nicht so schoen Variablen irgendwo mittem im Code zu deklarieren.
Wenn eine Variable nur innerhalb einer Funktion und nicht global existiert, dann erstell ich diese zu Beginn der Funktion, vor irgendwelchem Code.
Im alten C Standard war das ja sogar so vorgeschrieben das man alle Variablen vor dem Code deklarieren muß. Allerdings kann man auch an der Änderung dieser Regel erkennen das es wohl Gründe gab diese Restriktion aufzuheben.

Ich finde es (meist) besser eine Variable dann einzuführen wenn ich sie benötige und nicht 175 Zeilen vorher. Vor allem weil ich dann relativ schnell sehe was für ein Typ von Variable es ist, was besonders in fremden Code den man schnell mal lesen will äußerst mühsehlig sein kann immer an den Anfang der Funktion und zurück zu scrollen um zu schauen wie die Variable deklariert ist auf die man gerade gestoßen ist.

Dennis Wronka hat gesagt.:
Nachtrag 2: Aus Spass hab ich grad mal alles entfernt was mit der LibClamAV zu tun hat und versucht es unter Windows zu kompilieren, und siehe da: es geht.

Mit welchem Compiler denn? Als natives Windows Programm sehe ich noch ein Problem - und zwar die Zeilenendezeichen. Unter Unix ist das keine Sache, da findet keine Übersetzung statt. Allerdings werden unter Windows beim Einlesen die CRLF in LF konvertiert und bei der Ausgabe die LF in CRLF übersetzt. Deine CRLF in den Strings werden also in CRCRLF übersetzt. Eine Möglichkeit (windows spezifisch) wäre den Modus der Ein-/Ausgabestreams in binär zu ändern:
Code:
#include <io.h> /* für setmode */
#include <fcntl.h> /* für O_BINARY */

setmode(fileno(stdin), O_BINARY);
setmode(fileno(stdout), O_BINARY);

Übrigens hab ich grad noch einen kapitalen Fehler gefunden (in meinem Code ;)):
Code:
data[num] = '\0'; /* nicht data[num+1]   (!) */

Gruß
 
Wahrscheinlich wurde wegen dem zuletzt erwaehnten Fehler ein zusaetzliches Zeichen am Ende der eMail ausgegeben.
Ich hab es mit den Borland CommandLine-Tools probiert, da die fuer Lau sind und ich damit unter Windows zwischendurch was rumspiele.
Ist aber nicht so wichtig, ich weiss eh nicht ob es da die LibClamAV gibt und es ist eh fuer Linux gedacht.
 
Dennis Wronka hat gesagt.:
Ist aber nicht so wichtig, ich weiss eh nicht ob es da die LibClamAV gibt und es ist eh fuer Linux gedacht.
OK. Allerdings hat man das Problem auch unter Cygwin wenn man das Zeilenende bei der Installation auf CRLF einstellt (wovon allerdings abgeraten wird).

Gruß
 
In erster Linie ist das Programm ja dafuer gedacht mit ProcMail zusammen im Mail-Server zu fungieren, und ich denke nicht, dass man so viele unter Cygwin laufende Mail-Server vorfindet. :)
Ansonsten wuerde ich dem Programm ja die zu scannende Datei per Parameter uebergeben und dann nur eine Ausgabe machen ob infiziert oder nicht. Dann koennte ich mir aber auch die Arbeit sparen und direkt ClamAV nutzen. ;)
 
So, um mal einen kleinen Abschlussbericht zu diesem Thread abzuliefern, hier ein paar kleine Infos.

Dank der wirklich guten Hilfe die ich hier erhalten habe konnte ich mein Programm nicht nur unheimlich beschleunigen, sondern auch den Speicherverbrauch drastisch senken und einiges an Fehlerbehandlung einbauen.
Es laeuft jetzt schon ganz gut und ist auch hier im Buero auf dem Server fleissig im Einsatz.
Das Thema ist also erledigt und wird auch gleich von mir entsprechend markiert.
Als naechstes werde ich mich damit beschaeftigen eine Config-Datei zu ermoeglichen. Dazu hab ich schon ein paar Ideen und werd mal schauen, dass ich das allein auf die Kette kriege.

Nochmal vielen Dank fuer die geleistete Hilfe, moege Euer Code auf ewig sauber sein!
 

Neue Beiträge

Zurück