I've disassembled the offending library code and looking at the register
dump we can learn a little more....

Firstly, I now think the problem is *not* in
ply_event_loop_process_pending_events() - it's in
ply_event_loop_handle_timeouts(). The reason for the confusion is that
it appears that gcc has optimized ply_event_loop_handle_timeouts() by
inlining it into ply_event_loop_process_pending_events(). So, if we now
look at ply_event_loop_handle_timeouts(), we can see the code that's
causing plymouthd to die:

1216   while (node != NULL)
1217     {
1218       ply_list_node_t *next_node;    
1219       ply_event_loop_timeout_watch_t *watch;
1220   
1221       watch = (ply_event_loop_timeout_watch_t *) ply_list_node_get_data 
(node); 
1222       next_node = ply_list_get_next_node (loop->timeout_watches, node); 
1223   
1224       if (watch->timeout <= now)     /* XXX: crash is triggered here */
1225         {

The offending line is 1224. In assembler this equates to:

    test   %ecx,0x4(%esi)

... where ecx=0x1 and esi = 0x0.

In pseudo-C-code though what is actually happening in plymouthd is:

  if ( NULL->timeout <= 1)

So the problem is that the timeout watch is NULL. Looking at the C code
shows that no check is performed on 'watch' being NULL or not - it's
just blindly dereferenced which causes the SIGSEGV. However, I can't yet
see how watch is ever NULL, unless it's that pesky alloca causing
undefined behaviour maybe.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/849414

Title:
  plymouthd crashed with SIGSEGV in
  ply_event_loop_process_pending_events()

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/plymouth/+bug/849414/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to