[BUG] Problemi noti nella versione 3.3.00
Inviato: 13/11/2010, 15:37
Nella versione 3.3.00 sono stati introdotti alcuni bug che causano i seguenti problemi:
- Il sistema PasteBin non funziona su hardware x86_64. Questo è dovuto al fatto che il software udapaste - un'interfaccia grafica GTK+ utilizzata dallo script per l'input del testo da pubblicare su PasteBin - non viene compilato su piattaforma x86_64 e, quando si prova ad usare il comando di menu "BuDuScRiPt -> PasteBin System - Incolla un testo su PasteBin e mostra LINK", si ottiene l'errore:[PASTEBIN] ERRORE FATALE: Programma udapaste non trovato in /home/???/.xchat2/buduscript/ .
Il problema sarà risolto nella prossima release del plug-in; chi volesse sistemarlo prima, deve necessariamente ri-compilare lo script (le istruzioni per farlo sono riportate sul sito) dopo aver modificato il file Makefile nel seguente modo (riga 12):Codice: Seleziona tutto
GTK_FLAGS = $(shell $(CROSS_COMPILING_PREFIX)pkg-config gtk+-2.0 --cflags) $(shell $(CROSS_COMPILING_PREFIX)pkg-config gtk+-2.0 --libs) - Le sentinelle che fanno uso dell'evento jchannel (e, probabilmente, anche di altri simili come jserver) potrebbero accusare dei malfunzionamenti.
La causa è dovuta al controllo che effettua il plug-in sui comandi da eseguire, relativamente alla verifica dell'integrità della sessione per la quale vanno eseguiti; nel momento in cui viene intercettato un comando con sessione nulla, il plug-in lo elimina in automatico.
Tuttavia, proprio nel contesto dell'Event Manager, vengono inseriti in coda dei comandi temporizzati che hanno sessione nulla nel momento in cui devono essere gestiti degli eventi per i quali non è ancora presente una situazione coerente. In altri termini: quando si entra in un canale, il plug-in genera l'evento corrispondente, tuttavia, la situazione del database non è ancora allineata (lo sarà a JOIN avvenuto) e quindi è necessario che l'evento venga ri-generato con un breve ritardo. Sfortunatamente questa "ri-generazione dell'evento" (che è un comando inserito in coda) avviene in un momento in cui la sessione destinazione potrebbe non esistere ancora, da qui la possibilità che il comando inserito sia associato ad una sessione nulla.
Nella prossima versione del plug-in il problema sarà risolto individuando questa situazione ed evitando che il comando venga eliminato contestualmente all'assegnazione di una sessione valida. Per chi compila il plug-in dai sorgenti è possibile correggere subito il problema applicando questa patch al file queue.c:Codice: Seleziona tutto
*** queue.c 2010/11/07 22:32:09 1.72
--- queue.c 2010/11/13 12:45:06
***************
*** 298,328 ****
}
/* Verifica se la sessione del comando e' valida. */
! if (!CheckSession(pCurrent->sess)) {
! if (iFlagDebugModeFnc > 0) sPrintLog(DEBUG_FNC_FILE, " * ExecCommandInQueue() - INVALID SESSION %p for object %p [%s]", pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->sess, pCurrent, pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->psCommand ? pCurrent->psCommand : "CORRUPTED");
! printf("[%s:%d]> QUEUE ERROR: %p\n", __FILE__, __LINE__, pCurrent);
! /* Procede a seconda se deve mantenere o meno il comando
! in coda, in base ad una variabile avanzata. */
! if (!iFlagKeepQueueCommandCorrupted) {
! /* La sessione non risulta valida; deve eliminare
! tutti i comandi presenti in coda che fanno
! riferimento alla sessione corrotta ed impedire
! l'esecuzione del comando, invalidando l'oggetto. */
! ssQueueLock = 0;
! EraseCommandForSession(pCurrent->sess);
! ssQueueLock = 1;
!
! /* Il puntatore dell'oggetto corrente e' stato eliminato; deve crearne uno fittizio, invalido. */
! pCurrent = (struct strCommandQueue*)malloc(sizeof(struct strCommandQueue));
! memset(pCurrent, 0, sizeof(struct strCommandQueue));
! pCurrent->iMemoryIntegrity = MEMORY_INTEGRITY_VALUE;
! } else {
! /* Deve mantenere il comando a tutti i costi. Fa
! l'unica cosa logica: associa al comando la sessione
! corrente, l'unica valida. */
pCurrent->sess = current_tab;
}
}
--- 298,352 ----
}
/* Verifica se la sessione del comando e' valida. */
! if (pCurrent->sess) {
! if (!CheckSession(pCurrent->sess)) {
! if (iFlagDebugModeFnc > 0) sPrintLog(DEBUG_FNC_FILE, " * ExecCommandInQueue() - INVALID SESSION %p for object %p [%s]", pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->sess, pCurrent, pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->psCommand ? pCurrent->psCommand : "CORRUPTED");
!
! printf("[%s:%d]> QUEUE ERROR: %p\n", __FILE__, __LINE__, pCurrent);
!
! /* Procede a seconda se deve mantenere o meno il
! comando in coda, in base ad una variabile
! avanzata. */
! if (!iFlagKeepQueueCommandCorrupted) {
! /* La sessione non risulta valida; deve eliminare
! tutti i comandi presenti in coda che fanno
! riferimento alla sessione corrotta ed impedire
! l'esecuzione del comando, invalidando
! l'oggetto. */
! ssQueueLock = 0;
! EraseCommandForSession(pCurrent->sess);
! ssQueueLock = 1;
!
! /* Il puntatore dell'oggetto corrente e' stato
! eliminato; deve crearne uno fittizio,
! invalido. */
! pCurrent = (struct strCommandQueue*)malloc(sizeof(struct strCommandQueue));
! memset(pCurrent, 0, sizeof(struct strCommandQueue));
! pCurrent->iMemoryIntegrity = MEMORY_INTEGRITY_VALUE;
! } else {
! /* Deve mantenere il comando a tutti i costi. Fa
! l'unica cosa logica: associa al comando la
! sessione corrente, l'unica valida. */
! pCurrent->sess = current_tab;
! }
! }
! } else {
! /* Se la sessione risulta nulla e' possibile si tratti
! di un comando inserito in un contesto non ancora
! completamente definito e non e' detto sia
! necessariamente un errore; la sessione viene forzata
! a quella corrente, se valida. */
! if (iFlagDebugModeFnc > 0) sPrintLog(DEBUG_FNC_FILE, " * ExecCommandInQueue() - NULL SESSION %p for object %p [%s]", pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->sess, pCurrent, pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->psCommand ? pCurrent->psCommand : "CORRUPTED");
! printf("[%s:%d]> QUEUE WARNING: %p\n", __FILE__, __LINE__, pCurrent);
! if (CheckSession(current_tab)) {
pCurrent->sess = current_tab;
+
+ if (iFlagDebugModeFnc > 0) sPrintLog(DEBUG_FNC_FILE, " * ExecCommandInQueue() - SET SESSION %p for object %p [%s]", pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->sess, pCurrent, pCurrent->iMemoryIntegrity == MEMORY_INTEGRITY_VALUE && pCurrent->psCommand ? pCurrent->psCommand : "CORRUPTED");
+ } else if (iFlagDebugModeFnc > 0) {
+ sPrintLog(DEBUG_FNC_FILE, " * ExecCommandInQueue() - CURRENT_TAB = NULL");
+ printf("[%s:%d]> QUEUE ERROR: %p\n", __FILE__, __LINE__, pCurrent);
}
} - A causa del problema di cui sopra (JCHANNEL) è possibile che il sistema di aggiornamento automatico del plug-in non funzioni, o meglio, non venga eseguito in automatico. Ne consegue la possibilità che lo script non controlli spontaneamente la disponibilità di aggiornamenti.
Si può risolvere lanciando manualmente il comando di menu "BuDuScRiPt -> Controlla presenza nuova versione". - Il Sistema XDCC non riesce a risolvere alcuni Network IRC e spesso non esegue in automatico i comandi per il download del file cercato.
Qui il problema è complesso e sto ancora cercando una soluzione valida. In linea di massima si presenta nel momento in cui il server al quale ci si collega effettivamente ha un nome diverso da quello previsto; questo accade perché, nonostante il plug-in lanci un comando per collegarsi ad un determinato server, quest'ultimo abbia poi facoltà di re-dirigere la connessione altrove - ad esempio per problemi di carico o quant'altro - e non necessariamente la destinazione ha un nome riconducibile al primo. Lo script, a questo punto, non è in grado di sapere se il server al quale si è collegato XChat è quello sul quale deve effettuare il Download o, ad esempio, si tratta di uno a cui si è collegato l'utente per altri motivi. Spero di trovare una soluzione e risolvere quanto prima.