- Katılım
- 6 Kas 2021
- Mesajlar
- 3,491
- Tepkime puanı
- 4,992
- Puanları
- 113
- Yaş
- 31
- Konum
- Türkiye
- Dc
- fatihbulut
Selamlar,
Aktif sunucuda yaşadım, nasıl yapıldığını yazmıyorum başka sunucular patlatılmasın diye özetle CG_HANDSHAKE ile client DH2KeyAgreement oluştuktan sonra tekrar aynı paket gönderildiğinde duplike ediliyor, debug buildde burada hata durumu assert ettirilmiş, yani debug buildde bunu server hata olarak görüp crash oluyor fakat release buildde bu kontrol yok, bu sebeple duplike olduktan sonra cleanup olduğunda memory leak olmakta.
cipher.cpp
Arat:
metodu komple değiştir:
input.cpp
Arat:
Komple değiştir:
Değişiklikler aşağıdaki gibi olacaktır:
1
2
Aktif sunucuda yaşadım, nasıl yapıldığını yazmıyorum başka sunucular patlatılmasın diye özetle CG_HANDSHAKE ile client DH2KeyAgreement oluştuktan sonra tekrar aynı paket gönderildiğinde duplike ediliyor, debug buildde burada hata durumu assert ettirilmiş, yani debug buildde bunu server hata olarak görüp crash oluyor fakat release buildde bu kontrol yok, bu sebeple duplike olduktan sonra cleanup olduğunda memory leak olmakta.
cipher.cpp
Arat:
Kod:
size_t Cipher::Prepare(void* buffer, size_t* length)
Kod:
size_t Cipher::Prepare(void* buffer, size_t* length) {
// Prevent double initialization - memory corruption guard
if (key_agreement_ != NULL) {
sys_err("Cipher::Prepare() called while key_agreement_ already exists - potential double initialization");
delete key_agreement_;
key_agreement_ = NULL;
}
key_agreement_ = new DH2KeyAgreement();
if (key_agreement_ == NULL) {
sys_err("Failed to allocate DH2KeyAgreement");
return 0;
}
size_t agreed_length = key_agreement_->Prepare(buffer, length);
if (agreed_length == 0) {
delete key_agreement_;
key_agreement_ = NULL;
}
return agreed_length;
}
Arat:
Kod:
void CInputProcessor::Handshake(LPDESC d, const char * c_pData)
Kod:
void CInputProcessor::Handshake(LPDESC d, const char * c_pData)
{
TPacketCGHandshake * p = (TPacketCGHandshake *) c_pData;
if (d->GetHandshake() != p->dwHandshake)
{
sys_err("Invalid Handshake on %d", d->GetSocket());
d->SetPhase(PHASE_CLOSE);
}
else
{
if (d->IsPhase(PHASE_HANDSHAKE))
{
if (d->HandshakeProcess(p->dwTime, p->lDelta, false))
{
#ifdef _IMPROVED_PACKET_ENCRYPTION_
// Prevent duplicate key agreement if already prepared
if (!d->IsCipherPrepared())
{
d->SendKeyAgreement();
}
else
{
sys_err("Duplicate handshake attempt on socket %d - cipher already prepared", d->GetSocket());
d->SetPhase(PHASE_CLOSE);
}
#else
if (g_bAuthServer)
d->SetPhase(PHASE_AUTH);
else
d->SetPhase(PHASE_LOGIN);
#endif // #ifdef _IMPROVED_PACKET_ENCRYPTION_
}
}
else
d->HandshakeProcess(p->dwTime, p->lDelta, true);
}
}
1
2
