From 9a621647beb1fb4e572fe504db5d7317fcf409b4 Mon Sep 17 00:00:00 2001 From: mchinen Date: Thu, 24 May 2012 01:04:14 +0000 Subject: [PATCH] Fix Bug 504 (P2) - PPC Macs crash importing MP3 files with "guess_file_type" error in id3.c: psf->fileoffset is a sf_count_t, which is int64_t, which is larger than size_t on a G4 PPC. Since psf_binheader_readf expects that argument to be the smaller size_t, it ends up seeking over and over to the zero position since the larger bits of the variable are all zeros. Patch simply casts to size_t. Patch sent upstream as well. --- lib-src/audacity-patches.txt | 2 ++ ...ibsndfile-ppc-crash-on-some-id3-mp3s.patch | 22 +++++++++++++++++++ lib-src/libsndfile/src/id3.c | 4 ++-- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 lib-src/libsndfile/libsndfile-ppc-crash-on-some-id3-mp3s.patch diff --git a/lib-src/audacity-patches.txt b/lib-src/audacity-patches.txt index d60a5f36a..e3f683fd1 100644 --- a/lib-src/audacity-patches.txt +++ b/lib-src/audacity-patches.txt @@ -96,6 +96,8 @@ Patches: endian.m4, lrint.m4, llrint.m4, lrintf.m4, clip_mode.m4 copied from libsndfile's M4/. signal.m4 created out of the tail of acinclude.m4 with the remaining necessary macro + libsndfile-ppc-crash-on-some-id3-mp3s.patch - submitted to libsndfile + list on may 22 2012 (mchinen) AM_MAINTAINER_MODE has been added to configure.ac to disable autotools rebuilds by default Upstream Version: 0.1.7 diff --git a/lib-src/libsndfile/libsndfile-ppc-crash-on-some-id3-mp3s.patch b/lib-src/libsndfile/libsndfile-ppc-crash-on-some-id3-mp3s.patch new file mode 100644 index 000000000..fba530292 --- /dev/null +++ b/lib-src/libsndfile/libsndfile-ppc-crash-on-some-id3-mp3s.patch @@ -0,0 +1,22 @@ +Index: libsndfile/src/id3.c +=================================================================== +--- libsndfile/src/id3.c (revision 11748) ++++ libsndfile/src/id3.c (working copy) +@@ -32,7 +32,7 @@ + { unsigned char buf [10] ; + + memset (buf, 0, sizeof (buf)) ; +- psf_binheader_readf (psf, "pb", 0, buf, 10) ; ++ psf_binheader_readf (psf, "pb", (size_t)0, buf, 10) ; + + if (buf [0] == 'I' && buf [1] == 'D' && buf [2] == '3') + { int offset = buf [6] & 0x7f ; +@@ -48,7 +48,7 @@ + + /* Calculate new file offset and position ourselves there. */ + psf->fileoffset += offset + 10 ; +- psf_binheader_readf (psf, "p", psf->fileoffset) ; ++ psf_binheader_readf (psf, "p", (size_t)psf->fileoffset) ; + + return 1 ; + } ; diff --git a/lib-src/libsndfile/src/id3.c b/lib-src/libsndfile/src/id3.c index 2fd0a0b97..8d1b72987 100644 --- a/lib-src/libsndfile/src/id3.c +++ b/lib-src/libsndfile/src/id3.c @@ -32,7 +32,7 @@ id3_skip (SF_PRIVATE * psf) { unsigned char buf [10] ; memset (buf, 0, sizeof (buf)) ; - psf_binheader_readf (psf, "pb", 0, buf, 10) ; + psf_binheader_readf (psf, "pb", (size_t)0, buf, 10) ; if (buf [0] == 'I' && buf [1] == 'D' && buf [2] == '3') { int offset = buf [6] & 0x7f ; @@ -48,7 +48,7 @@ id3_skip (SF_PRIVATE * psf) /* Calculate new file offset and position ourselves there. */ psf->fileoffset += offset + 10 ; - psf_binheader_readf (psf, "p", psf->fileoffset) ; + psf_binheader_readf (psf, "p", (size_t)psf->fileoffset) ; return 1 ; } ;