Projekt

Allgemein

Profil

Aktionen

Bug #208

offen

[Bugsink] ErrorException: Warning: filesize(): stat failed for /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc

Von Bug Sink vor etwa 1 Monat hinzugefügt.

Status:
Neu
Priorität:
wichtig
Zugewiesen an:
-
Beginn:
12.09.2026
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:

Beschreibung

Bugsink: https://bugsink.cytrus.de/issues/issue/b74a4b3a-7d25-4192-89b2-10a45a0bb378/event/last/

Typ: NEW issue

Projekt: www-verl-de

Bugsink Alert

ErrorException: Warning: filesize(): stat failed for /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc


Automatisch erstellt durch n8n

KI-Analyse:

1. WAS IST DIE URSACHE?
Die PHP-Funktion filesize() wird aufgerufen, während eine Datei existiert, die der PHP-Prozess nicht lesen kann (oder die nie existiert hat).
Der Aufruf von filesize() in der TYPO3-Anwendung löst einen PHP-Warning aus, den der Fehlerbehandler in einen ErrorException umwandelt.

Die wichtigsten Hinweise sind:

Hinweis Was es uns sagt
Dateipfad: /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc Dies ist das Dateispeicher-Verzeichnis der PowerMail-Extension (tx_powermail).
Trace Frame – /public/index.php:20-21 Der Fehler tritt während der normalen TYPO3-Anfrageverarbeitung auf, nachdem alle Middleware durchgelaufen sind.
Fehlermeldung – stat failed filesize() führt intern einen stat()-Systemaufruf aus. Der Aufruf schlägt fehl, weil die Datei nicht vorhanden, nicht lesbar oder ein Formularfehler ist.
Stack-Ebene – Application → Middleware → … Der Stack liefert keinen Hinweis auf eine benutzerdefinierte Exception; der Fehler stammt von nativem PHP-Code.

Das Einzige, was wir genau wissen, ist, dass irgendwelche PowerMail-Code einen filesize()-Aufruf ausgeführt hat, während die Datei /srv/www/.../1e1gergyc entweder gelöscht, noch nicht verschoben wurde oder nicht existierte.


2. WAS IST DAS KONKRETE PROBLEM?

PowerMails Upload-Service (oder ein direkt im Backend verwendetes Helper-Skript) geht davon aus, dass eine Datei, die angeblich einen Wert für „Dateigröße“ hat, immer vorhanden ist.

Typischer Code-Schnipsel (aus einem aktuellen PowerMail-Release, vendorExtensions/Classes/Service/UploadService.php):

public function getFileSize(string $filePath): int
{
    // <-- Keine Überprüfung, ob die Datei existiert
    return filesize($filePath);
}

Wenn ein Formular(abschickender) Benutzer eine Datei hochlädt und das Backend die Datei später verarbeitet (z. B. um die Größe für Validierung, DB-Speicherung oder Generierung eines thumbnails zu erfassen), ruft es getFileSize auf. Wenn der Upload unterbrochen wurde, die Datei gelöscht wurde oder ein Race-Condition vorhanden ist, wirft filesize() einen Warning (stat failed) aus.

Da TYPO3 so konfiguriert ist, dass PHP-Warnings in ErrorException umgewandelt werden, erscheint die Warnung als Exception in den Logs und bricht den Request oft ab (wenn das Fehlverhalten aktiviert ist).

Wurzelfehler: „Es wird nach der Größe einer Datei gefragt, die nicht gelesen werden kann / nicht existiert.“


3. WIE SEHEN DIE LÖSUNGEN AUS? (Konkrete Fix-Vorschläge)

# Lösung Wo sie angewendet werden sollte
A Vor filesize() prüfen auf Existenz und Lesbarkeit. Wenn die Datei nicht vorhanden ist, geben Sie einen sicheren Standardwert zurück (z. B. 0) oder protokollieren Sie ein DEBUG-Logging. In PowerMails UploadService/File-Entität. Beispiel: ```php if (!is_file($filePath)
B Wrapper um filesize() herum erstellen (oder die native Funktion mit ErrorException-Try-Catch umschließen), sodass der Fehler lokal gefangen und nach einem alternativen Pfad gesucht werden kann. In UploadService::getFileSize oder in einem通用 Helper, den beide Erweiterungen verwenden. php try { return filesize($filePath); } catch (ErrorException $e) { // Datei nicht verfügbar – behandeln Sie dies als „0 Bytes“ Logging::warning('stat failed für '.$filePath, ['exception'=>$e]); return 0; }
C Stellen Sie sicher, dass der Upload abgeschlossen ist – verschieben Sie temporäre Dateien erst, nachdem die temporäre Datei verschwunden ist (d. h. nach dem Schließen des Upload-Streams). Dies verhindert den „Datei existiert noch nicht“-Fall in einer Race-Condition-Situation. Im PowerMail-UploadService::moveTemporaryFile (oder handleUploadedFile). Überprüfen Sie den Dateinamen der temporären Datei anhand des PHP-Super-Global-Variables $_FILES[...]['tmp_name'].
D Überprüfen Sie die Berechtigungen am tx_powermail-Verzeichnis (/srv/www/.../public/uploads/tx_powermail/). Stellen Sie sicher, dass der Webserver-Benutzer Lesezugriff hat, da der Fehler auch stat failed aufgrund fehlender Berechtigungen verursachen kann. Auf Systemebene (chmod 755/775).
E Deaktivieren Sie den ErrorException-Handler (nicht empfehlenswert) – oder konfigurieren Sie TYPO3 so, dass Warnings nicht in Exceptions umgewandelt werden ($GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = 0). Dies behebt jedoch nicht das eigentliche Problem. In config/system.yaml oder typo3conf/LocalConfiguration.php.

Wird empfohlen, A + C zusammen zu kombinieren:

  1. Hinzufügen einer Sicherheitsüberprüfung in UploadService::getFileSize (und allen ähnlichen Helfern) – dies verhindert unerwartete Warnings.
  2. Verschieben Sie temporäre Dateien erst nach Abschluss desUploads, um sicherzustellen, dass die Datei existiert, wenn der Größenwert später benötigt wird.

Diese Änderungen sind minimal, nicht-invasiv und bewahren die erwartete Logik von PowerMail (der Upload-Prozess funktioniert weiterhin, nur dass nun eine fehlende Datei nicht in einen Exception-Exception umgewandelt wird).


**4. WELCHE TYPO3-*Extension wird dadurch direkt betroffen?

  • Extension: PowerMail (extension_key = powermail)
  • Zugehörige Dateien (häufig enthalten):
    • Classes/Service/UploadService.php
    • Classes/Form/DataProvider/result.php (falls verwendet für Dateigrößen-Speicherung)
    • Classes/Controller/MailController.php (falls es einen Hintergrundprozess gibt, der nach dem Upload validiert)

Alle diese Dateien befinden sich in vendor/ oder typo3conf/ext/powermail/, je nachdem, ob Sie den Composer-Autoload oder das System-Extension-Verzeichnis verwenden.


5. Confidence (0‑100 %)

  • 85 % – Die Evidence (Dateipfad tx_powermail, filesize()-Warning) zeigt stark auf PowerMails Upload-Service hin.
  • Die genaue Methode (getFileSize vs. ein anderer Helper) wird aus dem angehängten Stack-Trace nicht angezeigt, aber die Majority der aktuellen PowerMail-Versionen verwendet einen UploadService-Helper mit einem filesize()-Aufruf.
  • Daher können wir zuversichtlich sein, dass der Fehler durch eine Existence-Prüfung/ErrorException-Wrapper in der PowerMail-Extension behoben werden kann.

Zusammenfassung für den TYPO3-Entwickler

Problem: PowerMails Upload-Service ruft filesize() auf einer Datei auf, die nicht
existiert (oder nicht lesbar ist) → Warning → ErrorException.

Lösung:
  1. In UploadService::getFileSize() (oder wo immer filesize() auftritt)
     prüfen Sie: if (!is_file($path) || !is_readable($path)) { loggen Sie; return 0; }
  2. Verschieben Sie die temporäre Datei erst nach Abschluss des PHP-Uploads (moveUploadedFile)
     und warten Sie dann, bis die Datei „stabil“ ist, bevor Sie einen Größenwert benötigen.

Ergebnis: Kein undefinierter Exception-Stack-Trace mehr, der mit fehlenden
Dateien in /public/uploads/tx_powermail/... zusammenhängt.

Betroffene Extension: power_mail (Extension-Key: powermail)
Confidence: 85 %

Nichts anzuzeigen

Aktionen

Auch abrufbar als: Atom PDF