log_file(): auch /log/... akzeptieren
Sollte der uebergebene Pfad bereits absolut sein
und mit einem /log/ beginnen, wird kein erneutes
/log/ am Anfang eingefuegt.
Change-Id: I8c5ab55db1488810419d0b462baa32826dcc62b2
diff --git a/doc/sefun/log_file b/doc/sefun/log_file
index cf7e03b..6cdab31 100644
--- a/doc/sefun/log_file
+++ b/doc/sefun/log_file
@@ -9,6 +9,8 @@
BESCHREIBUNG:
log_file schreibt den Text text in die Datei /log/file.
+ Sollte file schon mit einem /log/ beginnen, wird kein erneutes /log/ davor
+ eingefuegt.
RUECKGABEWERT:
1 bei Erfolg oder 0, falls ein Fehler beim Schreiben auftrat.
@@ -23,9 +25,11 @@
BEISPIELE:
log_file( "report/wargon.rep", "TYPO von bla in blubb:\ntest\n");
In /log/report/wargon.rep finde ich nun die neueste Typomeldung... ;)
+ log_file( "/log/report/wargon.rep", "TYPO von bla in blubb:\ntest\n");
+ Gleiches Ergebnis. ;-)
SIEHE AUCH:
write_file(E)
-09.06.2014, Zesstra
+29.01.2017, Zesstra
diff --git a/secure/simul_efun/files.c b/secure/simul_efun/files.c
index d2b81a5..3db144c 100644
--- a/secure/simul_efun/files.c
+++ b/secure/simul_efun/files.c
@@ -48,17 +48,29 @@
varargs int log_file(string file, string txt, int size_to_break)
{
mixed *st;
+ // Wenn file schon mit /log/ anfaengt, schreiben wir nicht noch eins
+ // davor.
+ if (strstr(file,"/"LIBLOGDIR"/") != 0)
+ {
+ file="/log/"+file;
+ }
- file="/log/"+file;
+ // Achtung: es ist verfuehrerisch, diese Pruefung zu entfernen und
+ // stattdessen, den Aufruf von write_file() an den Aufrufer zu binden.
+ // Dies funktioniert aber nicht, weil log_file gesonderte Behandlung in
+ // valid_write() erfaehrt.
file=implode((efun::explode(file,"/")-({".."})),"/");
-
if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
"valid_write",file,geteuid(PO),"log_file",PO))
return 0;
+
+ // Wenn zu gross, rotieren.
if ( size_to_break >= 0 & (
sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
catch(rename(file, file + ".old");publish); /* No panic if failure */
+ // Die Zugriffspruefung hier laeuft mit Rechten der simul_efuns...
+ // Rechtepruefung oben
return(write_file(file,txt));
}