Skip to content

Commit 1d16757

Browse files
Flavio Ceolincfriedt
authored andcommitted
userspace: Additional checks in K_SYSCALL_MEMORY
This macros needed additional checks before invoking arch_buffer_validate. - size can not be less then 0. Some functions invoke this macro using signed type which will be promote to unsigned when invoking arch_buffer_validate. We need to do an early check. - We need to check for possible overflow, since a malicious user application could use a negative number that would be promoted to a big value that would cause a integer overflow when adding it to the buffer address, leading to invalid checks. Signed-off-by: Flavio Ceolin <[email protected]>
1 parent eeefd07 commit 1d16757

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

include/syscall_handler.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,9 @@ extern int z_user_string_copy(char *dst, const char *src, size_t maxlen);
346346
* @return 0 on success, nonzero on failure
347347
*/
348348
#define Z_SYSCALL_MEMORY(ptr, size, write) \
349-
Z_SYSCALL_VERIFY_MSG(arch_buffer_validate((void *)ptr, size, write) \
350-
== 0, \
349+
Z_SYSCALL_VERIFY_MSG((size >= 0) && !Z_DETECT_POINTER_OVERFLOW(ptr, size) \
350+
&& (arch_buffer_validate((void *)ptr, size, write) \
351+
== 0), \
351352
"Memory region %p (size %zu) %s access denied", \
352353
(void *)(ptr), (size_t)(size), \
353354
write ? "write" : "read")

0 commit comments

Comments
 (0)