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.
- ¿Por qué es aparentemente tan fácil piratear sitios supuestamente seguros como Apple iCloud y Sony Pictures?
- ¿Qué servicios se incluyen en el monitoreo de seguridad de la red?
- Para los hackers, ¿crees que es posible crear un sistema operativo completamente seguro?
- ¿Qué tan probable es que Bitcoin sea pirateado?
- ¿Qué certificados necesitas para ser una seguridad cibernética? ¿Es suficiente una licenciatura en seguridad cibernética?
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.