Sebuah loop menginginkan delapan byte balasan SOCKS. Ia telah menerima tiga. Pembacaan berikutnya mengembalikan b'', lalu loop menambahkannya, memeriksa panjangnya, dan mencoba lagi selamanya.

Itu bug penanganan EOF, bukan proxy lambat yang butuh timeout lebih lama. Pada penerimaan socket aliran normal, string byte kosong berarti lawan telah memutus koneksi. Lima byte sisanya tidak akan datang pada koneksi itu.

Pembantu baca tepat membutuhkan tiga hasil berbeda: mengumpulkan potongan tidak kosong, gagal pada EOF sebelum panjang yang dibutuhkan, dan meneruskan timeout atau kesalahan socket lainnya. Kasus-kasus itu tidak boleh melebur menjadi satu loop percobaan ulang generik.

Setel timeout yang dimaksudkan untuk socket sebelum operasi, dan baca panjang bidang yang ditentukan protokol proxy. Satu penerimaan hanya dapat mengembalikan sebagian balasan. Sebaliknya, meminta buffer tetap yang besar tidak membuat setiap alamat SOCKS memiliki panjang itu.

Jangan memperbaiki dependensi dengan menempelkan cuplikan MSG_WAITALL lama ke sumbernya dan menganggapnya mencakup EOF, sinyal, dan perilaku platform. Utamakan perbaikan yang didukung dari implementasi yang dipelihara, atau terapkan kontrak pembantu secara sengaja ketika parser adalah kode Anda.

Pertahankan berapa byte yang diharapkan dan diterima, tanpa mencatat muatan kredensial. “EOF setelah tiga dari delapan byte balasan” menjelaskan pertukaran yang rusak jauh lebih baik daripada “proxy macet lagi”.

Artikel terkait