Fix DYNINST_index_lock state and ppc64 writeFunctionPtr
authorJosh Stone <jistone@redhat.com>
Thu, 17 Oct 2013 23:05:25 +0000 (16:05 -0700)
committerJosh Stone <jistone@redhat.com>
Thu, 24 Oct 2013 06:42:09 +0000 (23:42 -0700)
commit1e8829db4898d2143e1bc2860bc5667ac979a1ce
tree7519efdf42944f2ddcca4003abe7c1394af3ba18
parentd8b45719a9d1347a1c79e8eead12a7c3983a4019
Fix DYNINST_index_lock state and ppc64 writeFunctionPtr

There are two fixes in this patch to resolve hangs that we've seen on
ppc64 tests, most notably in test_thread_5.

The first is that DYNINST_index_lock may be left in a locked state from
DYNINSTthreadIndexSLOW when DYNINST_thread_hash_size is 0.  This simply
needs an unlock in that error path.

The second resolves *why* DYNINST_thread_hash_size is 0, even after it
was correctly initialized to 40.  This turned out to be corruption when
the mutator writeFunctionPtr sets DYNINST_pthread_self.  Those symbols
in libdyninstAPI_RT.so happen to be arranged like so:

    0000000000031180 B DYNINST_pthread_self
    0000000000031188 B DYNINST_sysEntry
    0000000000031190 B DYNINST_thread_hash_size

So writeFunctionPtr was sending three longs: the function descriptor
correctly in DYNINST_pthread_self; the toc in DYNINST_sysEntry, a dead
variable; and the guilty 0x0 in DYNINST_thread_hash_size.  The only
thing a function pointer actually needs is the function descriptor.

For comparison, on EL5 and EL6 our build has the symbols like so:

    000000000002c400 B DYNINST_pthread_self
    000000000002c408 B DYNINSTlinkSave
    000000000002c410 B DYNINSTtocSave
    000000000002c418 B DYNINST_sysEntry
    000000000002c420 B DYNINST_thread_hash_tids
    000000000002c428 B DYNINST_thread_hash_size

So that still clobbered data, but DYNINSTlinkSave and DYNINSTtocSave are
both unused variables -- no harm done.

Signed-off-by: Josh Stone <jistone@redhat.com>
dyninstAPI/src/inst-power.C
dyninstAPI_RT/src/RTthread.c