Executive summary: Segfault seems to be caused by libcrypto++ 5.6.0
compiled with g++ 4.3.3 on i386.


[ This email is CC'ed to the Debian Bug Tracking system for reference. ]


I am trying to find the cause of a segfault in an application (amule)
liked against libcrypto++ 5.6.0.  The segfault is only reported to
happen on i386, not amd64.  On i386, I can reproduce the segfault every
time I run the program.

To locate the problem I have compiled a version of libcrypto++ with no
optimisation (-O0).  The segfault seems to happen in the construction of
an AutoSeededRandomPool.  More specifically, it seems to happen in the
initialisation of a SHA256 used by the RandomPool.  The relevant lines
from sha.cpp is the following memcpy:

void SHA256::InitState(HashWordType *state)
{
        static const word32 s[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372,
0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};
        memcpy(state, s, sizeof(s));
}

Here is part of the backtrace from gdb:


Program received signal SIGSEGV, Segmentation fault.
memcpy () at ../sysdeps/i386/i686/memcpy.S:75
(gdb) bt full
#0  memcpy () at ../sysdeps/i386/i686/memcpy.S:75
No locals.
#1  0x084f15d8 in ?? ()
No symbol table info available.
#2  0xb7df5e09 in CryptoPP::SHA256::InitState (state=0xb7f70980) at sha.cpp:96
        s = {1779033703, 3144134277, 1013904242, 2773480762, 1359893119,
2600822924, 528734635, 1541459225}
#3  0x080c3784 in CryptoPP::IteratedHashWithStaticTransform<unsigned
int, CryptoPP::EnumToType<CryptoPP::ByteOrder, 1>, 64u, 32u,
CryptoPP::SHA256, 32u, true>::Init (this=0xbff79330) at
/usr/include/cryptopp/iterhash.h:90
No locals.
#4  0xb7cb94bc in IteratedHashWithStaticTransform (this=0xbff79330) at
iterhash.h:88
No locals.
#5  0xb7cb9525 in SHA256 (this=0xbff79330) at sha.h:21
No locals.
#6  0xb7dbf8c7 in CryptoPP::RandomPool::IncorporateEntropy (this=0x86e00e0,
    input=0x97a0978
"Ç\veL°DÏM\037fLTyóÉ\036\2072D2VïýÒI\030µrÚôs\004", length=32) at
randpool.cpp:26
        hash = {<CryptoPP::IteratedHashWithStaticTransform<unsigned int,
CryptoPP::EnumToType<CryptoPP::ByteOrder, 1>, 64u, 32u,
CryptoPP::SHA256, 32u, true>> =
{<CryptoPP::ClonableImpl<CryptoPP::SHA256,
CryptoPP::AlgorithmImpl<CryptoPP::IteratedHash<unsigned int,
CryptoPP::EnumToType<CryptoPP::ByteOrder, 1>, 64u,
CryptoPP::HashTransformation>, CryptoPP::SHA256> >> =
{<CryptoPP::AlgorithmImpl<CryptoPP::IteratedHash<unsigned int,
CryptoPP::EnumToType<CryptoPP::ByteOrder, 1>, 64u,
CryptoPP::HashTransformation>, CryptoPP::SHA256>> =
{<CryptoPP::IteratedHash<unsigned int,
CryptoPP::EnumToType<CryptoPP::ByteOrder, 1>, 64u,
CryptoPP::HashTransformation>> = {<CryptoPP::IteratedHashBase<unsigned
int, CryptoPP::HashTransformation>> = {<CryptoPP::HashTransformation>
= {<CryptoPP::Algorithm> = {<CryptoPP::Clonable> = {
                  _vptr.Clonable = 0x836ea88}, <No data fields>}, <No
data fields>}, m_countLo = 0, m_countHi = 0},
          static BLOCKSIZE = <optimized out>, static
cryptopp_assert_63 = <optimized out>,
          m_data = {<CryptoPP::SecBlock<unsigned int,
CryptoPP::FixedSizeAllocatorWithCleanup<unsigned int, 16u,
CryptoPP::NullAllocator<unsigned int>, false> >> = {m_alloc =
{<CryptoPP::AllocatorBase<unsigned int>> = {<No data fields>}, m_array
= {3080954372, 3086029504,
                  137769968, 139400664, 3220673400, 3086420352,
3220673500, 3083089170, 3220673500, 3086029504, 3220673400,
3083089259,
                  3220673500, 3086029504, 3220673416, 3083108035},
                m_fallbackAllocator =
{<CryptoPP::AllocatorBase<unsigned int>> = {<No data fields>}, <No
data fields>},
                m_allocated = true}, m_size = 16, m_ptr = 0xbff79340},
<No data fields>}}, <No data fields>}, <No data fields>},
    static DIGESTSIZE = <optimized out>,
    m_state = {<CryptoPP::FixedSizeSecBlock<unsigned int, 16u,
CryptoPP::FixedSizeAllocatorWithCleanup<unsigned int, 16u,
CryptoPP::NullAllocator<unsigned int>, true> >> =
{<CryptoPP::SecBlock<unsigned int,
CryptoPP::FixedSizeAllocatorWithCleanup<unsigned int, 16u,
CryptoPP::NullAllocator<unsigned int>, true> >> = {m_alloc =
{<CryptoPP::AllocatorBase<unsigned int>> = {<No data fields>}, m_array
= {4294967295,
              3086458868, 134580384, 3086460528, 3220673504,
3086397003, 3086460968, 0, 1, 1, 0, 134629935, 2114, 0, 139192488, 1,
              3080978708, 3086029504},
            m_fallbackAllocator = {<CryptoPP::AllocatorBase<unsigned
int>> = {<No data fields>}, <No data fields>},
            m_allocated = false}, m_size = 0, m_ptr = 0x0}, <No data
fields>}, <No data fields>}}, <No data fields>}
        key = (const byte *) 0xb7f70980 "Z\213\f$\211\004$\213D$\004Â\f"
#7  0xb7db11f2 in CryptoPP::AutoSeededRandomPool::Reseed
(this=0x86e00e0, blocking=false, seedSize=32) at osrng.cpp:164
        seed = {m_alloc = {<CryptoPP::AllocatorBase<unsigned char>> = {<No
data fields>}, <No data fields>}, m_size = 32,
  m_ptr = 0x97a0978 "Ç\veL°DÏM\037fLTyóÉ\036\2072D2VïýÒI\030µrÚôs\004"}
#8  0x082b81ae in AutoSeededRandomPool (this=0x86e00e0,
blocking=false, seedSize=32) at /usr/include/cryptopp/osrng.h:89


Stepping through the program on the way to this segfault, I noticed the
following strange thing during construction of the SHA256:


(gdb) bt full
#0  SecBlock (this=0xbfd200f0, size=16) at secblock.h:283
No locals.
#1  0xb7c1f051 in FixedSizeSecBlock (this=0xbfd200f0) at secblock.h:458
No locals.
#2  0xb7c22b2f in IteratedHash (this=0xbfd200e0) at iterhash.h:56
No locals.
#3  0xb7c60767 in AlgorithmImpl (this=0xbfd200e0) at simple.h:25
No locals.
#4  0xb7c60799 in ClonableImpl (this=0xbfd200e0) at simple.h:17
No locals.
#5  0xb7c62495 in IteratedHashWithStaticTransform (this=0xbfd200e0) at
iterhash.h:88
No locals.
#6  0xb7c62525 in SHA256 (this=0xbfd200e0) at sha.h:21
No locals.


Am I right in thinking that SecBlock(size=16) looks odd considering that
everything else in the trace use sizes of 32?

Cheers,
-- 
                                                    Jens Peter Secher.
_DD6A 05B0 174E BFB2 D4D9 B52E 0EE5 978A FE63 E8A1 jpsecher gmail com_.
A. Because it breaks the logical sequence of discussion.
Q. Why is top posting bad?



--
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to