[linux-lvm] Tr: Possible LVM bug in 2.4.19-rc1
Heinz J . Mauelshagen
mauelshagen at sistina.com
Mon Jul 8 04:15:02 UTC 2002
FYI: have fixed this OBO error in CVS (Branch LVM_BRANCH_1-0)
and send a patch for 2.4 to Marcelo.
Thanks to Benjamin and Olaf for pointing this one out :)
Regards,
Heinz -- The LVM Guy --
On Fri, Jul 05, 2002 at 12:28:09PM +0200, Benjamin Herrenschmidt wrote:
> ---------------- Début du message transmis ----------------
> Sujet: Possible LVM bug in 2.4.19-rc1
> Envoyé: jeudi 4 juillet 2002 13:59
> De: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> À: linux-kernel at vger.kernel.org
>
> Hi !
>
> Olaf and I have been tracking down a bug where the kernel died
> into lvm_blk_open() during boot on pmac, and later on other PPCs
> when trying to access an unconfigured LVM block device (or an
> LVM minor not associated yet). This typically happened in the
> pmac root discovery code which walks all gendisks, but I beleive
> there are other possible exploits.
>
> Here's what I've tracked down so far:
>
> static int lvm_blk_open(struct inode *inode, struct file *file)
> {
> int minor = MINOR(inode->i_rdev);
> lv_t *lv_ptr;
> vg_t *vg_ptr = vg[VG_BLK(minor)];
>
> P_DEV("blk_open MINOR: %d VG#: %d LV#: %d mode: %s%s\n",
> minor, VG_BLK(minor), LV_BLK(minor),
> MODE_TO_STR(file->f_mode));
>
> #ifdef LVM_TOTAL_RESET
> if (lvm_reset_spindown > 0)
> return -EPERM;
> #endif
>
> if (vg_ptr != NULL &&
> (vg_ptr->vg_status & VG_ACTIVE) &&
>
> .../...
>
> At this point, no association have been made. That is VG_BLK(minor)
> will return vg_lv_map[minor].vg_number which has been initialized
> to ABS_MAX_VG in lvm_init_vars().
>
> That means that vg_ptr is set to vg[ABS_MAX_VG], which is right outside
> the array bounds, as vg is declared to be
>
> /* volume group descriptor area pointers */
> vg_t *vg[ABS_MAX_VG];
>
> So, as soon as we dereference vg_ptr, we get whatever garbage is located
> right after the array, and not the NULL value we would expect for a non
> initialized association.
>
> If my understanding is correct, then a simple fix would be to
>
> /* volume group descriptor area pointers */
> - vg_t *vg[ABS_MAX_VG];
> + vg_t *vg[ABS_MAX_VG+1];
>
> though it's a bit hackish... maybe we should just test
> VG_BLK < ABS_MAX_VG
>
> Also, the loop initializing vg array to NULL can probably be removed
> from lvm_init_vars as vg is part of the BSS and thus cleared by default.
>
> Did I miss something ?
>
> Ben.
>
> ----------------- Fin du message transmis -----------------
>
>
>
> _______________________________________________
> linux-lvm mailing list
> linux-lvm at sistina.com
> http://lists.sistina.com/mailman/listinfo/linux-lvm
> read the LVM HOW-TO at http://www.sistina.com/lvm/Pages/howto.html
*** Software bugs are stupid.
Nevertheless it needs not so stupid people to solve them ***
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Heinz Mauelshagen Sistina Software Inc.
Senior Consultant/Developer Am Sonnenhang 11
56242 Marienrachdorf
Germany
Mauelshagen at Sistina.com +49 2626 141200
FAX 924446
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
More information about the linux-lvm
mailing list