I ran into the same issue.

Here's what appears to be happening:
1. ogg123 has a latent bug in how it handles a pthread mutex-- it always tries 
to unlock that mutex before exiting, even if the mutex is unlocked already. 
glibc on older CPUs tolerates this, which is why nobody has noticed until now.
2. glibc has implemented lock elision for CPUs that have working TSX 
(transactional memory) instructions.  When pthreads uses this lock elision 
code, unlocking an unlocked mutex segfaults.
3. If you have a new enough CPU that TSX instructions are usable (some CPUs 
have them disabled due to hardware bugs), ogg123 will segfault after it's done 
playing the file.  The segfault will always happen in  __lll_unlock_elision().

The vorbis-tools code hasn't changed in ages, so it's likely that this
happens on every distro shipping a modern glibc with lock elision
enabled.

I have some sample code here to demonstrate the glibc behavior on
different CPUs: https://codeandbitters.com/2016/04/18/fun-with-lock-
elision/

If you want a workaround for ogg123, this change seems to work for me:

--- a/ogg123/status.c
+++ b/ogg123/status.c
@@ -339,6 +339,7 @@ void status_deinit ()
 
 void status_reset_output_lock ()
 {
+  pthread_mutex_trylock(&output_lock);
   pthread_mutex_unlock(&output_lock);
 }

-- 
You received this bug notification because you are a member of Desktop
Packages, which is subscribed to vorbis-tools in Ubuntu.
https://bugs.launchpad.net/bugs/1334204

Title:
  ogg123 crashes after playing sound file

Status in vorbis-tools package in Ubuntu:
  New

Bug description:
  $ gdb --args `which ogg123` redalert.ogg
  GNU gdb (Ubuntu 7.7.1-0ubuntu3) 7.7.1
  Copyright (C) 2014 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This is free software: you are free to change and redistribute it.
  There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
  and "show warranty" for details.
  This GDB was configured as "x86_64-linux-gnu".
  Type "show configuration" for configuration details.
  For bug reporting instructions, please see:
  <http://www.gnu.org/software/gdb/bugs/>.
  Find the GDB manual and other documentation resources online at:
  <http://www.gnu.org/software/gdb/documentation/>.
  For help, type "help".
  Type "apropos word" to search for commands related to "word"...
  Reading symbols from /usr/bin/ogg123...(no debugging symbols found)...done.
  (gdb) r
  Starting program: /usr/bin/ogg123 redalert.ogg
  [Thread debugging using libthread_db enabled]
  Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

  Audio Device:   Advanced Linux Sound Architecture (ALSA) output

  [New Thread 0x7fffecd4d700 (LWP 10744)]
  Playing: redalert.ogg
  Ogg Vorbis stream: 1 channel, 22050 Hz
  [New Thread 0x7fffe3ffe700 (LWP 10745)]
  [Thread 0x7fffecd4d700 (LWP 10744) exited]3.0 kbps)  Output Buffer   0.0% 
(EOS) 

  Program received signal SIGSEGV, Segmentation fault.
  __lll_unlock_elision (lock=0x613c40, private=0) at 
../nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c:29
  29      ../nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c: No such file or 
directory.
  (gdb) bt full
  #0  __lll_unlock_elision (lock=0x613c40, private=0) at 
../nptl/sysdeps/unix/sysv/linux/x86/elision-unlock.c:29
  No locals.
  #1  0x000000000040895a in ?? ()
  No symbol table info available.
  #2  0x0000000000403bda in ?? ()
  No symbol table info available.
  #3  0x00007ffff661fec5 in __libc_start_main (main=0x403860, argc=2, 
argv=0x7fffffffda28, init=<optimized out>, fini=<optimized out>, 
rtld_fini=<optimized out>, stack_end=0x7fffffffda18) at libc-start.c:287
          result = <optimized out>
          unwind_buf = {cancel_jmp_buf = {{jmp_buf = {0, 4502378785248176378, 
4209892, 140737488345632, 0, 0, -4502378786266224390, -4502397425389737734}, 
mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x40dd40, 
                0x7fffffffda28}, data = {prev = 0x0, cleanup = 0x0, canceltype 
= 4250944}}}
          not_first_call = <optimized out>
  #4  0x0000000000403d0d in ?? ()
  No symbol table info available.
  #5  0x00007fffffffda18 in ?? ()
  No symbol table info available.
  #6  0x000000000000001c in ?? ()
  No symbol table info available.
  #7  0x0000000000000002 in ?? ()
  No symbol table info available.
  #8  0x00007fffffffdece in ?? ()
  No symbol table info available.
  #9  0x00007fffffffdede in ?? ()
  No symbol table info available.
  #10 0x0000000000000000 in ?? ()
  No symbol table info available.
  (gdb) 

  
  Every file I tried experiences the same crash.

  ProblemType: Bug
  DistroRelease: Ubuntu 14.10
  Package: vorbis-tools 1.4.0-1ubuntu3
  ProcVersionSignature: Ubuntu 3.15.0-6.11-generic 3.15.0
  Uname: Linux 3.15.0-6-generic x86_64
  ApportVersion: 2.14.3-0ubuntu2
  Architecture: amd64
  CurrentDesktop: Unity
  Date: Wed Jun 25 11:07:13 2014
  InstallationDate: Installed on 2014-04-11 (74 days ago)
  InstallationMedia: Ubuntu 14.04 LTS "Trusty Tahr" - Daily amd64 (20140409)
  SourcePackage: vorbis-tools
  UpgradeStatus: Upgraded to utopic on 2014-05-08 (47 days ago)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/vorbis-tools/+bug/1334204/+subscriptions

-- 
Mailing list: https://launchpad.net/~desktop-packages
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~desktop-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to