On Thu, Aug 20, 2020 at 07:14:13AM +0800, Qu Wenruo wrote:
quoted
quoted
+static inline int check_eb_range(const struct extent_buffer *eb,
+ unsigned long start, unsigned long len)
+{
+ /* start, start + len should not go beyond eb->len nor overflow */
+ if (unlikely(start > eb->len || start + len > eb->len ||
+ len > eb->len)) {
Can the number of condition be reduced? If 'start + len' overflows, then
we don't need to check 'start > eb->len', and for the case where
start = 1024 and len = -1024 the 'len > eb-len' would be enough.
I'm afraid not.
Although 'start > eb->len || len > eb->len' is enough to detect overflow
case, it no longer detects cases like 'start = 2k, len = 3k' while
eb->len == 4K case.
So we still need all 3 checks.
I was suggesting 'start + len > eb->len', not 'start > eb-len'.
"start > eb->len" is implied by "start + len > eb->len".