Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libxmp for openSUSE:Factory checked 
in at 2026-09-12 21:21:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libxmp (Old)
 and      /work/SRC/openSUSE:Factory/.libxmp.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libxmp"

Sat Sep 12 21:21:28 2026 rev:39 rq:1377461 version:4.7.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/libxmp/libxmp.changes    2026-07-28 
18:07:11.452029509 +0200
+++ /work/SRC/openSUSE:Factory/.libxmp.new.1265/libxmp.changes  2026-09-12 
21:25:15.967305458 +0200
@@ -1,0 +2,17 @@
+Fri Sep 11 20:22:09 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 4.7.3
+  * Fix hangs caused by changing the player mode to an S3M/IT mode
+    with a loaded module sequence beginning with pattern FF.
+  * Also fixed incomplete rescanning of modules in the same
+    situation. xmp now fully scans modules with an empty or invalid
+    first sequence, allowing later sequences in modules that begin
+    with an end marker.
+  * Operations that rescan the module (changing XMP_PLAYER_MODE or
+    XMP_FLAGS_VBLANK; xmp_scan_module) now reset the current
+    sequence.
+  * Fix missing bounds check on Protracker 2 sample changes that
+    could be reached by playing modules with instruments but no
+    samples in Protracker mode.
+
+-------------------------------------------------------------------

Old:
----
  libxmp-4.7.2.tar.gz

New:
----
  libxmp-4.7.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libxmp.spec ++++++
--- /var/tmp/diff_new_pack.8MJ68Z/_old  2026-09-12 21:25:16.495327620 +0200
+++ /var/tmp/diff_new_pack.8MJ68Z/_new  2026-09-12 21:25:16.496327662 +0200
@@ -18,7 +18,7 @@
 
 Name:           libxmp
 %define lname  libxmp4
-Version:        4.7.2
+Version:        4.7.3
 Release:        0
 Summary:        Module Player library for MOD, S3M, IT and others
 License:        MIT

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.8MJ68Z/_old  2026-09-12 21:25:16.527328963 +0200
+++ /var/tmp/diff_new_pack.8MJ68Z/_new  2026-09-12 21:25:16.530329089 +0200
@@ -1,5 +1,5 @@
-mtime: 1785076317
-commit: 9c478ee3d9b82223c407a6c656c270c98f7b7184c926ec2b46e551fa0e6aaf48
+mtime: 1789158973
+commit: 40fbb9ef8b23b147e0709edc30cccb9af7f7f07455a3ea857da8222edc86b4fc
 url: https://src.opensuse.org/jengelh/libxmp
 revision: master
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-09-11 22:36:13.000000000 +0200
@@ -0,0 +1 @@
+.osc

++++++ libxmp-4.7.2.tar.gz -> libxmp-4.7.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/CMakeLists.txt 
new/libxmp-4.7.3/CMakeLists.txt
--- old/libxmp-4.7.2/CMakeLists.txt     2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/CMakeLists.txt     2026-09-11 04:10:10.000000000 +0200
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.2...3.10)
-project(libxmp VERSION 4.7.2 LANGUAGES C)
+project(libxmp VERSION 4.7.3 LANGUAGES C)
 
 set(LIBXMP_DEFINES)
 set(LIBXMPLITE_DEFINES)
@@ -139,7 +139,15 @@
         if(APPLE)
             set_property(TARGET xmp_shared APPEND_STRING PROPERTY
                          LINK_FLAGS " -Wl,-undefined,error")
+            if(NOT HAVE_CLANG)
+              set_property(TARGET xmp_shared APPEND_STRING PROPERTY
+                         LINK_FLAGS " -static-libgcc")
+            endif()
         elseif(NOT CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
+            if(MINGW)
+              set_property(TARGET xmp_shared APPEND_STRING PROPERTY
+                           LINK_FLAGS " -static-libgcc")
+            endif()
             cmake_push_check_state()
             set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
             check_c_compiler_flag("" HAVE_NO_UNDEFINED)
@@ -196,7 +204,15 @@
             if(APPLE)
                 set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY
                              LINK_FLAGS " -Wl,-undefined,error")
+                if(NOT HAVE_CLANG)
+                  set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY
+                             LINK_FLAGS " -static-libgcc")
+                endif()
             elseif(NOT CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
+                if(MINGW)
+                  set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY
+                               LINK_FLAGS " -static-libgcc")
+                endif()
                 cmake_push_check_state()
                 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
                 check_c_compiler_flag("" HAVE_NO_UNDEFINED)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/configure new/libxmp-4.7.3/configure
--- old/libxmp-4.7.2/configure  2026-07-26 13:50:50.000000000 +0200
+++ new/libxmp-4.7.3/configure  2026-09-11 04:10:50.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for libxmp 4.7.2.
+# Generated by GNU Autoconf 2.69 for libxmp 4.7.3.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@
 # Identity of this package.
 PACKAGE_NAME='libxmp'
 PACKAGE_TARNAME='libxmp'
-PACKAGE_VERSION='4.7.2'
-PACKAGE_STRING='libxmp 4.7.2'
+PACKAGE_VERSION='4.7.3'
+PACKAGE_STRING='libxmp 4.7.3'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1256,7 +1256,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures libxmp 4.7.2 to adapt to many kinds of systems.
+\`configure' configures libxmp 4.7.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1321,7 +1321,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libxmp 4.7.2:";;
+     short | recursive ) echo "Configuration of libxmp 4.7.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1417,7 +1417,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libxmp configure 4.7.2
+libxmp configure 4.7.3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1782,7 +1782,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libxmp $as_me 4.7.2, which was
+It was created by libxmp $as_me 4.7.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4263,7 +4263,14 @@
 
 case "${host_os}" in
  openbsd*) ;;
- darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" ;;
+ darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error"
+    if test "$ac_cv_defined___clang__" = "no"; then
+       LDFLAGS="$LDFLAGS -static-libgcc"
+    fi
+    ;;
+ mingw*)
+    LDFLAGS="$LDFLAGS -static-libgcc -Wl,--no-undefined"
+    ;;
    *) if test "$ac_cv_defined___clang__" = "no" || test 
"${LDFLAGS#*fsanitize}" = "$LDFLAGS"
     then
       save_LDFLAGS="$LDFLAGS"
@@ -5026,11 +5033,11 @@
 
 libxmp_VERSION_MINOR=7
 
-libxmp_VERSION_PATCH=2
+libxmp_VERSION_PATCH=3
 
-libxmp_VERSION=4.7.2
+libxmp_VERSION=4.7.3
 
-libxmplite_VERSION=4.7.2
+libxmplite_VERSION=4.7.3
 
 
 ac_config_files="$ac_config_files Makefile"
@@ -5588,7 +5595,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libxmp $as_me 4.7.2, which was
+This file was extended by libxmp $as_me 4.7.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5641,7 +5648,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-libxmp config.status 4.7.2
+libxmp config.status 4.7.3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -6171,6 +6178,8 @@
   || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
 
+
+
   esac
 
 done # for ac_tag
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/configure.ac 
new/libxmp-4.7.3/configure.ac
--- old/libxmp-4.7.2/configure.ac       2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/configure.ac       2026-09-11 04:10:10.000000000 +0200
@@ -1,6 +1,6 @@
 m4_define([libxmp_VERSION_MAJOR_m4], [4])
 m4_define([libxmp_VERSION_MINOR_m4], [7])
-m4_define([libxmp_VERSION_PATCH_m4], [2])
+m4_define([libxmp_VERSION_PATCH_m4], [3])
 m4_define([libxmp_VERSION_m4], 
libxmp_VERSION_MAJOR_m4[.]libxmp_VERSION_MINOR_m4[.]libxmp_VERSION_PATCH_m4)
 
 AC_PREREQ(2.60)
@@ -70,9 +70,16 @@
 AC_CHECK_DEFINED(__cplusplus)
 
 case "${host_os}" in
-dnl Skip this on platforms where it is just simply busted.
+dnl Skip --no-undefined on platforms where it is just simply busted
  openbsd*) ;;
- darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" ;;
+ darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error"
+    if test "$ac_cv_defined___clang__" = "no"; then
+       LDFLAGS="$LDFLAGS -static-libgcc"
+    fi
+    ;;
+ mingw*)
+    LDFLAGS="$LDFLAGS -static-libgcc -Wl,--no-undefined"
+    ;;
  dnl For whatever reason, the Clang sanitizers and --no-undefined for
  dnl shared libraries are incompatible.
  *) if test "$ac_cv_defined___clang__" = "no" || test "${LDFLAGS#*fsanitize}" 
= "$LDFLAGS"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/docs/Changelog 
new/libxmp-4.7.3/docs/Changelog
--- old/libxmp-4.7.2/docs/Changelog     2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/docs/Changelog     2026-09-11 04:10:10.000000000 +0200
@@ -1,6 +1,19 @@
 Stable versions
 ---------------
 
+4.7.3 (20260911):
+       Changes by Alice Rowan:
+       - Fix hangs caused by changing the player mode to an S3M/IT mode
+         with a loaded module sequence beginning with pattern FF.
+       - Also fixed incomplete rescanning of modules in the same situation.
+         xmp now fully scans modules with an empty or invalid first sequence,
+         allowing later sequences in modules that begin with an end marker.
+       - Operations that rescan the module (changing XMP_PLAYER_MODE or
+         XMP_FLAGS_VBLANK; xmp_scan_module) now reset the current sequence.
+       - Fix missing bounds check on Protracker 2 sample changes that could
+         be reached by playing modules with instruments but no samples in
+         Protracker mode.
+
 4.7.2 (20260726):
        Changes by Alice Rowan:
        - Fix loading Startrekker modules from memory/handle/callbacks.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/include/xmp.h 
new/libxmp-4.7.3/include/xmp.h
--- old/libxmp-4.7.2/include/xmp.h      2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/include/xmp.h      2026-09-11 04:10:10.000000000 +0200
@@ -9,11 +9,11 @@
 extern "C" {
 #endif
 
-#define XMP_VERSION "4.7.2"
-#define XMP_VERCODE 0x040702
+#define XMP_VERSION "4.7.3"
+#define XMP_VERCODE 0x040703
 #define XMP_VER_MAJOR 4
 #define XMP_VER_MINOR 7
-#define XMP_VER_RELEASE 2
+#define XMP_VER_RELEASE 3
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
 # if defined(LIBXMP_STATIC)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/common.h 
new/libxmp-4.7.3/src/common.h
--- old/libxmp-4.7.2/src/common.h       2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/common.h       2026-09-11 04:10:10.000000000 +0200
@@ -175,9 +175,9 @@
 #define D_CRIT "  Error: "
 #define D_WARN "Warning: "
 #define D_INFO "   Info: "
+void libxmp_msvc_dbgprint(const char *text, ...);
 #ifdef DEBUG
 #define D_ libxmp_msvc_dbgprint  /* in win32.c */
-void libxmp_msvc_dbgprint(const char *text, ...);
 #else
 /* VS prior to VC7.1 does not support variadic macros.
  * VC8.0 does not optimize unused parameters passing. */
@@ -611,6 +611,7 @@
 
        int loop_count;
        int sequence;
+       int bad_sequence;               /* 1 = can't find next order, need 
reposition */
        unsigned char sequence_control[XMP_MAX_MOD_LENGTH];
 
        int smix_vol;                   /* SFX volume */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/control.c 
new/libxmp-4.7.3/src/control.c
--- old/libxmp-4.7.2/src/control.c      2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/control.c      2026-09-11 04:10:10.000000000 +0200
@@ -208,6 +208,7 @@
        p->ord = p->pos;
        p->row = row;
        p->frame = -1;
+       p->bad_sequence = 0;
        f->num_rows = mod->xxp[mod->xxo[p->ord]]->rows;
 
        return row;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/player.c 
new/libxmp-4.7.3/src/player.c
--- old/libxmp-4.7.2/src/player.c       2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/player.c       2026-09-11 04:10:10.000000000 +0200
@@ -563,7 +563,7 @@
 {
        struct xmp_sample *xxs = libxmp_get_sample(ctx, xc->smp);
        struct module_data *m = &ctx->m;
-       int lps = 0, len = -1;
+       int lps = -1, lpe = -1, len = -1;
 
        /* If an instrument number is present, reset the position. */
        if (ctx->p.frame == 0 && TEST(NEW_INS)) {
@@ -573,25 +573,26 @@
        xc->invloop.count += invloop_table[xc->invloop.speed];
 
        if (xxs != NULL) {
+               len = xxs->len;
                if (xxs->flg & XMP_SAMPLE_LOOP) {
                        lps = xxs->lps;
-                       len = xxs->lpe - lps;
+                       lpe = xxs->lpe;
                } else if (xxs->flg & XMP_SAMPLE_SLOOP) {
                        /* Some formats that support invert loop use sustain
                         * loops instead (Digital Symphony). */
                        lps = m->xtra[xc->smp].sus;
-                       len = m->xtra[xc->smp].sue - lps;
+                       lpe = m->xtra[xc->smp].sue;
                }
        }
 
-       if (len >= 0 && xc->invloop.count >= 128) {
+       if (lps >= 0 && lps <= lpe && xc->invloop.count >= 128) {
                xc->invloop.count = 0;
 
-               if (++xc->invloop.pos > len) {
+               if (++xc->invloop.pos > lpe - lps) {
                        xc->invloop.pos = 0;
                }
 
-               if (xxs->data == NULL) {
+               if (xxs->data == NULL || lps >= len || lpe > len) {
                        return;
                }
 
@@ -1733,45 +1734,66 @@
  * Sequencing
  */
 
-static void next_order(struct context_data *ctx, int last_ord)
+static int skip_invalid_orders(struct context_data *ctx)
+{
+       struct player_data *p = &ctx->p;
+       struct module_data *m = &ctx->m;
+       struct xmp_module *mod = &m->mod;
+
+       if (p->ord < 0) {
+               p->ord = 0;
+       }
+
+       for (;;) {
+               if (p->ord >= mod->len ||
+                   (HAS_QUIRK(QUIRK_MARKER) && mod->xxo[p->ord] == 
XMP_MARK_END)) {
+                       return -1;
+               }
+               if (mod->xxo[p->ord] < mod->pat) {
+                       break;
+               }
+               p->ord++;
+       }
+       return 0;
+}
+
+static int next_order(struct context_data *ctx, int last_ord)
 {
        struct player_data *p = &ctx->p;
        struct flow_control *f = &p->flow;
        struct module_data *m = &ctx->m;
        struct xmp_module *mod = &m->mod;
-       int reset_gvol = 0;
-       int mark;
        int i;
 
-       do {
-               p->ord++;
+       p->ord++;
 
+       if (skip_invalid_orders(ctx) < 0) {
                /* Restart module */
-               mark = HAS_QUIRK(QUIRK_MARKER) && p->ord < mod->len &&
-                      mod->xxo[p->ord] == XMP_MARK_END;
-               if (p->ord >= mod->len || mark) {
-                       if (mod->rst > mod->len ||
-                           mod->xxo[mod->rst] >= mod->pat ||
-                           p->ord < m->seq_data[p->sequence].entry_point) {
-                               p->ord = m->seq_data[p->sequence].entry_point;
+               if (mod->rst > mod->len ||
+                   mod->xxo[mod->rst] >= mod->pat ||
+                   p->ord < m->seq_data[p->sequence].entry_point) {
+                       p->ord = m->seq_data[p->sequence].entry_point;
+               } else {
+                       if (libxmp_get_sequence(ctx, mod->rst) == p->sequence) {
+                               p->ord = mod->rst;
                        } else {
-                               if (libxmp_get_sequence(ctx, mod->rst) == 
p->sequence) {
-                                       p->ord = mod->rst;
-                               } else {
-                                       p->ord = 
m->seq_data[p->sequence].entry_point;
-                               }
+                               p->ord = m->seq_data[p->sequence].entry_point;
                        }
-                       /* This might be a marker, so delay updating global
-                        * volume until an actual pattern is found */
-                       reset_gvol = 1;
-                       /* Module restart should always reset the play time. */
-                       last_ord = -1;
                }
-       } while (mod->xxo[p->ord] >= mod->pat);
-
-       if (reset_gvol)
+               /* Nothing valid, even from the entry point? Fail.
+                * This should be prevented by the scan, but check anyway. */
+               if (skip_invalid_orders(ctx) < 0) {
+                       p->bad_sequence = 1;
+                       return -1;
+               }
                p->gvol = m->xxo_info[p->ord].gvl;
 
+               /* Module restart should always reset the play time. */
+               last_ord = -1;
+       }
+       /* Playback now has a valid position. */
+       p->bad_sequence = 0;
+
        /* Bxx+Dxx within same position, Archimedes line jump,
         * etc. should not reset time tracking. */
        if (last_ord != p->ord)
@@ -1806,9 +1828,10 @@
                }
        }
 #endif
+       return 0;
 }
 
-static void next_row(struct context_data *ctx)
+static int next_row(struct context_data *ctx)
 {
        struct player_data *p = &ctx->p;
        struct flow_control *f = &p->flow;
@@ -1827,7 +1850,7 @@
                        f->jump = -1;
                }
 
-               next_order(ctx, last_ord);
+               return next_order(ctx, last_ord);
        } else {
                if (f->rowdelay == 0) {
                        p->row++;
@@ -1843,9 +1866,10 @@
 
                /* check end of pattern */
                if (p->row >= f->num_rows) {
-                       next_order(ctx, last_ord);
+                       return next_order(ctx, last_ord);
                }
        }
+       return 0;
 }
 
 #ifndef LIBXMP_CORE_DISABLE_IT
@@ -1958,6 +1982,7 @@
        p->current_time = 0;
        p->loop_count = 0;
        p->sequence = 0;
+       p->bad_sequence = 0;
 
        /* Set default volume and mute status */
        for (i = 0; i < XMP_MAX_CHANNELS; i++) {
@@ -1969,22 +1994,16 @@
                p->channel_vol[i] = 100;
        }
 
-       /* Skip invalid patterns at start (the seventh laboratory.it) */
-       while (p->ord < mod->len && mod->xxo[p->ord] >= mod->pat) {
-               p->ord++;
-       }
-       /* Check if all positions skipped */
-       if (p->ord >= mod->len) {
-               mod->len = 0;
-       }
-
-       if (mod->len == 0) {
-               /* set variables to sane state */
+       /* Handle markers/invalid patterns at start (the seventh laboratory.it).
+        * If there are no valid orders or if an end marker is found, set some
+        * safe default values (note: this previously zeroed mod->len). */
+       if (skip_invalid_orders(ctx) < 0) {
                /* Note: previously did this for mod->chn == 0, which caused
                 * crashes on invalid order 0s. 0 channel modules are 
technically
                 * valid (if useless) so just let them play normally. */
                p->ord = p->scan[0].ord = 0;
                p->row = p->scan[0].row = 0;
+               p->bad_sequence = 1;
                f->end_point = 0;
                f->num_rows = 0;
        } else {
@@ -2077,10 +2096,6 @@
                return -XMP_END;
        }
 
-       if (HAS_QUIRK(QUIRK_MARKER) && mod->xxo[p->ord] == XMP_MARK_END) {
-               return -XMP_END;
-       }
-
        /* check reposition */
        if (p->ord != p->pos || f->force_reposition) {
                int start = m->seq_data[p->sequence].entry_point;
@@ -2113,13 +2128,23 @@
                        p->ord = start - 1;
                }
 
-               next_order(ctx, -1);
+               if (next_order(ctx, -1) < 0) {
+                       /* Current sequence contains no valid orders;
+                        * playback can't continue. */
+                       return -XMP_END;
+               }
 
                update_from_ord_info(ctx);
 
                libxmp_virt_reset(ctx);
                reset_channels(ctx);
        } else {
+               /* Sequences with no valid orders can't continue playing from
+                * here and require manual repositioning to another sequence. */
+               if (p->bad_sequence) {
+                       return -XMP_END;
+               }
+
                p->frame++;
                if (p->frame >= (p->speed * (1 + f->delay))) {
                        /* If break during pattern delay, next row is skipped.
@@ -2127,12 +2152,15 @@
                         * EE2 + D31 ignores D00 in order 1C line 31. Reported
                         * by The Welder <[email protected]>, Jan 14 2012
                         */
-                       if (HAS_QUIRK(QUIRK_PROTRACK) && f->delay && f->pbreak)
-                       {
-                               next_row(ctx);
+                       if (HAS_QUIRK(QUIRK_PROTRACK) && f->delay && f->pbreak) 
{
+                               if (next_row(ctx) < 0) {
+                                       return -XMP_END;
+                               }
                                check_end_of_module(ctx);
                        }
-                       next_row(ctx);
+                       if (next_row(ctx) < 0) {
+                               return -XMP_END;
+                       }
                }
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/read_event.c 
new/libxmp-4.7.3/src/read_event.c
--- old/libxmp-4.7.2/src/read_event.c   2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/read_event.c   2026-09-11 04:10:10.000000000 +0200
@@ -406,7 +406,8 @@
         * of its loop (see above).
         */
        if (new_swap_ins && sub && HAS_QUIRK(QUIRK_PROTRACK) && 
TEST_NOTE(NOTE_SET)) {
-               libxmp_virt_queuepatch(ctx, chn, e->ins - 1, sub->sid, 
xc->note);
+               int smp = IS_VALID_SAMPLE(sub->sid) ? sub->sid : -1;
+               libxmp_virt_queuepatch(ctx, chn, e->ins - 1, smp, xc->note);
                xc->smp = sub->sid;
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/scan.c new/libxmp-4.7.3/src/scan.c
--- old/libxmp-4.7.2/src/scan.c 2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/scan.c 2026-09-11 04:10:10.000000000 +0200
@@ -665,6 +665,7 @@
                ctx->m.xxo_info[i].time = -1.0;
        }
        memset(ctx->p.sequence_control, NO_SEQUENCE, XMP_MAX_MOD_LENGTH);
+       memset(&ctx->p.scan[0], 0, sizeof(struct scan_data));
 }
 
 #ifndef LIBXMP_CORE_PLAYER
@@ -751,8 +752,7 @@
 #endif
 
        if (p->scan[0].time < 0.0) {
-               D_(D_CRIT "scan was not able to find any valid orders");
-               return -1;
+               D_(D_WARN "main sequence contains no valid orders");
        }
 
        while (1) {
@@ -812,5 +812,12 @@
                }
        }
 
+       /* If the module is currently playing, rescanning the sequences may
+        * invalidate the current sequence. */
+       if (ctx->state >= XMP_STATE_PLAYING) {
+               seq = libxmp_get_sequence(ctx, p->pos);
+               p->sequence = (seq != NO_SEQUENCE) ? seq : 0;
+       }
+
        return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libxmp-4.7.2/src/win32.c new/libxmp-4.7.3/src/win32.c
--- old/libxmp-4.7.2/src/win32.c        2026-07-26 13:50:10.000000000 +0200
+++ new/libxmp-4.7.3/src/win32.c        2026-09-11 04:10:10.000000000 +0200
@@ -1,5 +1,5 @@
 /* Extended Module Player
- * Copyright (C) 1996-2021 Claudio Matsuoka and Hipolito Carraro Jr
+ * Copyright (C) 1996-2026 Claudio Matsuoka and Hipolito Carraro Jr
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -55,12 +55,11 @@
 #endif
 
 /* Win32 debug message helper by Mirko Buffoni */
-#if defined(_MSC_VER) && defined(DEBUG)
+#if defined(_MSC_VER)
 void libxmp_msvc_dbgprint(const char *format, ...)
 {
        va_list argptr;
 
-       /* do the output */
        va_start(argptr, format);
        vprintf(format, argptr);
        printf("\n");

Reply via email to