Skip to content

Commit 1827636

Browse files
juhaylinencarlescufi
authored andcommitted
net: lwm2m: Verify receiving buffer size in lwm2m_engine_get()
Check receiving buffer size and return error if * buffer size is too small for opaque or string data type * buffer size is not equal to data lenght when data type is fixed size Signed-off-by: Juha Ylinen <[email protected]>
1 parent 20d2dff commit 1827636

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

subsys/net/lib/lwm2m/lwm2m_registry.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,34 @@ int lwm2m_engine_get_res_data(const char *pathstr, void **data_ptr, uint16_t *da
823823
return lwm2m_engine_get_res_buf(pathstr, data_ptr, NULL, data_len, data_flags);
824824
}
825825

826+
static int lwm2m_check_buf_sizes(uint8_t data_type, uint16_t resource_length, uint16_t buf_length)
827+
{
828+
switch (data_type) {
829+
case LWM2M_RES_TYPE_OPAQUE:
830+
case LWM2M_RES_TYPE_STRING:
831+
if (resource_length > buf_length) {
832+
return -ENOMEM;
833+
}
834+
break;
835+
case LWM2M_RES_TYPE_U32:
836+
case LWM2M_RES_TYPE_U8:
837+
case LWM2M_RES_TYPE_S64:
838+
case LWM2M_RES_TYPE_S32:
839+
case LWM2M_RES_TYPE_S16:
840+
case LWM2M_RES_TYPE_S8:
841+
case LWM2M_RES_TYPE_BOOL:
842+
case LWM2M_RES_TYPE_FLOAT:
843+
case LWM2M_RES_TYPE_OBJLNK:
844+
if (resource_length != buf_length) {
845+
return -EINVAL;
846+
}
847+
break;
848+
default:
849+
return 0;
850+
}
851+
return 0;
852+
}
853+
826854
static int lwm2m_engine_get(const char *pathstr, void *buf, uint16_t buflen)
827855
{
828856
int ret = 0;
@@ -870,17 +898,18 @@ static int lwm2m_engine_get(const char *pathstr, void *buf, uint16_t buflen)
870898
&data_len);
871899
}
872900

873-
/* TODO: handle data_len > buflen case */
874-
875901
if (data_ptr && data_len > 0) {
902+
ret = lwm2m_check_buf_sizes(obj_field->data_type, data_len, buflen);
903+
if (ret) {
904+
LOG_ERR("Incorrect resource data length %u. Buffer length %u", data_len,
905+
buflen);
906+
k_mutex_unlock(&registry_lock);
907+
return ret;
908+
}
909+
876910
switch (obj_field->data_type) {
877911

878912
case LWM2M_RES_TYPE_OPAQUE:
879-
if (data_len > buflen) {
880-
k_mutex_unlock(&registry_lock);
881-
return -ENOMEM;
882-
}
883-
884913
memcpy(buf, data_ptr, data_len);
885914
break;
886915

0 commit comments

Comments
 (0)