On 2026-03-04 21:48:27 +0100, Sebastian Ramacher wrote:
> Package: release.debian.org
> Severity: normal
> Tags: trixie
> X-Debbugs-Cc: [email protected], [email protected]
> Control: affects -1 + src:mpg123
> User: [email protected]
> Usertags: pu
> 
> [ Reason ]
> The uploaded includes a targetted fix of #1129616 backported to stable.
> 
> [ Impact ]
> The bug causes issues with mp3 playback in mpd (see #1129612).
> 
> [ Tests ]
> No automated tests.
> 
> [ Risks ]
> The patches are easy to revert if they cause issues. The changes are in
> unstable since August 2025.
> 
> [ Checklist ]
>   [x] *all* changes are documented in the d/changelog
>   [x] I reviewed all changes and I approve them
>   [x] attach debdiff against the package in stable

Now with the correct debdiff attached.

Cheers
-- 
Sebastian Ramacher
diff --git a/debian/changelog b/debian/changelog
index 5289301..d2ef250 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+mpg123 (1.32.10-1+deb13u1) trixie; urgency=medium
+
+  * debian/gbp.conf: Switch to trixie branch
+  * debian/patches: Do not modify raw ID3v2 data while parsing (Closes:
+    #1129616)
+
+ -- Sebastian Ramacher <[email protected]>  Wed, 04 Mar 2026 21:10:27 +0100
+
 mpg123 (1.32.10-1) unstable; urgency=medium
 
   [ Bastien Roucariès ]
diff --git a/debian/gbp.conf b/debian/gbp.conf
index 4f24002..155e93d 100644
--- a/debian/gbp.conf
+++ b/debian/gbp.conf
@@ -1,3 +1,4 @@
 [DEFAULT]
 pristine-tar = True
 compression = bzip2
+debian-branch = trixie
diff --git 
a/debian/patches/0002-libmpg123-not-modifying-raw-ID3v2-tag-data-anymore-f.patch
 
b/debian/patches/0002-libmpg123-not-modifying-raw-ID3v2-tag-data-anymore-f.patch
new file mode 100644
index 0000000..bc16b63
--- /dev/null
+++ 
b/debian/patches/0002-libmpg123-not-modifying-raw-ID3v2-tag-data-anymore-f.patch
@@ -0,0 +1,160 @@
+From: thor <thor@35dc7657-300d-0410-a2e5-dc2837fedb53>
+Date: Thu, 31 Jul 2025 19:37:38 +0000
+Subject: libmpg123: not modifying raw ID3v2 tag data anymore for
+ store_id3_text() (bug 379)
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+I started with a routine expecting the encoding byte directly followed by the 
text
+data. Then we got data where the encoding is stored at some distance. I faked 
the
+former mode by modifying the input instead of doing the right thing which I 
finally
+did now: Hand in the encoding as separate function argument even if it is just 
the
+leading byte.
+
+Now parsing ID3v2 tags doesn't modify the data you get from 
MPG123_STORE_RAW_ID3.
+For all earlier releases, You need to combine MPG123_STORE_RAW_ID3 with
+MPG123_SKIP_ID3V2 to avoid messing with the data. This was the initial use 
case —
+client code wants the raw data to decode itself, not let libmpg123 do it. We 
just
+forgot that you can do both …
+
+git-svn-id: svn://scm.orgis.org/mpg123/trunk@5518 
35dc7657-300d-0410-a2e5-dc2837fedb53
+---
+ src/libmpg123/id3.c | 41 +++++++++++++++++++++++------------------
+ 1 file changed, 23 insertions(+), 18 deletions(-)
+
+diff --git a/src/libmpg123/id3.c b/src/libmpg123/id3.c
+index 0bd5cda..20eaa9c 100644
+--- a/src/libmpg123/id3.c
++++ b/src/libmpg123/id3.c
+@@ -330,9 +330,9 @@ void INT123_id3_link(mpg123_handle *fr)
+       Since we can overwrite strings with ID3 update frames, don't free
+       memory, just grow strings.
+ */
+-static void store_id3_text(mpg123_string *sb, unsigned char *source, size_t 
source_size, const int noquiet, const int notranslate)
++static void store_id3_text(mpg123_string *sb, unsigned char encoding, 
unsigned char *source
++,     size_t source_size, const int noquiet, const int notranslate)
+ {
+-      unsigned char encoding;
+       if(sb) // Always overwrite, even with nothing.
+               sb->fill = 0;
+       if(!source_size)
+@@ -356,14 +356,13 @@ static void store_id3_text(mpg123_string *sb, unsigned 
char *source, size_t sour
+               return;
+       }
+ 
+-      encoding = source[0];
+       if(encoding > mpg123_id3_enc_max)
+       {
+               if(noquiet)
+                       error1("Unknown text encoding %u, I take no chances, 
sorry!", encoding);
+               return;
+       }
+-      INT123_id3_to_utf8(sb, encoding, source+1, source_size-1, noquiet);
++      INT123_id3_to_utf8(sb, encoding, source, source_size, noquiet);
+ 
+       if(sb->fill) debug1("UTF-8 string (the first one): %s", sb->p);
+       else if(noquiet) error("unable to convert string to UTF-8 (out of 
memory, junk input?)!");
+@@ -449,6 +448,11 @@ static void process_text(mpg123_handle *fr, unsigned char 
*realdata, size_t real
+ {
+       /* Text encoding          $xx */
+       /* The text (encoded) ... */
++      if(realsize < 1)
++      {
++              if(NOQUIET) error("Not even an encoding byte?");
++              return;
++      }
+       mpg123_text *t = add_text(fr, id);
+       if(VERBOSE4) fprintf(stderr, "Note: Storing text from %s encoding\n", 
enc_name(realdata[0]));
+       if(t == NULL)
+@@ -460,7 +464,8 @@ static void process_text(mpg123_handle *fr, unsigned char 
*realdata, size_t real
+       ?       (char[5]) { t->id[0], t->id[1], t->id[2], t->id[3], 0 }
+       :       "(nil)" );
+       memcpy(t->id, id, 4);
+-      store_id3_text(&t->text, realdata, realsize, NOQUIET, fr->p.flags & 
MPG123_PLAIN_ID3TEXT);
++      store_id3_text( &t->text, realdata[0], realdata+1, realsize-1
++      ,       NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT );
+       if(VERBOSE4) // Do not print unsanitized text to terminals!
+               fprintf(stderr, "Note: ID3v2 %c%c%c%c text frame stored\n", 
id[0], id[1], id[2], id[3]);
+ }
+@@ -577,8 +582,6 @@ static void process_comment(mpg123_handle *fr, enum 
frame_types tt, unsigned cha
+               return;
+       }
+       memcpy(lang, realdata+1, 3);
+-      /* Now I can abuse a byte from lang for the encoding. */
+-      descr[-1] = encoding;
+       /* Be careful with finding the end of description, I have to honor 
encoding here. */
+       text = next_text(descr, encoding, realsize-(descr-realdata));
+       if(text == NULL)
+@@ -591,14 +594,14 @@ static void process_comment(mpg123_handle *fr, enum 
frame_types tt, unsigned cha
+               mpg123_string description;
+               mpg123_init_string(&description);
+               // Store the text, with desired encoding, but for comments 
always a local copy in UTF-8.
+-              store_id3_text( &description, descr-1, text-descr+1
++              store_id3_text( &description, encoding, descr, text-descr
+               ,       NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT );
+               if(tt == comment)
+-                      store_id3_text( &localcom.description, descr-1, 
text-descr+1
++                      store_id3_text( &localcom.description, encoding, descr, 
text-descr
+                       ,       NOQUIET, 0 );
+               if(VERBOSE4)
+                       fprintf( stderr, "Note: Storing comment from %s 
encoding\n"
+-                      ,       enc_name(realdata[0]) );
++                      ,       enc_name(encoding) );
+               xcom = tt == uslt
+               ?       add_uslt(fr, lang, &description)
+               :       add_comment(fr, lang, &description);
+@@ -616,8 +619,8 @@ static void process_comment(mpg123_handle *fr, enum 
frame_types tt, unsigned cha
+               mpg123_move_string(&description, &xcom->description);
+       }
+ 
+-      text[-1] = encoding; /* Byte abusal for encoding... */
+-      store_id3_text(&xcom->text, text-1, realsize+1-(text-realdata), 
NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT);
++      store_id3_text( &xcom->text, encoding, text, realsize-(text-realdata)
++      ,       NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT );
+       /* Remember: I will probably decode the above (again) for rva comment 
checking. So no messing around, please. */
+ 
+       if(VERBOSE4) /* Do _not_ print the verbatim text: The encoding might be 
funny! */
+@@ -641,7 +644,8 @@ static void process_comment(mpg123_handle *fr, enum 
frame_types tt, unsigned cha
+               if((rva_mode > -1) && (fr->rva.level[rva_mode] <= rva_level))
+               {
+                       /* Only translate the contents in here where we really 
need them. */
+-                      store_id3_text(&localcom.text, text-1, 
realsize+1-(text-realdata), NOQUIET, 0);
++                      store_id3_text( &localcom.text, encoding, text, 
realsize-(text-realdata)
++                      ,       NOQUIET, 0 );
+                       if(localcom.text.fill > 0)
+                       {
+                               fr->rva.gain[rva_mode] = (float) 
atof(localcom.text.p);
+@@ -689,7 +693,7 @@ static void process_extra(mpg123_handle *fr, unsigned 
char* realdata, size_t rea
+               mpg123_init_string(&description);
+               /* The outside storage gets reencoded to UTF-8 only if not 
requested otherwise.
+                  Remember that we really need the -1 here to hand in the 
encoding byte!*/
+-              store_id3_text( &description, descr-1, text-descr+1
++              store_id3_text( &description, encoding, descr, text-descr
+               ,       NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT );
+               xex = add_extra(fr, &description);
+               if(xex)
+@@ -706,10 +710,10 @@ static void process_extra(mpg123_handle *fr, unsigned 
char* realdata, size_t rea
+       init_mpg123_text(&localex); /* For our local copy. */
+ 
+       /* Our local copy is always stored in UTF-8! */
+-      store_id3_text(&localex.description, descr-1, text-descr+1, NOQUIET, 0);
++      store_id3_text(&localex.description, encoding, descr, text-descr, 
NOQUIET, 0);
+       /* At first, only store the outside copy of the payload. We may not 
need the local copy. */
+-      text[-1] = encoding;
+-      store_id3_text(&xex->text, text-1, realsize-(text-realdata)+1, NOQUIET, 
fr->p.flags & MPG123_PLAIN_ID3TEXT);
++      store_id3_text( &xex->text, encoding, text, realsize-(text-realdata)
++      ,       NOQUIET, fr->p.flags & MPG123_PLAIN_ID3TEXT );
+ 
+       /* Now check if we would like to interpret this extra info for RVA. */
+       if(localex.description.fill > 0)
+@@ -737,7 +741,8 @@ static void process_extra(mpg123_handle *fr, unsigned 
char* realdata, size_t rea
+               if((rva_mode > -1) && (fr->rva.level[rva_mode] <= rva_level))
+               {
+                       /* Now we need the translated copy of the data. */
+-                      store_id3_text(&localex.text, text-1, 
realsize-(text-realdata)+1, NOQUIET, 0);
++                      store_id3_text( &localex.text, encoding, text, 
realsize-(text-realdata)
++                      ,       NOQUIET, 0 );
+                       if(localex.text.fill > 0)
+                       {
+                               if(is_peak)
diff --git 
a/debian/patches/0003-libmpg123-fix-store_id3_text-to-prepend-encoding-for.patch
 
b/debian/patches/0003-libmpg123-fix-store_id3_text-to-prepend-encoding-for.patch
new file mode 100644
index 0000000..7c76663
--- /dev/null
+++ 
b/debian/patches/0003-libmpg123-fix-store_id3_text-to-prepend-encoding-for.patch
@@ -0,0 +1,39 @@
+From: thor <thor@35dc7657-300d-0410-a2e5-dc2837fedb53>
+Date: Thu, 31 Jul 2025 19:56:03 +0000
+Subject: libmpg123: fix store_id3_text() to prepend encoding for
+ MPG123_PLAIN_ID3TEXT
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+… fixing the regression introduced by the fix for bug 279.
+
+git-svn-id: svn://scm.orgis.org/mpg123/trunk@5520 
35dc7657-300d-0410-a2e5-dc2837fedb53
+---
+ src/libmpg123/id3.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/src/libmpg123/id3.c b/src/libmpg123/id3.c
+index 20eaa9c..cb73bd5 100644
+--- a/src/libmpg123/id3.c
++++ b/src/libmpg123/id3.c
+@@ -345,14 +345,15 @@ static void store_id3_text(mpg123_string *sb, unsigned 
char encoding, unsigned c
+       if(notranslate)
+       {
+               /* Future: Add a path for ID3 errors. */
+-              if(!mpg123_grow_string(sb, source_size))
++              if(!mpg123_grow_string(sb, source_size+1))
+               {
+                       if(noquiet) error("Cannot resize target string, out of 
memory?");
+                       return;
+               }
+-              memcpy(sb->p, source, source_size);
+-              sb->fill = source_size;
+-              debug1("stored undecoded ID3 text of size %zu", source_size);
++              sb->p[0] = (char)encoding;
++              memcpy(sb->p+1, source, source_size);
++              sb->fill = source_size+1;
++              debug1("stored undecoded ID3 text of size %zu", source_size+1);
+               return;
+       }
+ 
diff --git a/debian/patches/series b/debian/patches/series
index a7fb829..3e782c4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,3 @@
 0001-Disable-function-mpg123_noise.patch
+0002-libmpg123-not-modifying-raw-ID3v2-tag-data-anymore-f.patch
+0003-libmpg123-fix-store_id3_text-to-prepend-encoding-for.patch

Reply via email to