Reported-by: Dark Raven Signed-off-by: Raphael S. Carvalho --- com32/lib/syslinux/disk.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c index 0b0c737..47ecb52 100644 --- a/com32/lib/syslinux/disk.c +++ b/com32/lib/syslinux/disk.c @@ -171,22 +171,28 @@ out: static void *ebios_setup(const struct disk_info *const diskinfo, com32sys_t *inreg, uint64_t lba, uint8_t count, uint8_t op_code) { - static __lowmem struct disk_ebios_dapa dapa; + static struct disk_ebios_dapa *dapa = NULL; void *buf; + if (!dapa) { + dapa = lmalloc(sizeof *dapa); + if (!dapa) + return NULL; + } + buf = lmalloc(count * diskinfo->bps); if (!buf) return NULL; - dapa.len = sizeof(dapa); - dapa.count = count; - dapa.off = OFFS(buf); - dapa.seg = SEG(buf); - dapa.lba = lba; + dapa->len = sizeof(*dapa); + dapa->count = count; + dapa->off = OFFS(buf); + dapa->seg = SEG(buf); + dapa->lba = lba; inreg->eax.b[1] = op_code; - inreg->esi.w[0] = OFFS(&dapa); - inreg->ds = SEG(&dapa); + inreg->esi.w[0] = OFFS(dapa); + inreg->ds = SEG(dapa); inreg->edx.b[0] = diskinfo->disk; return buf;