All pastes #291472 Raw Edit

Anonymous

public text v1 · immutable
#291472 ·published 2006-12-25 07:24 UTC
rendered paste body
gaim_network_set_upnp_port_mapping_cb(gboolean success, gpointer data)

// Crazy gcc optimization here to branch based on success, methinks
0x639ccf8 <+8>:    mflr    r0
0x639ccfc <+12>:   bcl-    20,4*cr7+so,0x639cd00 <+16>
0x639cd00 <+16>:   stw     r0,8(r1)
0x639cd04 <+20>:   mr      r30,r4			// $r30 = data = listen_data
0x639cd08 <+24>:   stwu    r1,-80(r1)
0x639cd0c <+28>:   mflr    r31
0x639cd10 <+32>:   bne+    0x639cd84 <+148>

// Not successful... print debug info
0x639cd14 <+36>:   addis   r3,r31,20
0x639cd18 <+40>:   addis   r4,r31,20
0x639cd1c <+44>:   addi    r3,r3,-18832
0x639cd20 <+48>:   addi    r4,r4,-18824
0x639cd24 <+52>:   bl      0x63a4ef0 <gaim_debug_info>

// if(listen_data->retry) {
0x639cd28 <+56>:   lwz     r0,8(r30) // listen_data->retry
0x639cd2c <+60>:   cmpwi   cr7,r0,0
0x639cd30 <+64>:   beq+    cr7,0x639cde0 <+240>

// true... gaim_network_get_port_from_fd()
0x639cd34 <+68>:   stw     r29,12(r30)
0x639cd38 <+72>:   stw     r29,8(r30)
0x639cd3c <+76>:   lwz     r3,0(r30)
0x639cd40 <+80>:   bl      0x639d1b4 <gaim_network_get_port_from_fd>

// Which socket type?
0x639cd44 <+84>:   lwz     r0,4(r30) // listen_data->socket_type
0x639cd48 <+88>:   cmpwi   cr7,r0,1
0x639cd4c <+92>:   bne+    cr7,0x639cd5c <+108>

// TCP
0x639cd50 <+96>:   addis   r4,r31,20 
0x639cd54 <+100>:  addi    r4,r4,-18792
0x639cd58 <+104>:  b       0x639cd64 <+116>

// UDP
0x639cd5c <+108>:  addis   r4,r31,20
0x639cd60 <+112>:  addi    r4,r4,-18788

// Call gaim_upnp_remorve_port_mapping with stuff from above
0x639cd64 <+116>:  lwz     r0,88(r1)
0x639cd68 <+120>:  addis   r5,r31,38
0x639cd6c <+124>:  addi    r1,r1,80
0x639cd70 <+128>:  lwz     r5,9724(r5)
0x639cd74 <+132>:  mr      r6,r30
0x639cd78 <+136>:  lmw     r28,-16(r1)
0x639cd7c <+140>:  mtlr    r0
0x639cd80 <+144>:  b       0x6383318 <gaim_upnp_remove_port_mapping>
// since the following statement is 'return', gcc optimizes with a non-linking branch

// } else if... {
0x639cd84 <+148>:  lwz     r0,12(r4)
0x639cd88 <+152>:  cmpwi   cr7,r0,0
0x639cd8c <+156>:  bne+    cr7,0x639cde0 <+240>

0x639cd90 <+160>:  li      r0,1
0x639cd94 <+164>:  lwz     r3,0(r4)
0x639cd98 <+168>:  stw     r0,12(r4)
0x639cd9c <+172>:  bl      0x639d1b4 <gaim_network_get_port_from_fd>
0x639cda0 <+176>:  lwz     r0,4(r30)
0x639cda4 <+180>:  cmpwi   cr7,r0,1
0x639cda8 <+184>:  bne+    cr7,0x639cdb8 <+200>

0x639cdac <+188>:  addis   r4,r31,20
0x639cdb0 <+192>:  addi    r4,r4,-18792
0x639cdb4 <+196>:  b       0x639cdc0 <+208>

0x639cdb8 <+200>:  addis   r4,r31,20
0x639cdbc <+204>:  addi    r4,r4,-18788

0x639cdc0 <+208>:  lwz     r0,88(r1)
0x639cdc4 <+212>:  addis   r5,r31,38
0x639cdc8 <+216>:  addi    r1,r1,80
0x639cdcc <+220>:  lwz     r5,9724(r5)
0x639cdd0 <+224>:  mr      r6,r30
0x639cdd4 <+228>:  lmw     r28,-16(r1)
0x639cdd8 <+232>:  mtlr    r0
0x639cddc <+236>:  b       0x63831bc <gaim_upnp_set_port_mapping>

// Function is done
0x639cde0 <+240>:  lwz     r12,16(r30) // listen_data->cb
0x639cde4 <+244>:  cmpwi   cr7,r12,0 // if it's null, 
0x639cde8 <+248>:  beq+    cr7,0x639cdfc <+268>

/* Crash in this block...
   cb is invalid, so it tries to branch and fails */
0x639cdec <+252>:  lwz     r3,0(r30)
0x639cdf0 <+256>:  mtctr   r12
0x639cdf4 <+260>:  lwz     r4,20(r30)
0x639cdf8 <+264>:  bctrl

// function is done!
0x639cdfc <+268>:  lwz     r0,88(r1)
0x639ce00 <+272>:  addi    r1,r1,80
0x639ce04 <+276>:  mr      r3,r30
0x639ce08 <+280>:  lmw     r28,-16(r1)
0x639ce0c <+284>:  mtlr    r0
0x639ce10 <+288>:  b       0x639d1b0 <gaim_network_listen_cancel>