Ho aggiornato lucee da 6.2 a Lucee 7.1.2.191 sostituendo core e loader.
Tutto funzionava a meraviglia.
Ho aggiornato le estensioni e testato tutte le mie app.
Poi gho avuto la pessima idea di installare l’esensione debugger.
Appena ho avviato l’installazione lucee è andato down
Horiavviato lucee. adesso ogni vota che cerco di accedere alla pagina delle estensioni lucee va down con un uso enorme di memoria heap.
Ecco cosa risulta dall’analisi del dump di memoria:
Lucee Administrator – OutOfMemoryError causato da ricorsione in ResourceUtil._check()
Ambiente
Lucee Administrator: inizialmente 1.0.0.11-SNAPSHOT, successivamente testato anche con 1.0.0.9
Heap JVM massima: 4 GB
Descrizione del problema
Accedendo alla dashboard principale di Lucee Administrator, la memoria heap cresce rapidamente fino a esaurirsi. Dopo pochi secondi Lucee termina con:
java.lang.OutOfMemoryError: Java heap space
La JVM viene terminata anche a causa dell’opzione -XX:+ExitOnOutOfMemoryError .
Il problema si è verificato anche dopo il downgrade di Lucee Administrator dalla versione 1.0.0.11-SNAPSHOT alla 1.0.0.9.
Analisi del dump HPROF con Eclipse Memory Analyzer
L’analisi del dump ha evidenziato:
Un thread org.apache.tomcat.util.threads.TaskThread , identificato come http-nio-8888-exec-1 , trattiene circa 3.657.534.552 byte, pari al 98,33% della heap.
Tra gli oggetti trattenuti sono presenti numerose istanze di lucee.commons.io.res.type.file.FileResource .
Nella catena degli oggetti compare una stringa che inizia con:
/opt/lucee/tomcat/lucee-server/context/context/admin/iVBORw0KGgoAAAANSUhEUg…
La sequenza iVBOR corrisponde all’inizio tipico di un’immagine PNG codificata in Base64.
Analisi dello stack trace
Lo stack trace mostra una ricorsione estremamente profonda:
5.402 ripetizioni di lucee.commons.io.res.util.ResourceUtil._check() (ResourceUtil.java:460).
La funzione viene invocata attraverso lucee.runtime.functions.file.FileExists.call() (FileExists.java:35).
La chiamata proviene da ext_functions_cfm184$cf.udfCall2() in admin/ext.functions.cfm , riga 233.
Il chiamante è ext_applications_list_cfm966$cf.call_000002() in admin/ext.applications.list.cfm , riga 268.
La sequenza indica che durante la costruzione della pagina di elenco delle applicazioni/estensioni dell’Administrator viene eseguita una chiamata a FileExists() , che innesca una ricorsione anomala in ResourceUtil._check() .
Ipotesi da verificare
La stringa Base64 che compare nel percorso di una FileResource fa sospettare che un’immagine PNG codificata in Base64 venga passata erroneamente come percorso di un file.
Non è ancora stato possibile determinare quale componente generi questo valore né se il problema sia direttamente riconducibile a Lucee Administrator o a un’estensione.
L’estensione Debugger 3.0.0.8 era stata installata poco prima della comparsa del problema. Sono stati successivamente rimossi i suoi riferimenti dalla configurazione e spostati fuori dalle directory operative alcuni suoi file, ma il problema si è ripresentato.
Richiesta al team Lucee
Chiediamo di verificare:
Perché FileExists() in ext.functions.cfm alla riga 233 possa innescare migliaia di chiamate ricorsive a ResourceUtil._check() .
Se esiste un problema noto nella gestione di percorsi contenenti stringhe Base64 o caratteri anomali.
Se il codice di ext.applications.list.cfm o ext.functions.cfm presenta un problema nella gestione delle icone delle estensioni.
Se il comportamento può essere correlato all’estensione Debugger 3.0.0.8 o al sistema di caricamento delle estensioni.
Ho provato a disinstallare manualmente l’estensione ma il problema permane
OS: AlmaLinux 9
Lucee: 7.1.2.191
Tomcat: 11
Java: 21