Erstellt vor 3 Jahren

Geschlossen vor 3 Jahren

#1747 closed Fehler (fixed)

Name der temporären Druckdateien nicht "zufällig" genug

Erstellt von: grichardson@… Verantwortlicher: m.bunkus@…
Priorität: normal Meilenstein:
Komponente: kivitendo ERP Version: 2.7.0 unstable
Schweregrad: Verbesserung Stichworte: Systemeinstellungen
Beobachter: information@…

Beschreibung

Derzeit wird der Dateiname der temporären Dateien beim PDF Druck ja über einen Timestamp generiert, der sekundengenau ist:

in der Form.pm:

my $fileid = time;

$self->{tmpfile} = "${fileid}.$self->{IN}";

Das gibt dann Dateinamen wie 1322660130.invoice.tex

Wenn ich aber einen Massendruck starte, wo fast alle 2 Sekunden eine PDF erstellt wird, und dabei Benutzer an der Oberfläche weiterarbeiten, ist es gar nicht so unwahrscheinlich, daß mal innerhalb einer Sekunde 2 Druckaufträge angefragt werden, die zum gleichen temporären Dateinamen führen, worauf einer der beiden Druckbefehle versagt.

Ein Variante wäre z.B. den Timestamp um eine Zufallszahl zu erweitern, z.B.

my $fileid = time . "_" . int(rand(256));

Das sollte wahrscheinlich reichen, aber gibt es andere Vorschläge oder Einwände?

Änderungshistorie (2)

comment:1 Geändert vor 3 Jahren durch information@…

  • Beobachter information@… hinzugefügt

Ich find den mkstemp-Ansatz von Eike gut, deswegen halte ich hier kurz die E-Mail von der devel-Liste fest, damit die Info nicht verloren geht:

Ja. Wenn eine Zufallszahl hinzugefügt wird führt das nur dazu das der
Druck
dann hin und wieder zufällig fehlschlägt, aber nicht mehr sauber

naja, denke damit kann man leben denn je nach Groesse der random-Zahl
ist das eher ein theoretisches Risiko.

reproduzierbar. Das einfachste Verfahren das ganze sicher zu machen
ist die
PID (Prozess-ID) des aktuellen Prozesses/Threads? anzuhängen und ganz
am Ende
des Prozesses eine Sekunde zu warten um zu verhindern das dieselbe PID
innerhalb der Sekunde erneut vergeben werden kann.

schoener Ansatz, aber welche pid willst Du nehmen? Apache/perl hat mit
fcgi immer die gleiche, die von pdflatex kennst Du erst, nachdem die
temporaeren Dateien erstellt wurden.

Entweder die Thread-ID des Threads, der da gerade läuft, oder man nimmt ein
API das genau für diesen Zweck gemacht wurde: mkstemp().

S.a.:
http://perl.active-venture.com/lib/File/Temp.html

comment:2 Geändert vor 3 Jahren durch m.bunkus@…

  • Lösung auf fixed gesetzt
  • Status von new nach closed geändert

Ist in Revision b3b1b69 behoben.

Hinweis: Hilfe zur Verwendung von Tickets finden Sie in TracTickets.