summaryrefslogtreecommitdiff
path: root/libparted/fs/ext2/interface.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2007-06-15 16:06:34 +0200
committerJim Meyering <meyering@redhat.com>2009-07-24 15:04:39 +0200
commit7e3e3b488ba25a38097c5f111eec77c428ae5e54 (patch)
treee3e17463e3749073eac4eb1d0c458131368eb037 /libparted/fs/ext2/interface.c
parent587b8ae72c9028f192ec0df05bc211eb00eee599 (diff)
downloadparted-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.c34
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*