summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-09-06 13:31:33 +0000
committerjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-09-06 13:31:33 +0000
commit11d695ebbfcc8530525ca58e2e943a096da8796f (patch)
tree8331b7c15228cf83474803b2fd477daa59fb631b /libmpdemux
parent512563bca0218eddb36e8ff976692c94ed8fd1f6 (diff)
downloadmpv-11d695ebbfcc8530525ca58e2e943a096da8796f.tar.bz2
mpv-11d695ebbfcc8530525ca58e2e943a096da8796f.tar.xz
SPARC gcc generates bad code accessing an unaligned and packed structure member
(See gcc problem report PR c/7847); mplayer crashes with SIGBUS signal. Added a workaround: copy the unaligned stucture member to a temporary local variable using memcpy, and use that in the code. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7297 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/open.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/libmpdemux/open.c b/libmpdemux/open.c
index 6d4473ca46..5b3bf25d14 100644
--- a/libmpdemux/open.c
+++ b/libmpdemux/open.c
@@ -654,8 +654,23 @@ read_next:
if(d->angle_seek){
int i,skip=0;
+#if defined(__GNUC__) && defined(__sparc__)
+ // workaround for a bug in the sparc version of gcc 2.95.X ... 3.2,
+ // it generates incorrect code for unaligned access to a packed
+ // structure member, resulting in an mplayer crash with a SIGBUS
+ // signal.
+ //
+ // See also gcc problem report PR c/7847:
+ // http://gcc.gnu.org/cgi-bin/gnatsweb.pl?database=gcc&cmd=view+audit-trail&pr=7847
+ for(i=0;i<9;i++){ // check if all values zero:
+ typeof(d->dsi_pack.sml_agli.data[i].address) tmp_addr;
+ memcpy(&tmp_addr,&d->dsi_pack.sml_agli.data[i].address,sizeof(tmp_addr));
+ if((skip=tmp_addr)!=0) break;
+ }
+#else
for(i=0;i<9;i++) // check if all values zero:
if((skip=d->dsi_pack.sml_agli.data[i].address)!=0) break;
+#endif
if(skip){
// sml_agli table has valid data (at least one non-zero):
d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+