From 0efe8a1320b5e2dbe21eea450e44a95321e0286c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Jul 2024 01:47:17 -0500 Subject: [PATCH] XM import: fix infinite loop --- src/engine/fileOps/xm.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/engine/fileOps/xm.cpp b/src/engine/fileOps/xm.cpp index d655c7c06..e2a1482ef 100644 --- a/src/engine/fileOps/xm.cpp +++ b/src/engine/fileOps/xm.cpp @@ -525,21 +525,27 @@ bool DivEngine::loadXM(unsigned char* file, size_t len) { if (volType&1) { // add fade-out - int cur=64; - if (ins->std.volMacro.len>0) { - cur=ins->std.volMacro.val[ins->std.volMacro.len-1]; - } - for (int fadeOut=32767; fadeOut>0 && ins->std.volMacro.len<254; fadeOut-=volFade) { - ins->std.volMacro.val[ins->std.volMacro.len++]=(cur*fadeOut)>>15; - } - if (ins->std.volMacro.len<255) { - ins->std.volMacro.val[ins->std.volMacro.len++]=0; + if (volFade!=0) { + int cur=64; + if (ins->std.volMacro.len>0) { + cur=ins->std.volMacro.val[ins->std.volMacro.len-1]; + } + for (int fadeOut=32767; fadeOut>0 && ins->std.volMacro.len<254; fadeOut-=volFade) { + ins->std.volMacro.val[ins->std.volMacro.len++]=(cur*fadeOut)>>15; + } + if (ins->std.volMacro.len<255) { + ins->std.volMacro.val[ins->std.volMacro.len++]=0; + } + if (ins->std.volMacro.relstd.volMacro.len && ins->std.volMacro.relstd.volMacro.loop) { + ins->std.volMacro.loop=255; + } } } else { // add a one-tick macro to make note release happy ins->std.volMacro.val[0]=64; ins->std.volMacro.val[1]=0; ins->std.volMacro.rel=0; + ins->std.volMacro.loop=255; ins->std.volMacro.len=2; }