modplug-xmms-f4e5295658fff000379caa122e75c9200205fe20.patch 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. From f4e5295658fff000379caa122e75c9200205fe20 Mon Sep 17 00:00:00 2001
  2. From: Konstanty Bialkowski <metaplasma@users.sourceforge.net>
  3. Date: Fri, 15 Jul 2011 23:25:23 +1000
  4. Subject: [PATCH] Fix S3M stack overflows (SA45131/B)
  5. ---
  6. libmodplug/src/load_s3m.cpp | 13 ++++++++++---
  7. 1 files changed, 10 insertions(+), 3 deletions(-)
  8. diff --git a/libmodplug/src/load_s3m.cpp b/libmodplug/src/load_s3m.cpp
  9. index edfc255..8678236 100644
  10. --- a/libmodplug/src/load_s3m.cpp
  11. +++ b/libmodplug/src/load_s3m.cpp
  12. @@ -187,11 +187,11 @@
  13. //---------------------------------------------------------------
  14. {
  15. UINT insnum,patnum,nins,npat;
  16. - DWORD insfile[128];
  17. + DWORD insfile[MAX_SAMPLES];
  18. WORD ptr[256];
  19. BYTE s[1024];
  20. DWORD dwMemPos;
  21. - BYTE insflags[128], inspack[128];
  22. + BYTE insflags[MAX_SAMPLES], inspack[MAX_SAMPLES];
  23. S3MFILEHEADER psfh = *(S3MFILEHEADER *)lpStream;
  24. psfh.reserved1 = bswapLE16(psfh.reserved1);
  25. @@ -315,7 +315,14 @@
  26. Ins[iSmp].nC4Speed = j;
  27. insfile[iSmp] = ((DWORD)bswapLE16(*((LPWORD)(s+0x0E)))) << 4;
  28. insfile[iSmp] += ((DWORD)(BYTE)s[0x0D]) << 20;
  29. - if (insfile[iSmp] > dwMemLength) insfile[iSmp] &= 0xFFFF;
  30. + // offset is invalid - ignore this sample.
  31. + if (insfile[iSmp] > dwMemLength) insfile[iSmp] = 0;
  32. + else if (insfile[iSmp]) {
  33. + // ignore duplicate samples.
  34. + for (int z=iSmp-1; z>=0; z--)
  35. + if (insfile[iSmp] == insfile[z])
  36. + insfile[iSmp] = 0;
  37. + }
  38. if ((Ins[iSmp].nLoopStart >= Ins[iSmp].nLoopEnd) || (Ins[iSmp].nLoopEnd - Ins[iSmp].nLoopStart < 8))
  39. Ins[iSmp].nLoopStart = Ins[iSmp].nLoopEnd = 0;
  40. Ins[iSmp].nPan = 0x80;
  41. --
  42. 1.7.0.1