Fix an underflow bug in __lmb_alloc_base
PATCH 1/1 Fix an underflow bug in __lmb_alloc_base
__lmb_alloc_base can underflow if it fails to find free space. This was fixed in linux with commit d9024df02ffe74d723d97d552f86de3b34beb8cc. This patch merely updates __lmb_alloc_base to resemble the current version in Linux.
Signed-off-by Andy Fleming <[email protected]>
--- lib_generic/lmb.c | 34 +++++++++++++++++++--------------- 1 files changed, 19 insertions(+), 15 deletions(-)
lib_generic/lmb.c +19 -15
@@ -284,11 +284,14 @@ ulong __lmb_alloc_base(struct lmb *lmb, ulong size, ulong align, ulong max_addr) {long i, j;ulong base =0 ; +ulong res_base;for (i = lmb->memory.cnt-1 ; i >=0 ; i--) {ulong lmbbase = lmb->memory.region[i].base;ulong lmbsize = lmb->memory.region[i].size; +if (lmbsize < size) +continue ;if (max_addr ==LMB_ALLOC_ANYWHERE ) base =lmb_align_down (lmbbase + lmbsize - size, align);else if (lmbbase < max_addr) {
@@ -297,22 +300,23 @@ ulong __lmb_alloc_base(struct lmb *lmb, ulong size, ulong align, ulong max_addr) }else continue ; -while ((lmbbase <= base) && - ((j =lmb_overlaps_region (&(lmb->reserved), base, size)) >=0 ) ) - base =lmb_align_down (lmb->reserved.region[j].base - size, - align); - -if ((base !=0 ) && (lmbbase <= base)) -break ; +while (base && lmbbase <= base) { + j =lmb_overlaps_region (&lmb->reserved, base, size); +if (j <0 ) { +/* This area isn't reserved, take it */ +if (lmb_add_region (&lmb->reserved, base, +lmb_align_up (size, + align)) <0 ) +return 0 ; +return base; + } + res_base = lmb->reserved.region[j].base; +if (res_base < size) +break ; + base =lmb_align_down (res_base - size, align); + } } - -if (i <0 ) -return 0 ; - -if (lmb_add_region (&(lmb->reserved), base,lmb_align_up (size, align)) <0 ) -return 0 ; - -return base; +return 0 ; }int lmb_is_reserved (struct lmb *lmb,ulong addr)
Signature · 1 line
1.5.4.GIT