summaryrefslogtreecommitdiffstats
path: root/hw/audio/fmopl.c
diff options
context:
space:
mode:
authorVolker Rümelin2020-03-24 07:18:55 +0100
committerGerd Hoffmann2020-03-25 09:55:40 +0100
commit95fad99cb28e9970944b01fd7af452f6f9f37484 (patch)
tree3949a78318f5e2aa6c4d48652b01400706eb741c /hw/audio/fmopl.c
parentui/input-linux: Do not ignore ioctl() return value (diff)
downloadqemu-95fad99cb28e9970944b01fd7af452f6f9f37484.tar.gz
qemu-95fad99cb28e9970944b01fd7af452f6f9f37484.tar.xz
qemu-95fad99cb28e9970944b01fd7af452f6f9f37484.zip
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>
Diffstat (limited to 'hw/audio/fmopl.c')
-rw-r--r--hw/audio/fmopl.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/hw/audio/fmopl.c b/hw/audio/fmopl.c
index 356d4dfbca..8a71a569fa 100644
--- a/hw/audio/fmopl.c
+++ b/hw/audio/fmopl.c
@@ -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 ---------- */