diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 3d0371857f3..9434b834a79 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -1018,6 +1018,7 @@ int lwm2m_init_message(struct lwm2m_message *msg) goto cleanup; } + coap_reply_clear(msg->reply); coap_reply_init(msg->reply, &msg->cpkt); msg->reply->reply = msg->reply_cb; } @@ -3446,6 +3447,14 @@ void lwm2m_udp_receive(struct lwm2m_ctx *client_ctx, struct net_pkt *pkt, } if (reply || pending) { + /* skip release if reply->user_data has error condition */ + if (reply && reply->user_data != COAP_REPLY_STATUS_NONE) { + /* reset reply->user_data for next time */ + reply->user_data = (void *)COAP_REPLY_STATUS_NONE; + SYS_LOG_DBG("reply %p NOT removed", reply); + goto cleanup; + } + /* free up msg resources */ if (msg) { lwm2m_reset_message(msg, true); diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index 4555ce7216b..135b9eabb3d 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -40,6 +40,10 @@ /* length of time in milliseconds to wait for buffer allocations */ #define BUF_ALLOC_TIMEOUT K_SECONDS(1) +/* coap reply status */ +#define COAP_REPLY_STATUS_NONE 0 +#define COAP_REPLY_STATUS_ERROR 1 + struct lwm2m_message; /* Establish a message timeout callback */ diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c index fbab08d7a38..043b5f7761a 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware_pull.c @@ -308,6 +308,9 @@ do_firmware_transfer_reply_cb(const struct coap_packet *response, /* restore main firmware block context */ memcpy(&firmware_block_ctx, &received_block_ctx, sizeof(firmware_block_ctx)); + + /* set reply->user_data to error to avoid releasing */ + reply->user_data = (void *)COAP_REPLY_STATUS_ERROR; return 0; }