diff --git a/src/coap_cache.c b/src/coap_cache.c index fa1c9bfa..7811db74 100644 --- a/src/coap_cache.c +++ b/src/coap_cache.c @@ -192,19 +192,7 @@ coap_new_cache_entry_lkd(coap_session_t *session, const coap_pdu_t *pdu, memset(entry, 0, sizeof(coap_cache_entry_t)); entry->session = session; if (record_pdu == COAP_CACHE_RECORD_PDU) { - entry->pdu = coap_pdu_init(pdu->type, pdu->code, pdu->mid, pdu->alloc_size); - if (entry->pdu) { - if (!coap_pdu_resize(entry->pdu, pdu->alloc_size)) { - coap_delete_pdu_lkd(entry->pdu); - coap_free_type(COAP_CACHE_ENTRY, entry); - return NULL; - } - /* Need to get the appropriate data across */ - memcpy(entry->pdu, pdu, offsetof(coap_pdu_t, token)); - memcpy(entry->pdu->token, pdu->token, pdu->used_size); - /* And adjust all the pointers etc. */ - entry->pdu->data = entry->pdu->token + (pdu->data - pdu->token); - } + entry->pdu = coap_const_pdu_reference_lkd(pdu); } entry->cache_key = coap_cache_derive_key(session, pdu, session_based); if (!entry->cache_key) { diff --git a/src/coap_pdu.c b/src/coap_pdu.c index 21e2823a..d6253d12 100644 --- a/src/coap_pdu.c +++ b/src/coap_pdu.c @@ -306,10 +306,12 @@ fail: int coap_pdu_resize(coap_pdu_t *pdu, size_t new_size) { if (new_size > pdu->alloc_size) { + /* Expanding the PDU usage */ #if !defined(WITH_LWIP) uint8_t *new_hdr; size_t offset; #endif + if (pdu->max_size && new_size > pdu->max_size) { coap_log_warn("coap_pdu_resize: pdu too big\n"); return 0; @@ -340,8 +342,8 @@ coap_pdu_resize(coap_pdu_t *pdu, size_t new_size) { else pdu->actual_token.s = &pdu->token[2]; #endif + pdu->alloc_size = new_size; } - pdu->alloc_size = new_size; return 1; } @@ -658,7 +660,12 @@ coap_insert_option(coap_pdu_t *pdu, coap_option_num_t number, size_t len, } prev_number = opt_iter.number; } - assert(option != NULL); + if (option == NULL) { + /* Code is broken somewhere */ + coap_log_warn("coap_insert_option: Broken max_opt\n"); + return 0; + } + /* size of option inc header to insert */ shift = coap_opt_encode_size(number - prev_number, len);