¿Podría haber ocurrido el error Heartbleed si OpenSSL se hubiera escrito en Rust?

No.

Veamos el código en cuestión (refactorizado para facilitar la lectura):

/* Read payload, payload_length from end user */ // n2s(p, payload); // pl = p; get_payload_length_from_request_packet(request_packet, payload_length); payload_pointer = request_packet; ... /* Enter response type, length and copy payload_length */ // *bp++ = TLS1_HB_RESPONSE; // s2n(payload, bp); // memcpy(bp, pl, payload); *response_packet = TLS1_HB_RESPONSE; response_packet++; add_payload_length_to_response_packet(payload_length, response_packet); /* Construct return packet. payload_length (user input) is not to exceed 64K */ memcpy(response_packet, payload_pointer, payload_length); 

El problema con los arreglos en C es que los datos y el tamaño de los datos no están acoplados y es una convención de operar directamente en la memoria sin procesar.

En Rust, se usaría un vector byte y una copia vectorial. Incluso si no se verifican los límites, la lectura de datos adicionales no sería memoria arbitraria:

 // Copy data from payload packet to response packet, w/o checking bounds response_packet = payload.slice(0, payload_length) 

Si payload_length es siempre mayor que el tamaño del vector de payload entonces Rust arroja un error de tiempo de ejecución (un error de compilación si el vector está asignado en la pila). Eso significa que la implementación de Rust fallará en voz alta , mientras que la implementación de C ha fallado en silencio durante 6 años. Para su información, la sobrecopia de vectores C ++ también falla en voz alta como un defecto de tiempo de ejecución.