summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2022-11-25 12:18:07 +1100
committerChris Johns <chrisj@rtems.org>2022-11-25 12:43:29 +1100
commit408dbeb9225e1969113b81ad3ef484f351b9b4e3 (patch)
tree9cd6b2df924fa11d53c15e912a69b4c1e8dc1187
parentlibmisc/shell: Fix edit Coverity error (diff)
downloadrtems-408dbeb9225e1969113b81ad3ef484f351b9b4e3.tar.bz2
libmisc/rtems-fdt: Support prop map items up to the size of uintptr_t
Updates #4729
-rw-r--r--cpukit/include/rtems/rtems-fdt.h6
-rw-r--r--cpukit/libmisc/rtems-fdt/rtems-fdt.c19
2 files changed, 23 insertions, 2 deletions
diff --git a/cpukit/include/rtems/rtems-fdt.h b/cpukit/include/rtems/rtems-fdt.h
index 18e04352aa..e3ebfe3ba4 100644
--- a/cpukit/include/rtems/rtems-fdt.h
+++ b/cpukit/include/rtems/rtems-fdt.h
@@ -695,6 +695,12 @@ const char *rtems_fdt_entry_name(rtems_fdt_handle* handle, int id);
int rtems_fdt_entry_offset(rtems_fdt_handle* handle, int id);
/*
+ * Helper function to convert the void* property result of unknown
+ * length to an unsigned int pointer value.
+ */
+uintptr_t rtems_fdt_get_offset_len_uintptr(const void* prop, int offset, int len);
+
+/*
* Helper function to convert the void* property result to a 32bit unsigned int.
*/
uint32_t rtems_fdt_get_uint32(const void* prop);
diff --git a/cpukit/libmisc/rtems-fdt/rtems-fdt.c b/cpukit/libmisc/rtems-fdt/rtems-fdt.c
index e5bab21664..ec8f270eef 100644
--- a/cpukit/libmisc/rtems-fdt/rtems-fdt.c
+++ b/cpukit/libmisc/rtems-fdt/rtems-fdt.c
@@ -1063,18 +1063,33 @@ rtems_fdt_prop_map(const char* const path,
return length;
}
- if (length != sizeof (uintptr_t))
+ if (length > sizeof (uintptr_t))
{
rtems_fdt_release_handle (&fdt);
return -RTEMS_FDT_ERR_BADPATH;
}
- values[item] = rtems_fdt_get_uintptr(prop);
+ values[item] = rtems_fdt_get_offset_len_uintptr(prop, 0, length);
}
return 0;
}
+uintptr_t
+rtems_fdt_get_offset_len_uintptr (const void* prop, int offset, int len)
+{
+ const uint8_t* p = prop;
+ uintptr_t value = 0;
+ int b;
+ if (len <= sizeof(uintptr_t)) {
+ for (b = 0; b < len; ++b) {
+ value = (value << 8) | (uintptr_t) p[offset++];
+ }
+ }
+ return value;
+}
+
+
uint32_t
rtems_fdt_get_offset_uint32 (const void* prop, int offset)
{