Neu 5.8.0: HTTP 500 im letzten Checkout-Schritt durch Nummern-Lock

UniA

Aktives Mitglied
26. Februar 2024
5
1
Guten Tag,

seit dem Upgrade von JTL-Shop 5.7.2 auf 5.8.0 tritt bei uns beim letzten Schritt des Checkouts / Absenden der Bestellung reproduzierbar ein HTTP-500-Fehler auf.

Mit JTL- Shop 5.7.2 funktionierte der Shop mit derselben Umgebung problemlos.

Umgebung:
  • JTL-Shop 5.8.0
  • PHP 8.4.25
  • Apache 2.4.58 / Ubuntu
  • Shop-Dateisystem inkl. jtllogs: NFS4
  • Lock-Datei: jtllogs/nummern.lock

Fehlermeldung im Logbuch:
Code:
Routing error: Could not lock the thread-safe number provider

Die Exception wird in
Code:
includes/src/Checkout/Nummern.php:66
ausgelöst.

In JTL-Shop 5.8.0 wird die Lock-Datei folgendermaßen geöffnet:
Code:
$this->filePointer = \fopen(\NUMMERN_LOCKFILE, 'rb');
return $this->filePointer !== false && \flock($this->filePointer, \LOCK_EX);

Wir konnten das Problem direkt reproduzieren:
Code:
rb:   bool(false)
r+:   bool(true)
r+b:  bool(true)
c:    bool(true)
c+:   bool(true)

Das heißt: flock() schlägt bei nummern.lock fehl, wenn die Datei mit rb geöffnet wird. Mit r+b funktioniert der Lock.


Bestätigung durch Workaround:

Wir haben testweise
Code:
fopen(\NUMMERN_LOCKFILE, 'rb')
auf
Code:
fopen(\NUMMERN_LOCKFILE, 'r+b')
geändert.

Danach war der HTTP-500-Fehler im letzten Checkout-Schritt sofort behoben und Bestellungen konnten wieder abgeschlossen werden.

Da JTL-Shop 5.7.2 mit PHP 8.4.25 und derselben NFS4-Umgebung problemlos funktioniert hat, vermuten wir eine Änderung bzw. einen Fehler im Locking-Code von JTL-Shop 5.8.0.

Bitte prüfen Sie, ob die Verwendung von rb für NUMMERN_LOCKFILE in Checkout/Nummern.php beabsichtigt ist bzw. ob hierfür ein anderer Öffnungsmodus verwendet werden sollte.

Vielen Dank!
 

UniA

Aktives Mitglied
26. Februar 2024
5
1
Hi,

danke für die Info. Die Anpassung ist tatsächlich wichtig und gut, auch wenn diese Probleme in meiner Umgebung bereitet.

Ich kann an meiner Uni leider nur das nehmen, was angeboten wird, und das ist ein vHost samt Netzwerkspeicher per NFSv4.

Ich kann dein Argument mit dem "least-privilege"-Prinzip nachvollziehen - auf der anderen Seite wäre es vsl. nicht schlimm "r+b" zu benutzen, da man dann zwar einen Schreibzugriff hat, diesen aber nicht nutzen muss.

Ich wäre den Entwicklern auf jeden Fall sehr dankbar, wenn sie einen guten Mittelweg finden würden.

Danke im Voraus!