Utilizzo del codice dal bollettino:
ws_ctx_t *do_handshake(int sock) {
char handshake[4096], response[4096], sha1[29], trailer[17];
[...]
offset = 0;
for (i = 0; i < 10; i++) {
len = ws_recv(ws_ctx, handshake+offset, 4096);
if (len == 0) {
handler_emsg("Client closed during handshake\n");
return NULL;
}
offset += len;
handshake[offset] = 0;
if (strstr(handshake, "\r\n\r\n")) {
break;
}
usleep(10);
}
[...]
}
- offset = 0
- ws_recv (ws_ctx, handshake + 0, 4096) = > 4096
- offset = 4096
- handshake [4096] = 0; // fuori dai limiti di scrittura.
- no double-CRLF trovato, loop
- ws_recv (ws_ctx, handshake + 4096, 4096) = > scrivere interamente fuori dai limiti.
Sembra che il ciclo sia stato progettato partendo dal presupposto che si verificherebbe solo a causa della ricezione di dati non sufficienti. Lanciava gocce di dati su di esso in ogni caso, ma dopo il primo passaggio non aveva più memoria correttamente vincolata.
Il terzo parametro avrebbe dovuto essere 4096 - offset
, che rappresenta la quantità di spazio rimanente, non lo spazio totale del buffer (poiché ws_recv non ha ottenuto il buffer totale a meno di offset == 0). (O avevano bisogno di riallocare, eccetera).