Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent stack corruption?

I'm trying to debug segfault in native app for android. GDB shows the following:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 5200]
0xbfcc6744 in ?? ()
(gdb) bt
#0  0xbfcc6744 in ?? ()
#1  0x5cfb5458 in WWMath::unProject (x=2.1136094475592566, y=472.2994384765625, z=0, mvpMatrix=@0x0, 
    viewport=@0x0, result=@0x0) at jni/src/core/util/WWMath.cpp:118
#2  0x00000000 in ?? ()

Is it possible to get a good stack? Or find a place where the stack was corrupted?

UPD: The function mentioned takes references:

bool WWMath::unProject(double x, double y, double z, const Matrix &mvpMatrix,
         const Rect& viewport, Vec4& result)

and reference to simple local variable is passed as the last argument:

Vec4 far, near;
if (!unProject(x, y, 0, tMvp, viewport, near))
like image 221
Equidamoid Avatar asked Aug 07 '12 11:08

Equidamoid


1 Answers

We don't have much information to go by! There is no general rule to avoid memory corruption except to be careful with addressing.

But it looks to me like you overflowed an array of floats, because the bogus address 0xbfcc6744 equates to a reasonable float value -1.597 which is in line with the other values reported by GDB.

Overwriting the return address caused execution to jump to that value, so look specifically at the caller of the function WWMath::unProject, whose locals precede its return address, to find the offending buffer. (And now we have it, near.)

like image 174
Potatoswatter Avatar answered Oct 07 '22 12:10

Potatoswatter