diff options
author | Jim Meyering <jim@meyering.net> | 2007-06-15 16:06:34 +0200 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2009-07-24 15:04:39 +0200 |
commit | 7e3e3b488ba25a38097c5f111eec77c428ae5e54 (patch) | |
tree | e3e17463e3749073eac4eb1d0c458131368eb037 /libparted/fs/ext2/interface.c | |
parent | 587b8ae72c9028f192ec0df05bc211eb00eee599 (diff) | |
download | parted-7e3e3b488ba25a38097c5f111eec77c428ae5e54.tar.gz |
Still working on making label support work.
* libparted/fs/ext2/interface.c (_ext2_generic_probe): The call to
ped_geometry_read_alloc would clobber the stack after SB whenever
block_size > 512. Instead, use new function, ped_geometry_read_alloc,
and adjust all uses of SB.
(_ext2_clobber): Likewise.
* libparted/cs/geom.c (ped_geometry_read_alloc): New function.
* include/parted/geom.h: Declare it.
Diffstat (limited to 'libparted/fs/ext2/interface.c')
-rw-r--r-- | libparted/fs/ext2/interface.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/libparted/fs/ext2/interface.c b/libparted/fs/ext2/interface.c index 907f349..4991898 100644 --- a/libparted/fs/ext2/interface.c +++ b/libparted/fs/ext2/interface.c @@ -34,9 +34,9 @@ struct ext2_dev_handle* ext2_make_dev_handle_from_parted_geometry(PedGeometry* g static PedGeometry* _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver) { - struct ext2_super_block sb; + struct ext2_super_block *sb; - if (!ped_geometry_read(geom, &sb, 2, 2)) + if (!ped_geometry_read_alloc(geom, &sb, 2, 2)) return NULL; if (EXT2_SUPER_MAGIC(sb) == EXT2_SUPER_MAGIC_CONST) { @@ -63,6 +63,7 @@ _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver) if (is_ext4) is_ext3 = 0; } + free (sb); if (expect_ext_ver == 2 && (is_ext3 || is_ext4)) return NULL; @@ -80,7 +81,7 @@ _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver) - first_data_block; if (start < 0) - return NULL; + goto no_match; ped_geometry_init (&probe_geom, geom->dev, start, block_count * block_size); return _ext2_generic_probe (&probe_geom, @@ -90,6 +91,10 @@ _ext2_generic_probe (PedGeometry* geom, int expect_ext_ver) block_count * block_size); } } + else { + free (sb); + } + return NULL; } @@ -115,15 +120,20 @@ _ext4_probe (PedGeometry* geom) static int _ext2_clobber (PedGeometry* geom) { - struct ext2_super_block sb; - - if (!ped_geometry_read(geom, &sb, 2, 2)) - return 0; - if (EXT2_SUPER_MAGIC(sb) != EXT2_SUPER_MAGIC_CONST) - return 1; - - sb.s_magic = 0; - return ped_geometry_write(geom, &sb, 2, 2); + struct ext2_super_block *sb; + int ok = 0; + + if (ped_geometry_read_alloc(geom, &sb, 2, 2)) { + /* Clobber only if there's a matching magic number. */ + if (EXT2_SUPER_MAGIC(*sb) != EXT2_SUPER_MAGIC_CONST) { + ok = 1; + } else { + sb->s_magic = 0; + ok = ped_geometry_write(geom, sb, 2, 2); + } + free (sb); + } + return ok; } static PedFileSystem* |