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:
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1 +1 @@
|
||||
29.12.2024
|
||||
15.11.2025
|
||||
|
||||
@ -1 +1 @@
|
||||
36
|
||||
37
|
||||
|
||||
@ -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 **********************************************/
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
@ -1 +1 @@
|
||||
20.7.2012
|
||||
15.11.2025
|
||||
|
||||
@ -1 +1 @@
|
||||
27
|
||||
28
|
||||
|
||||
Reference in New Issue
Block a user