2017-07-04 4 views
1

Je ce morceau de code dont le but est de déterminer si le paquet reçu est valide ou non:architecture de code agnostique

size_t offset_to_a, offset_to_b; 
u_int32_t file_name_length; 
u_int32_t packet_length; 

if ((offset_to_a + offset_to_b + file_name_length) > packet_length) { 
    // Invalid packet 
} 

size_t est u_int64_t être parce que le cpu est un processeur 64 bits.

Maintenant, lorsque file_name_length a une valeur 0xFFFFFFFF (qui n'est pas valide), le paquet est considéré comme invalide.

Mais si size_t devient u_int32_t en raison de l'architecture sous-jacente, puis pour la même valeur de file_name_length, la condition échoue parce que la valeur enveloppait autour, et le paquet est réputé valide.

Comment rendre cette condition suffisamment générique pour fonctionner sur les deux architectures 32/64 bits?

Merci!

+0

La valeur 0xFFFFFFFF est l'entier non signé maximal de 32 bits - et ne provoque pas de saut de valeur de 64 bits. En tant que tel, il fonctionnerait de manière identique si 'size_t' est de 32 bits. Peut-être que vous avez mal tapé '0xFFFFFFFFFFFFFFFF' pour la valeur de 64 bits. Avez-vous considéré les types à taille fixe de '' et ''? Ceux-ci sont souvent utilisés dans le code moderne lorsque les tailles sont fixes. (Il existe plusieurs alternatives incompatibles.) Techniquement, elles sont facultatives - certaines plateformes pourraient ne pas supporter 'uint16_t' et dans ce cas, il n'y aurait pas de type' uint16_t'. Cependant, il y a toujours des types 'uint_least16_t'. –

+1

"* Maintenant, quand file_name_length a une valeur 0xFFFFFFFF (qui n'est pas valide), *" Alors pourquoi ne pas simplement faire un simple "if (file_name_length> = 0xffffffff) {// paquet invalide}'? – alk

+0

@alk: Votre suggestion est valide et nous l'avons incorporé. Je vous remercie! – Maddy

Répondre

1

L'astuce consiste à n'utiliser que la soustraction et à ne les soustraire qu'après avoir vérifié que la soustraction ne s'emballe pas. Quelque chose comme ceci:

if (offset_to_a > packet_length || packet_length - offset_to_a < file_name_length) { 
    // invalid packet 
} 
size_t remain = packet_length - offset_to_a; 
if (offset_to_b > remain || remain - offset_to_b < file_name_length) { 
    // invalid packet 
} 
+0

Cela a fonctionné. Je vous remercie! – Maddy