> From: "Ted Unangst" <[email protected]> > Date: Fri, 29 Jul 2016 18:38:20 -0400 > > I'm a little confused about the following. > > > @@ -520,7 +522,7 @@ uaddr_lin_select(struct vm_map *map, str > > /* Deal with guardpages: search for space with one extra page. */ > > guard_sz = ((map->flags & VM_MAP_GUARDPAGES) == 0 ? 0 : PAGE_SIZE); > > > > - if (uaddr->uaddr_maxaddr - uaddr->uaddr_minaddr < sz + guard_sz) > > + if (uaddr->uaddr_maxaddr - uaddr->uaddr_minaddr - guard_sz < sz) > > return ENOMEM; > > return uvm_addr_linsearch(map, uaddr, entry_out, addr_out, 0, sz, > > align, offset, 1, uaddr->uaddr_minaddr, uaddr->uaddr_maxaddr - sz, > > @@ -582,6 +584,8 @@ uaddr_rnd_select(struct vm_map *map, str > > /* Deal with guardpages: search for space with one extra page. */ > > guard_sz = ((map->flags & VM_MAP_GUARDPAGES) == 0 ? 0 : PAGE_SIZE); > > > > + if (uaddr->uaddr_maxaddr - guard_sz < sz) > > + return ENOMEM; > > minaddr = uvm_addr_align_forward(uaddr->uaddr_minaddr, align, offset); > > maxaddr = uvm_addr_align_backward(uaddr->uaddr_maxaddr - sz - guard_sz, > > align, offset); > > This one especially. Shouldn't there be a minaddr check? It seems weird to > compare addresses against sizes.
Not really that weird. All I'm checking here is that (uaddr->uaddr_maxaddr - sz - guard_sz) won't underflow because sz is too large. And that is to prevent that maxaddr becomes larger than uaddr->uaddr_maxaddr wen the alignment is applied two lines down.
