diff options
author | Jonathan Liu <net147@gmail.com> | 2013-10-04 07:32:12 -0700 |
---|---|---|
committer | Jim Meyering <meyering@fb.com> | 2013-10-09 20:25:34 -0700 |
commit | 70aa35b2b4d2e723fe82ac3184e5921a52be73ab (patch) | |
tree | 99f7aeccec390116b231c3a990b8e23e722b6d89 /libparted/fs/r/fat | |
parent | 1c659d5cc6830c6f4f26660e9049582afbad3fd3 (diff) | |
download | parted-70aa35b2b4d2e723fe82ac3184e5921a52be73ab.tar.gz |
dos: improve MBR signature generation
Using tv_usec in struct timeval from gettimeofday() doesn't provide
enough precision to fill an unsigned 32-bit integer and isn't really
random. It it always less than one million when using the GNU C library
while an unsigned 32-bit integer ranges between 0 and 4294967295.
In FAT filesystem creation, parted already uses a better random
generator, so move that code into a common function and use it
for MS-DOS MBR signature generation.
* libparted/fs/r/fat/fat.c (_gen_new_serial_number): Remove.
(fat_create): Use generate_random_uint32 instead of
_gen_new_serial_number.
* libparted/labels/dos.c (generate_random_id): Remove.
(msdos_write): Use generate_random_uint32 instead of
generate_random_id.
* libparted/labels/misc.h (generate_random_uint32): New function.
Created from _gen_new_serial_number in libparted/fs/r/fat/fat.c with
additional check to avoid returning zero, which may be interpreted
as no FAT serial number or no MBR signature.
Diffstat (limited to 'libparted/fs/r/fat')
-rw-r--r-- | libparted/fs/r/fat/fat.c | 19 |
1 files changed, 2 insertions, 17 deletions
diff --git a/libparted/fs/r/fat/fat.c b/libparted/fs/r/fat/fat.c index 2ab9279..c8e4552 100644 --- a/libparted/fs/r/fat/fat.c +++ b/libparted/fs/r/fat/fat.c @@ -18,10 +18,10 @@ #include <config.h> #include <string.h> -#include <uuid/uuid.h> #include "fat.h" #include "calc.h" +#include "../../../labels/misc.h" PedFileSystem* fat_alloc (const PedGeometry* geom) @@ -202,21 +202,6 @@ fat_root_dir_clear (PedFileSystem* fs) fs_info->root_dir_sector_count); } -/* hack: use the ext2 uuid library to generate a reasonably random (hopefully - * with /dev/random) number. Unfortunately, we can only use 4 bytes of it - */ -static uint32_t -_gen_new_serial_number (void) -{ - union { - uuid_t uuid; - uint32_t i; - } uu32; - - uuid_generate (uu32.uuid); - return uu32.i; -} - PedFileSystem* fat_create (PedGeometry* geom, FatType fat_type, PedTimer* timer) { @@ -316,7 +301,7 @@ fat_create (PedGeometry* geom, FatType fat_type, PedTimer* timer) return 0; } - fs_info->serial_number = _gen_new_serial_number (); + fs_info->serial_number = generate_random_uint32 (); if (!fat_boot_sector_set_boot_code (&fs_info->boot_sector)) goto error_free_buffers; |