From df98c84bb92004fa529d7e06e5bd065fcdc79d5d Mon Sep 17 00:00:00 2001 From: Marc Lasch Date: Thu, 23 Sep 2021 16:49:16 +0200 Subject: [PATCH] [#618] Fix payload_len handling Use size_t to store the message instead of a 16bit variable Signed-off-by: Marc Lasch --- coap/er-coap-13/er-coap-13.c | 6 +-- coap/er-coap-13/er-coap-13.h | 6 +-- coap/transaction.c | 3 +- core/internals.h | 3 +- core/management.c | 51 +++++--------------- core/packet.c | 5 +- core/registration.c | 11 ++--- examples/bootstrap_server/bootstrap_server.c | 13 ++--- examples/server/lwm2mserver.c | 44 +++++------------ examples/shared/commandline.c | 30 +++--------- examples/shared/commandline.h | 5 +- include/liblwm2m.h | 20 +++++--- 12 files changed, 65 insertions(+), 132 deletions(-) diff --git a/coap/er-coap-13/er-coap-13.c b/coap/er-coap-13/er-coap-13.c index daf6b8bd4..4d1a63f2b 100644 --- a/coap/er-coap-13/er-coap-13.c +++ b/coap/er-coap-13/er-coap-13.c @@ -1499,8 +1499,7 @@ coap_set_header_size(void *packet, uint32_t size) /*-----------------------------------------------------------------------------------*/ /*- PAYLOAD -------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/ -int -coap_get_payload(void *packet, const uint8_t **payload) +size_t coap_get_payload(void *packet, const uint8_t **payload) { coap_packet_t *const coap_pkt = (coap_packet_t *) packet; @@ -1513,8 +1512,7 @@ coap_get_payload(void *packet, const uint8_t **payload) } } -int -coap_set_payload(void *packet, const void *payload, size_t length) +size_t coap_set_payload(void *packet, const void *payload, size_t length) { coap_packet_t *const coap_pkt = (coap_packet_t *) packet; diff --git a/coap/er-coap-13/er-coap-13.h b/coap/er-coap-13/er-coap-13.h index 8c2a312a1..987f76882 100644 --- a/coap/er-coap-13/er-coap-13.h +++ b/coap/er-coap-13/er-coap-13.h @@ -240,7 +240,7 @@ typedef struct { multi_option_t *uri_query; uint8_t if_none_match; - uint16_t payload_len; + size_t payload_len; uint8_t *payload; } coap_packet_t; @@ -383,7 +383,7 @@ int coap_get_header_block(void *packet, uint32_t *num, uint8_t *more, uint16_t * int coap_get_header_size(void *packet, uint32_t *size); int coap_set_header_size(void *packet, uint32_t size); -int coap_get_payload(void *packet, const uint8_t **payload); -int coap_set_payload(void *packet, const void *payload, size_t length); +size_t coap_get_payload(void *packet, const uint8_t **payload); +size_t coap_set_payload(void *packet, const void *payload, size_t length); #endif /* COAP_13_H_ */ diff --git a/coap/transaction.c b/coap/transaction.c index 1cc9f14d1..f183a6dff 100644 --- a/coap/transaction.c +++ b/coap/transaction.c @@ -483,8 +483,7 @@ void transaction_step(lwm2m_context_t * contextP, } } -void transaction_set_payload(lwm2m_transaction_t * transaction, uint8_t * buffer, int length) -{ +void transaction_set_payload(lwm2m_transaction_t *transaction, uint8_t *buffer, size_t length) { transaction->payload = buffer; transaction->payload_len = length; const uint16_t lwm2m_coap_block_size = lwm2m_get_coap_block_size(); diff --git a/core/internals.h b/core/internals.h index 157b0c3e0..114c6e679 100644 --- a/core/internals.h +++ b/core/internals.h @@ -329,7 +329,7 @@ void transaction_remove(lwm2m_context_t * contextP, lwm2m_transaction_t * transa bool transaction_handleResponse(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response); void transaction_step(lwm2m_context_t * contextP, time_t currentTime, time_t * timeoutP); bool transaction_free_userData(lwm2m_context_t * context, lwm2m_transaction_t * transaction); -void transaction_set_payload(lwm2m_transaction_t * transaction, uint8_t * buffer, int length); +void transaction_set_payload(lwm2m_transaction_t *transaction, uint8_t *buffer, size_t length); // defined in management.c uint8_t dm_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, coap_packet_t * message, coap_packet_t * response); @@ -343,7 +343,6 @@ void observe_clear(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); bool observe_handleNotify(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response); void observe_remove(lwm2m_observation_t * observationP); lwm2m_observed_t * observe_findByUri(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); -void applyObservationCallback(lwm2m_observation_t * observation, int status, block_info_t * block_info, lwm2m_media_type_t format, uint8_t * data, int dataLength); // defined in registration.c uint8_t registration_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response); diff --git a/core/management.c b/core/management.c index faeaf598a..ccf32d6bb 100644 --- a/core/management.c +++ b/core/management.c @@ -491,16 +491,9 @@ static void prv_resultCallback(lwm2m_context_t * contextP, transaction_free_userData(contextP, transacP); } -static int prv_makeOperation(lwm2m_context_t * contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - coap_method_t method, - lwm2m_media_type_t format, - uint8_t * buffer, - int length, - lwm2m_result_callback_t callback, - void * userData) -{ +static int prv_makeOperation(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, coap_method_t method, + lwm2m_media_type_t format, uint8_t *buffer, size_t length, + lwm2m_result_callback_t callback, void *userData) { lwm2m_client_t * clientP; lwm2m_transaction_t * transaction; dm_data_t * dataP; @@ -577,17 +570,9 @@ int lwm2m_dm_read(lwm2m_context_t * contextP, return prv_lwm2m_dm_read(contextP, clientID, uriP, callback, userData); } -static -int prv_lwm2m_dm_write(lwm2m_context_t * contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - lwm2m_media_type_t format, - uint8_t * buffer, - int length, - bool partialUpdate, - lwm2m_result_callback_t callback, - void * userData) -{ +static int prv_lwm2m_dm_write(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, + lwm2m_media_type_t format, uint8_t *buffer, size_t length, bool partialUpdate, + lwm2m_result_callback_t callback, void *userData) { coap_method_t method = partialUpdate ? COAP_POST : COAP_PUT; LOG_ARG("clientID: %d, format: %s, length: %d", clientID, STR_MEDIA_TYPE(format), length); @@ -614,28 +599,14 @@ int prv_lwm2m_dm_write(lwm2m_context_t * contextP, } } -int lwm2m_dm_write(lwm2m_context_t * contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - lwm2m_media_type_t format, - uint8_t * buffer, - int length, - bool partialUpdate, - lwm2m_result_callback_t callback, - void * userData) -{ +int lwm2m_dm_write(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, lwm2m_media_type_t format, + uint8_t *buffer, size_t length, bool partialUpdate, lwm2m_result_callback_t callback, + void *userData) { return prv_lwm2m_dm_write(contextP, clientID, uriP, format, buffer, length, partialUpdate, callback, userData); } -int lwm2m_dm_execute(lwm2m_context_t * contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - lwm2m_media_type_t format, - uint8_t * buffer, - int length, - lwm2m_result_callback_t callback, - void * userData) -{ +int lwm2m_dm_execute(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, lwm2m_media_type_t format, + uint8_t *buffer, size_t length, lwm2m_result_callback_t callback, void *userData) { LOG_ARG("clientID: %d, format: %s, length: %d", clientID, STR_MEDIA_TYPE(format), length); LOG_URI(uriP); if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) diff --git a/core/packet.c b/core/packet.c index b8ee481f8..42b9e6841 100644 --- a/core/packet.c +++ b/core/packet.c @@ -376,7 +376,7 @@ static int prv_change_to_block1(lwm2m_context_t * contextP, void * sessionH, uin transaction = prv_get_transaction(contextP, sessionH, mid); - for (int n = 1; 16 << n <= (int)size ; n++) { + for (uint16_t n = 1; 16 << n <= (uint16_t)size; n++) { block_size = 16 << n; } @@ -473,6 +473,9 @@ void lwm2m_handle_packet(lwm2m_context_t * contextP, static coap_packet_t response[1]; LOG("Entering"); + /* The buffer length is uint16_t here, as UDP packet length field is 16 bit. + * This might change in the future e.g. for supporting TCP or other transport. + */ coap_error_code = coap_parse_message(message, buffer, (uint16_t)length); if (coap_error_code == NO_ERROR) { diff --git a/core/registration.c b/core/registration.c index 4a082c7af..d05bdd91f 100644 --- a/core/registration.c +++ b/core/registration.c @@ -785,7 +785,7 @@ static uint8_t prv_register(lwm2m_context_t * contextP, coap_set_header_uri_query(transaction->message, query); coap_set_header_content_type(transaction->message, LWM2M_CONTENT_LINK); - transaction_set_payload(transaction, payload, payload_length); + transaction_set_payload(transaction, payload, (size_t)payload_length); registration_data_t * dataP = (registration_data_t *) lwm2m_malloc(sizeof(registration_data_t)); if (dataP == NULL){ @@ -894,7 +894,7 @@ static int prv_updateRegistration(lwm2m_context_t * contextP, lwm2m_free(payload); return COAP_500_INTERNAL_SERVER_ERROR; } - transaction_set_payload(transaction, payload, payload_length); + transaction_set_payload(transaction, payload, (size_t)payload_length); } registration_data_t * dataP = (registration_data_t *) lwm2m_malloc(sizeof(registration_data_t)); @@ -1604,11 +1604,8 @@ static int prv_getId(uint8_t * data, return result; } -static lwm2m_client_object_t * prv_decodeRegisterPayload(uint8_t * payload, - uint16_t payloadLength, - lwm2m_media_type_t * format, - char ** altPath) -{ +static lwm2m_client_object_t *prv_decodeRegisterPayload(uint8_t *payload, size_t payloadLength, + lwm2m_media_type_t *format, char **altPath) { uint16_t index; lwm2m_client_object_t * objList; bool linkAttrFound; diff --git a/examples/bootstrap_server/bootstrap_server.c b/examples/bootstrap_server/bootstrap_server.c index 2995c75bb..c5dc74dd4 100644 --- a/examples/bootstrap_server/bootstrap_server.c +++ b/examples/bootstrap_server/bootstrap_server.c @@ -332,16 +332,9 @@ static void prv_send_command(lwm2m_context_t *lwm2mH, } } -static int prv_bootstrap_callback(lwm2m_context_t * lwm2mH, - void * sessionH, - uint8_t status, - lwm2m_uri_t * uriP, - char * name, - lwm2m_media_type_t format, - uint8_t * data, - uint16_t dataLength, - void * userData) -{ +static int prv_bootstrap_callback(lwm2m_context_t *lwm2mH, void *sessionH, uint8_t status, lwm2m_uri_t *uriP, + char *name, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + void *userData) { internal_data_t * dataP = (internal_data_t *)userData; endpoint_t * endP; diff --git a/examples/server/lwm2mserver.c b/examples/server/lwm2mserver.c index 75d537a33..ba5bc9c30 100644 --- a/examples/server/lwm2mserver.c +++ b/examples/server/lwm2mserver.c @@ -249,16 +249,9 @@ static void prv_printUri(const lwm2m_uri_t * uriP) #endif } -static void prv_result_callback(lwm2m_context_t *contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - int status, - block_info_t * block_info, - lwm2m_media_type_t format, - uint8_t * data, - int dataLength, - void * userData) -{ +static void prv_result_callback(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, int status, + block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + void *userData) { /* unused parameters */ (void)contextP; (void)userData; @@ -275,16 +268,9 @@ static void prv_result_callback(lwm2m_context_t *contextP, fflush(stdout); } -static void prv_notify_callback(lwm2m_context_t *contextP, - uint16_t clientID, - lwm2m_uri_t * uriP, - int count, - block_info_t * block_info, - lwm2m_media_type_t format, - uint8_t * data, - int dataLength, - void * userData) -{ +static void prv_notify_callback(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, int count, + block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + void *userData) { /* unused parameters */ (void)contextP; (void)userData; @@ -964,16 +950,9 @@ static void prv_cancel_client(lwm2m_context_t *lwm2mH, fprintf(stdout, "Syntax error !"); } -static void prv_monitor_callback(lwm2m_context_t *lwm2mH, - uint16_t clientID, - lwm2m_uri_t * uriP, - int status, - block_info_t * block_info, - lwm2m_media_type_t format, - uint8_t * data, - int dataLength, - void * userData) -{ +static void prv_monitor_callback(lwm2m_context_t *lwm2mH, uint16_t clientID, lwm2m_uri_t *uriP, int status, + block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + void *userData) { lwm2m_client_t * targetP; /* unused parameter */ @@ -1010,7 +989,6 @@ static void prv_monitor_callback(lwm2m_context_t *lwm2mH, fflush(stdout); } - static void prv_quit(lwm2m_context_t *lwm2mH, char * buffer, void * user_data) @@ -1209,7 +1187,7 @@ int main(int argc, char *argv[]) else if (result > 0) { uint8_t buffer[MAX_PACKET_SIZE]; - int numBytes; + size_t numBytes; if (FD_ISSET(sock, &readfds)) { @@ -1247,7 +1225,7 @@ int main(int argc, char *argv[]) port = saddr->sin6_port; } - fprintf(stderr, "%d bytes received from [%s]:%hu\r\n", numBytes, s, ntohs(port)); + fprintf(stderr, PRIdPTR " bytes received from [%s]:%hu\r\n", numBytes, s, ntohs(port)); output_buffer(stderr, buffer, numBytes, 0); connP = connection_find(connList, &addr, addrLen); diff --git a/examples/shared/commandline.c b/examples/shared/commandline.c index 613425bb3..c854abb3b 100644 --- a/examples/shared/commandline.c +++ b/examples/shared/commandline.c @@ -174,12 +174,8 @@ static void print_indent(FILE * stream, fprintf(stream, " "); } -void output_buffer(FILE * stream, - const uint8_t * buffer, - int length, - int indent) -{ - int i; +void output_buffer(FILE *stream, const uint8_t *buffer, size_t length, int indent) { + size_t i; if (length == 0) fprintf(stream, "\n"); @@ -304,15 +300,8 @@ void output_tlv(FILE * stream, #endif } -void output_data(FILE * stream, - block_info_t * block_info, - lwm2m_media_type_t format, - uint8_t * data, - int dataLength, - int indent) -{ - int i; - +void output_data(FILE *stream, block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + int indent) { print_indent(stream, indent); if (block_info != NULL) { fprintf(stream, "block transfer: size: %d, num: %d, more: %d\n\r", block_info->block_size, block_info->block_num, block_info->block_more); @@ -320,7 +309,7 @@ void output_data(FILE * stream, fprintf(stream, "non block transfer\n\r"); } print_indent(stream, indent); - fprintf(stream, "%d bytes received of type ", dataLength); + fprintf(stream, PRIdPTR " bytes received of type ", dataLength); switch (format) { @@ -342,8 +331,7 @@ void output_data(FILE * stream, case LWM2M_CONTENT_JSON: fprintf(stream, "application/vnd.oma.lwm2m+json:\r\n"); print_indent(stream, indent); - for (i = 0 ; i < dataLength ; i++) - { + for (size_t i = 0; i < dataLength; i++) { fprintf(stream, "%c", data[i]); } fprintf(stream, "\n"); @@ -352,8 +340,7 @@ void output_data(FILE * stream, case LWM2M_CONTENT_SENML_JSON: fprintf(stream, "application/senml+json:\r\n"); print_indent(stream, indent); - for (i = 0 ; i < dataLength ; i++) - { + for (size_t i = 0; i < dataLength; i++) { fprintf(stream, "%c", data[i]); } fprintf(stream, "\n"); @@ -362,8 +349,7 @@ void output_data(FILE * stream, case LWM2M_CONTENT_LINK: fprintf(stream, "application/link-format:\r\n"); print_indent(stream, indent); - for (i = 0 ; i < dataLength ; i++) - { + for (size_t i = 0; i < dataLength; i++) { fprintf(stream, "%c", data[i]); } fprintf(stream, "\n"); diff --git a/examples/shared/commandline.h b/examples/shared/commandline.h index fdb5a51f1..2c273b3b8 100644 --- a/examples/shared/commandline.h +++ b/examples/shared/commandline.h @@ -36,8 +36,9 @@ char* get_end_of_arg(char* buffer); char * get_next_arg(char * buffer, char **end); int check_end_of_args(char* buffer); -void output_buffer(FILE * stream, const uint8_t * buffer, int length, int indent); +void output_buffer(FILE *stream, const uint8_t *buffer, size_t length, int indent); void output_tlv(FILE * stream, uint8_t * buffer, size_t buffer_len, int indent); void dump_tlv(FILE * stream, int size, lwm2m_data_t * dataP, int indent); -void output_data(FILE * stream, block_info_t * block_info, lwm2m_media_type_t format, uint8_t * buffer, int length, int indent); +void output_data(FILE *stream, block_info_t *block_info, lwm2m_media_type_t format, uint8_t *buffer, size_t length, + int indent); void print_status(FILE * stream, uint8_t status); diff --git a/include/liblwm2m.h b/include/liblwm2m.h index b7aa9e058..d5977aa9f 100644 --- a/include/liblwm2m.h +++ b/include/liblwm2m.h @@ -600,7 +600,9 @@ typedef struct _block_info_t * * When used with an observe, if 'data' is not nil, 'status' holds the observe counter. */ -typedef void (*lwm2m_result_callback_t) (lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, int status, block_info_t * block_info, lwm2m_media_type_t format, uint8_t * data, int dataLength, void * userData); +typedef void (*lwm2m_result_callback_t)(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, int status, + block_info_t *block_info, lwm2m_media_type_t format, uint8_t *data, + size_t dataLength, void *userData); /* * LWM2M Observations @@ -706,8 +708,9 @@ struct _lwm2m_transaction_ void * message; uint16_t buffer_len; uint8_t * buffer; - uint16_t payload_len; // the length of the entire payload, message payload might be smaller in case of a block1 transfer - uint8_t * payload; // carries the entire payload accross multiple transactions in case of a block 1 transfer + size_t + payload_len; // the length of the entire payload, message payload might be smaller in case of a block1 transfer + uint8_t *payload; // carries the entire payload across multiple transactions in case of a block 1 transfer lwm2m_transaction_callback_t callback; void * userData; }; @@ -771,7 +774,9 @@ typedef enum // After a lwm2m_bootstrap_delete() or a lwm2m_bootstrap_write(), the callback is called with the status returned by the // client, the URI of the operation (may be nil) and name is nil. The callback return value is ignored. // If data is present and no preferred format is provided by the client the format will be 0, otherwise it will be set. -typedef int (*lwm2m_bootstrap_callback_t) (lwm2m_context_t * contextP, void * sessionH, uint8_t status, lwm2m_uri_t * uriP, char * name, lwm2m_media_type_t format, uint8_t * data, uint16_t dataLength, void * userData); +typedef int (*lwm2m_bootstrap_callback_t)(lwm2m_context_t *contextP, void *sessionH, uint8_t status, lwm2m_uri_t *uriP, + char *name, lwm2m_media_type_t format, uint8_t *data, size_t dataLength, + void *userData); #endif struct _lwm2m_context_ @@ -843,9 +848,12 @@ void lwm2m_set_monitoring_callback(lwm2m_context_t * contextP, lwm2m_result_call // Device Management APIs int lwm2m_dm_read(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_result_callback_t callback, void * userData); int lwm2m_dm_discover(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_result_callback_t callback, void * userData); -int lwm2m_dm_write(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, int length, bool partialUpdate, lwm2m_result_callback_t callback, void * userData); +int lwm2m_dm_write(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, lwm2m_media_type_t format, + uint8_t *buffer, size_t length, bool partialUpdate, lwm2m_result_callback_t callback, + void *userData); int lwm2m_dm_write_attributes(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_attributes_t * attrP, lwm2m_result_callback_t callback, void * userData); -int lwm2m_dm_execute(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, int length, lwm2m_result_callback_t callback, void * userData); +int lwm2m_dm_execute(lwm2m_context_t *contextP, uint16_t clientID, lwm2m_uri_t *uriP, lwm2m_media_type_t format, + uint8_t *buffer, size_t length, lwm2m_result_callback_t callback, void *userData); int lwm2m_dm_create(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, int numData, lwm2m_data_t * dataP, lwm2m_result_callback_t callback, void * userData); int lwm2m_dm_delete(lwm2m_context_t * contextP, uint16_t clientID, lwm2m_uri_t * uriP, lwm2m_result_callback_t callback, void * userData);