- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
LPBYTE OUTBUFF = NULL;
DWORD BUFFSIZE = 0;
...
int pgp_res = m_pgp.EncodeBuff2Buff(
( LPCVOID ) ( LPCTSTR ) post_data.c_str(),
( DWORD ) post_data.length(),
OUTBUFF,
BUFFSIZE,
( LPCTSTR ) query_mts_cfg().query_crypto_public_key().c_str() );
...
std::string s;
// мы будем рассматривать буфер как строку, а PGPEncode
// естественно не ограничивает буфер нулевым
// символом, поэтому строку из буфера надо
// ограничивать насильно
s = std::string( ( char* ) OUTBUFF );
s = s.substr( 0, BUFFSIZE );
1) Проблема проявилась после 5 лет боевой эксплуатации.
2) Все загодногожено было именно так. Т.е. автор понимал \0, сделал что-то, но все равно с ошибкой.
rat4 28.10.2010 20:27 # +1
KoirN 28.10.2010 22:03 # 0
bsivko 28.10.2010 22:57 # +1
absolut 30.10.2010 22:03 # 0
Первый раз за 5 лет появился 0 в данных ?
rat4 31.10.2010 15:26 # +1
bsivko 31.10.2010 18:00 # 0
Выход за пределы памяти произошел впервые в 16-й строке.
absolut 31.10.2010 19:51 # 0
bsivko 31.10.2010 22:03 # 0
При отработке конструктора (в 16-й строке) формируется C-шная строка, которая захватывает массив в BUFFSIZE и все остальное до тех пор, пока не встретит за OUTBUFF+BUFFSIZE нулевой код.
Программа ломается тогда, когда между OUTBUFF+BUFFSIZE и нулевым кодом окончания строки "заканчивается память" (на деле это undefined behavior).
absolut 31.10.2010 23:34 # 0
bsivko 31.10.2010 23:47 # +2
В конструктор передается указатель char * на строку, которая не строка, а потенциальный хлам. В результате при формировании строки конструктор читает память до тех пор, пока не встретит 0. И если в этом процессе происходит попытка доступа к памяти, которой нет либо нет доступа, то получаем undefined behavior.
Например вот эта программа у меня ломается:
#include <iostream>
int main ()
{
const unsigned int c_size = 100;
char * str = new char[c_size];
for( unsigned int i = 0; i < c_size; ++i )
str[i] = ' ';
for( unsigned int i = 0; i < c_size*2000; ++i )
std::cout << (int)str[i] << " ";
return 0;
}
absolut 31.10.2010 23:52 # 0