From 1ac07971e2c5c7e75865e51b1e7748c201efabf7 Mon Sep 17 00:00:00 2001 From: Matthias Kovatsch Date: Wed, 7 Dec 2011 19:35:11 +0100 Subject: [PATCH] Fixed int serialization bug (affected large values). --- apps/er-coap-03/er-coap-03.c | 6 +++--- apps/er-coap-06/er-coap-06.c | 8 ++++---- apps/er-coap-07/er-coap-07.c | 13 +++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/er-coap-03/er-coap-03.c b/apps/er-coap-03/er-coap-03.c index 220af6be2..b02227ba2 100644 --- a/apps/er-coap-03/er-coap-03.c +++ b/apps/er-coap-03/er-coap-03.c @@ -123,9 +123,9 @@ int uint32_2_bytes(uint8_t *bytes, uint32_t var) { int i = 0; - if (0xFF000000 & var) bytes[i++] = var>>24; - if (0xFF0000 & var) bytes[i++] = var>>16; - if (0xFF00 & var) bytes[i++] = var>>8; + if (0xFF000000 & var) bytes[i++] = (0xFF & var>>24); + if (0xFFFF0000 & var) bytes[i++] = (0xFF & var>>16); + if (0xFFFFFF00 & var) bytes[i++] = (0xFF & var>>8); bytes[i++] = 0xFF & var; return i; diff --git a/apps/er-coap-06/er-coap-06.c b/apps/er-coap-06/er-coap-06.c index 3e72c48e7..013001c48 100644 --- a/apps/er-coap-06/er-coap-06.c +++ b/apps/er-coap-06/er-coap-06.c @@ -136,10 +136,10 @@ serialize_int_option(int number, int current_number, uint8_t *buffer, uint32_t v uint8_t *option = &buffer[i]; - if (0xFF000000 & value) buffer[++i] = (uint8_t) (value>>24); - if (0x00FF0000 & value) buffer[++i] = (uint8_t) (value>>16); - if (0x0000FF00 & value) buffer[++i] = (uint8_t) (value>>8); - if (0x000000FF & value) buffer[++i] = (uint8_t) value; + if (0xFF000000 & value) buffer[++i] = (uint8_t) (0xFF & value>>24); + if (0xFFFF0000 & value) buffer[++i] = (uint8_t) (0xFF & value>>16); + if (0xFFFFFF00 & value) buffer[++i] = (uint8_t) (0xFF & value>>8); + if ( value) buffer[++i] = (uint8_t) (0xFF & value); i += set_option_header(number - current_number, i-start_i, option); diff --git a/apps/er-coap-07/er-coap-07.c b/apps/er-coap-07/er-coap-07.c index 34c41a387..55fa4852f 100644 --- a/apps/er-coap-07/er-coap-07.c +++ b/apps/er-coap-07/er-coap-07.c @@ -137,10 +137,10 @@ serialize_int_option(int number, int current_number, uint8_t *buffer, uint32_t v uint8_t *option = &buffer[i]; - if (0xFF000000 & value) buffer[++i] = (uint8_t) (value>>24); - if (0x00FF0000 & value) buffer[++i] = (uint8_t) (value>>16); - if (0x0000FF00 & value) buffer[++i] = (uint8_t) (value>>8); - if (0x000000FF & value) buffer[++i] = (uint8_t) value; + if (0xFF000000 & value) buffer[++i] = (uint8_t) (0xFF & value>>24); + if (0xFFFF0000 & value) buffer[++i] = (uint8_t) (0xFF & value>>16); + if (0xFFFFFF00 & value) buffer[++i] = (uint8_t) (0xFF & value>>8); + if (0xFFFFFFFF & value) buffer[++i] = (uint8_t) (0xFF & value); i += set_option_header(number - current_number, i-start_i, option); @@ -449,6 +449,7 @@ coap_serialize_message(void *packet, uint8_t *buffer) PRINTF("Block2 [%lu%s (%u B/blk)]\n", ((coap_packet_t *)packet)->block2_num, ((coap_packet_t *)packet)->block2_more ? "+" : "", ((coap_packet_t *)packet)->block2_size); uint32_t block = ((coap_packet_t *)packet)->block2_num << 4; +printf("encode %lu\n", block>>4); if (((coap_packet_t *)packet)->block2_more) block |= 0x8; block |= 0xF & log_2(((coap_packet_t *)packet)->block2_size/16); @@ -680,7 +681,7 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) ((coap_packet_t *)packet)->block2_num = parse_int_option(current_option, option_len); ((coap_packet_t *)packet)->block2_more = (((coap_packet_t *)packet)->block2_num & 0x08)>>3; ((coap_packet_t *)packet)->block2_size = 16 << (((coap_packet_t *)packet)->block2_num & 0x07); - ((coap_packet_t *)packet)->block2_offset = (((coap_packet_t *)packet)->block2_num & ~0x0F)<<(((coap_packet_t *)packet)->block2_num & 0x07); + ((coap_packet_t *)packet)->block2_offset = (((coap_packet_t *)packet)->block2_num & ~0x0000000F)<<(((coap_packet_t *)packet)->block2_num & 0x07); ((coap_packet_t *)packet)->block2_num >>= 4; PRINTF("Block2 [%lu%s (%u B/blk)]\n", ((coap_packet_t *)packet)->block2_num, ((coap_packet_t *)packet)->block2_more ? "+" : "", ((coap_packet_t *)packet)->block2_size); break; @@ -1035,7 +1036,7 @@ coap_set_header_block2(void *packet, uint32_t num, uint8_t more, uint16_t size) if (num>0x0FFFFF) return 0; ((coap_packet_t *)packet)->block2_num = num; - ((coap_packet_t *)packet)->block2_more = more; + ((coap_packet_t *)packet)->block2_more = more ? 1 : 0; ((coap_packet_t *)packet)->block2_size = size; SET_OPTION((coap_packet_t *)packet, COAP_OPTION_BLOCK2);