diff options
author | jhb <jhb@FreeBSD.org> | 2006-12-04 16:45:23 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-12-04 16:45:23 +0000 |
commit | 12956f1daaf69458d84752b662210d76d515b35f (patch) | |
tree | 9189a13c98badf1c81bac72989148d787fd195bf /sys/kern/subr_rman.c | |
parent | b5c537984bd463a59efd5ae8b00db2da6b4b2a79 (diff) | |
download | FreeBSD-src-12956f1daaf69458d84752b662210d76d515b35f.zip FreeBSD-src-12956f1daaf69458d84752b662210d76d515b35f.tar.gz |
Fix an edge case in rman_manage_region() where it didn't handle a resource
ending at ULONG_MAX properly. While here, use TAILQ_FOREACH_SAFE().
Tested by: "Stephane E. Potvin" <sepotvin at videotron-ca>
MFC after: 1 week
Diffstat (limited to 'sys/kern/subr_rman.c')
-rw-r--r-- | sys/kern/subr_rman.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c index f59327a..b17ea74 100644 --- a/sys/kern/subr_rman.c +++ b/sys/kern/subr_rman.c @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> +#include <sys/limits.h> #include <sys/lock.h> #include <sys/malloc.h> #include <sys/mutex.h> @@ -169,10 +170,12 @@ rman_manage_region(struct rman *rm, u_long start, u_long end) mtx_lock(rm->rm_mtx); /* Skip entries before us. */ - for (s = TAILQ_FIRST(&rm->rm_list); - s && s->r_end + 1 < r->r_start; - s = TAILQ_NEXT(s, r_link)) - ; + TAILQ_FOREACH(s, &rm->rm_list, r_link) { + if (s->r_end == ULONG_MAX) + break; + if (s->r_end + 1 >= r->r_start) + break; + } /* If we ran off the end of the list, insert at the tail. */ if (s == NULL) { |