반응형

암호화 모듈을 pure Java모듈을 사용하다가 native를 사용하면 더 빠를 것이라는 의견이 있어 JNI with C++로 구현하였다.


테스트 중 native에서 자꾸만 "stack corruption detected: aborted" 에러가 발생하며 앱이 죽는 문제가 발생했다.


죽는 상황은 encryption/decryption시 원본 데이터의 크기가 native에서 선언 된 임시 버퍼인 unsigned char 배열의 크기보다 큰 경우에만 발생하였다.


어제/오늘 총 6시간 가까이 소스를 아무리 봐도... 로그를 아무리 확인해봐도... 문법적으로, 논리적으로 틀린곳이 없었다..


에러 내용으로 유추해보면 임시 버퍼를 잘 못 건들거나, 원본 데이터나 결과 데이터를 잘 못 조작하는 경우이고, 원본/결과 데이터를 건드는 곳은 전혀 문제가 없음을 확인했다.


임시 버퍼의 마지막 원소 다음 위치의 값을 확인한 결과 EVP_CipherUpdate실행 후 변경되는 것을 확인하였다. 하지만 EVP_CipherUpdate이 결과값을 리턴하는 것은 정확히 임시버퍼의 크기만큼여서 의심하지 않고 넘어갔었는데.. 결국 EVP_CipherUpdate에서 결과 값 외에도 뭔가 건드는 것이 있는 것으로 판단되어 임시버퍼의 크기를 암호화 알고리즘의 블럭 사이즈만큼 크게 잡아주니 정상 처리 된다.


=> update함수에 대한 설명을 좀 찾아보니 out length + BLOCK_SIZE - 1 만큼의 크기를 out buffer로 잡아주어야 된다고 되어 있다 ㅡㅡ;

+ Recent posts