--- Begin Message ---
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
[x] the issue is verified as fixed in unstable
[ Other info ]
The package is already uploaded.
Cheers
--
Sebastian Ramacher
diff --git a/debian/changelog b/debian/changelog
index 5289301..b4d9c47 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+mpg123 (1.32.10-1+deb13u1) unstable; 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 20:59:43 +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
--- End Message ---