1
0
mirror of https://github.com/deadw00d/AROS.git synced 2025-11-19 08:11:43 +00:00

Remove reset handler when freeing driver data

Otherwise the node becomes invalid but is still kept in the handlers list
and next time something accesses this list, it stumbles on random memory.

Implementation copied from VIA-AC97 driver.
This commit is contained in:
deadwood
2025-11-15 18:41:41 +01:00
parent dc9bfc2474
commit 5b353efd52
8 changed files with 42 additions and 23 deletions

View File

@ -182,7 +182,13 @@ struct HDAudioChip
/** The recording software interrupt */
struct Interrupt record_interrupt;
/** The reset handler */
struct Interrupt reset_handler;
/** TRUE if the reset handler has been added to the system */
BOOL reset_handler_added;
/*** Card structures **************************************************/
HDAADDR(playback_buffer1);
HDAADDR(playback_buffer2);

View File

@ -254,6 +254,11 @@ void FreeDriverData(struct HDAudioChip* card, struct DriverBase* AHIsubBase)
ahi_pci_rem_intserver(&card->interrupt, card->pci_dev);
}
if (card->reset_handler_added)
{
RemResetCallback(&card->reset_handler);
}
FreeVec(card);
}
}
@ -1050,19 +1055,18 @@ static ULONG ResetHandler(struct HDAudioChip *card)
void AddResetHandler(struct HDAudioChip *card)
{
static struct Interrupt interrupt;
interrupt.is_Code = (void (*)())ResetHandler;
interrupt.is_Data = (APTR) card;
interrupt.is_Node.ln_Pri = 0;
struct Interrupt *handler = &card->reset_handler;
handler->is_Code = (void (*)())ResetHandler;
handler->is_Data = (APTR) card;
handler->is_Node.ln_Pri = 0;
#ifdef __AMIGAOS4__
interrupt.is_Node.ln_Type = NT_EXTINTERRUPT;
handler->is_Node.ln_Type = NT_EXTINTERRUPT;
#else
interrupt.is_Node.ln_Type = NT_INTERRUPT;
handler->is_Node.ln_Type = NT_INTERRUPT;
#endif
interrupt.is_Node.ln_Name = "HDAudio reset handler";
handler->is_Node.ln_Name = "HDAudio reset handler";
AddResetCallback(&interrupt);
card->reset_handler_added = AddResetCallback(handler);
}

View File

@ -1 +1 @@
29.12.2024
15.11.2025

View File

@ -1 +1 @@
36
37

View File

@ -112,6 +112,11 @@ struct SB128_DATA
/** TRUE if the hardware interrupt may Cause() playback_interrupt */
BOOL record_interrupt_enabled;
/** The reset handler */
struct Interrupt reset_handler;
/** TRUE if the reset handler has been added to the system */
BOOL reset_handler_added;
/*** CAMD support functions **********************************************/

View File

@ -813,6 +813,11 @@ FreeDriverData( struct SB128_DATA* card,
ahi_pci_rem_intserver(&card->interrupt, card->pci_dev);
}
if( card->reset_handler_added )
{
RemResetCallback(&card->reset_handler);
}
FreeVec( card );
}
}
@ -1242,17 +1247,16 @@ static ULONG ResetHandler(struct SB128_DATA *card)
void AddResetHandler(struct SB128_DATA *card)
{
static struct Interrupt interrupt;
interrupt.is_Code = (void (*)())ResetHandler;
interrupt.is_Data = (APTR) card;
interrupt.is_Node.ln_Pri = 0;
struct Interrupt *handler = &card->reset_handler;
handler->is_Code = (void (*)())ResetHandler;
handler->is_Data = (APTR) card;
handler->is_Node.ln_Pri = 0;
#ifdef __AMIGAOS4__
interrupt.is_Node.ln_Type = NT_EXTINTERRUPT;
handler->is_Node.ln_Type = NT_EXTINTERRUPT;
#else
interrupt.is_Node.ln_Type = NT_INTERRUPT;
handler->is_Node.ln_Type = NT_INTERRUPT;
#endif
interrupt.is_Node.ln_Name = "SB128 Reset Handler";
handler->is_Node.ln_Name = "SB128 Reset Handler";
AddResetCallback( &interrupt );
card->reset_handler_added = AddResetCallback( handler );
}

View File

@ -1 +1 @@
20.7.2012
15.11.2025

View File

@ -1 +1 @@
27
28