summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/overflow.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/include/linux/overflow.h b/include/linux/overflow.h
index 0e33b5cbdb9f..9d3fffc39bec 100644
--- a/include/linux/overflow.h
+++ b/include/linux/overflow.h
@@ -289,8 +289,11 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
* Return: number of bytes needed or SIZE_MAX on overflow.
*/
#define struct_size(p, member, count) \
- __builtin_choose_expr(__is_constexpr(count), \
- sizeof(*(p)) + flex_array_size(p, member, count), \
- size_add(sizeof(*(p)), flex_array_size(p, member, count)))
+ max(sizeof(*(p)), \
+ __builtin_choose_expr(__is_constexpr(count), \
+ offsetof(typeof(*(p)), member) + \
+ flex_array_size(p, member, count), \
+ size_add(offsetof(typeof(*(p)), member), \
+ flex_array_size(p, member, count))))
#endif /* __LINUX_OVERFLOW_H */