hw/audio/fmopl: fix segmentation fault
Current code allocates the memory for ENV_CURVE too late. Move
allocation to OPLOpenTable() and deallocation to OPLCloseTable().
To reproduce the bug start qemu with -soundhw adlib.
Fixes 2eea51bd01
"hw/audio/fmopl: Move ENV_CURVE to .heap to save
32KiB of .bss"
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20200324061855.5951-1-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
112c37a6a6
commit
95fad99cb2
@ -627,6 +627,7 @@ static int OPLOpenTable( void )
|
||||
free(AMS_TABLE);
|
||||
return 0;
|
||||
}
|
||||
ENV_CURVE = g_new(int32_t, 2 * EG_ENT + 1);
|
||||
/* make total level table */
|
||||
for (t = 0;t < EG_ENT-1 ;t++){
|
||||
rate = ((1<<TL_BITS)-1)/pow(10,EG_STEP*t/20); /* dB -> voltage */
|
||||
@ -694,6 +695,7 @@ static int OPLOpenTable( void )
|
||||
|
||||
static void OPLCloseTable( void )
|
||||
{
|
||||
g_free(ENV_CURVE);
|
||||
free(TL_TABLE);
|
||||
free(SIN_TABLE);
|
||||
free(AMS_TABLE);
|
||||
@ -1090,7 +1092,6 @@ FM_OPL *OPLCreate(int clock, int rate)
|
||||
OPL->clock = clock;
|
||||
OPL->rate = rate;
|
||||
OPL->max_ch = max_ch;
|
||||
ENV_CURVE = g_new(int32_t, 2 * EG_ENT + 1);
|
||||
/* init grobal tables */
|
||||
OPL_initialize(OPL);
|
||||
/* reset chip */
|
||||
@ -1128,7 +1129,6 @@ void OPLDestroy(FM_OPL *OPL)
|
||||
#endif
|
||||
OPL_UnLockTable();
|
||||
free(OPL);
|
||||
g_free(ENV_CURVE);
|
||||
}
|
||||
|
||||
/* ---------- Option handlers ---------- */
|
||||
|
Loading…
Reference in New Issue
Block a user