diff options
author | H. Peter Anvin <hpa@zytor.com> | 2010-01-27 15:45:01 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2010-01-27 15:45:01 -0800 |
commit | 1b07af66b1632a5ae269770015583d1b8d48deed (patch) | |
tree | d66342fb4f3051ff87d38bf99312eb15c5f3a2e8 | |
parent | 9ce3e9ca7775032be2bad8ce80fd72eb60af7d69 (diff) | |
download | syslinux-1b07af66b1632a5ae269770015583d1b8d48deed.tar.gz |
chain.c32: Handle nonlinear logical partitionssyslinux-3.85-pre3
Some partitioning program, including at least parted, apparently
create the list of logical partition headers nonlinearly with the
partition themselves. Thus, make it a requirement that then fit
inside the overall extended partition, but not inside the
corresponding sublogical partition.
Reported-by: Gert Huselmans <gerth@zytor.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | com32/modules/chain.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/com32/modules/chain.c b/com32/modules/chain.c index 2dd80746..458ea890 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * * * Copyright 2003-2009 H. Peter Anvin - All Rights Reserved - * Copyright 2009 Intel Corporation; author: H. Peter Anvin + * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -394,10 +394,13 @@ static struct part_entry *find_logical_partition(int whichpart, char *table, /* Adjust the offset to account for the extended partition itself */ ptab[i].start_lba += self->start_lba; - /* Sanity check entry: must not extend outside the extended partition. - This is necessary since some OSes put crap in some entries. */ - if (ptab[i].start_lba + ptab[i].length <= self->start_lba || - ptab[i].start_lba >= self->start_lba + self->length) + /* + * Sanity check entry: must not extend outside the + * extended partition. This is necessary since some OSes + * put crap in some entries. Note that root is non-NULL here. + */ + if (ptab[i].start_lba + ptab[i].length <= root->start_lba || + ptab[i].start_lba >= root->start_lba + root->length) continue; /* OK, it's a data partition. Is it the one we're looking for? */ |