From 5482d5d7b480adb804ab4b97258e4dbfe57a3c6d Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 25 Nov 2010 14:40:44 +0100 Subject: [PATCH] Improvements about the block address of empty data files --- doc/boot_sectors.txt | 42 +----------------------------------------- libisofs/ecma119.c | 7 +++++++ libisofs/ecma119.h | 5 +++++ libisofs/eltorito.c | 10 +++++++++- libisofs/filesrc.c | 7 ++++++- libisofs/libisofs.h | 1 - 6 files changed, 28 insertions(+), 44 deletions(-) diff --git a/doc/boot_sectors.txt b/doc/boot_sectors.txt index b74008b..698c11c 100644 --- a/doc/boot_sectors.txt +++ b/doc/boot_sectors.txt @@ -258,7 +258,7 @@ Sources: The candidates for MBR booting will normally use El Torito rather than MBR if the ISO image is presented on CD, DVD, or BD media. -The eventual MBR comes into effect it the image is on a media that is +The eventual MBR comes into effect if the image is on a media that is interpreted by the BIOS as some kind of hard disk. Usually real hard disks, floppy disks, USB sticks, memory cards. @@ -526,46 +526,6 @@ Byte Range | Value | Meaning up to 2048 | 0 | ISO 9660 Block end padding ---------- | ---------- | ---------------------------------------------------- -Test image produced by - genisoimage -o /u/test/mips_boot.iso -mips-boot checksum.c jte -which reports - Found mips boot image checksum.c, using extent 636 (0x27C), #blocks 14336 (0x3800) - -xorriso reports as 2048 byte LBA of the boot image dummy file - File data lba: 0 , 159 , 7 , 14330 , '/CHECKSUM.C' - -First 512 bytes in hex: - 0 : 0b e5 a9 41 00 00 00 00 00 00 00 00 00 00 00 00 - 16 : 00 00 00 00 00 00 00 00 00 00 00 00 00 51 00 00 - 32 : 00 01 00 00 00 00 00 20 02 00 00 00 00 00 00 34 - 48 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - 64 : 00 00 00 00 00 00 00 00 63 68 65 63 6b 73 75 6d - 80 : 00 00 02 7c 00 00 38 00 00 00 00 00 00 00 00 00 -... 0 ... - 400 : 00 00 00 00 00 00 00 00 00 00 0a 28 00 00 00 00 - 416 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - 432 : 00 00 0a 28 00 00 00 00 00 00 00 06 00 00 00 00 -... 0 ... - 496 : 00 00 00 00 00 00 00 00 22 ec 2c c9 00 00 00 00 - -The 32 bit two's complement of bytes 0 to 503 is 0x22ec2cc9. - -In decimal: - 0 : 11 229 169 65 0 0 0 0 0 0 0 0 0 0 0 0 - 16 : 0 0 0 0 0 0 0 0 0 0 0 0 0 81 0 0 - 32 : 0 1 0 0 0 0 0 32 2 0 0 0 0 0 0 52 - 48 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 64 : 0 0 0 0 0 0 0 0 99 104 101 99 107 115 117 109 - 80 : 0 0 2 124 0 0 56 0 0 0 0 0 0 0 0 0 -... 0 ... - 400 : 0 0 0 0 0 0 0 0 0 0 10 40 0 0 0 0 - 416 : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 432 : 0 0 10 40 0 0 0 0 0 0 0 6 0 0 0 0 -... 0 ... - 496 : 0 0 0 0 0 0 0 0 34 236 44 201 0 0 0 0 - -Cleartext part: - 64 : c h e c k s u m ------------------------------------------------------------------------------ diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index ec4be4d..a25c08d 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -1730,6 +1730,8 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) target->mipsel_p_vaddr = 0; target->mipsel_p_filesz = 0; + target->empty_file_block = 0; + for (i = 0; i < ISO_MAX_PARTITIONS; i++) { target->appended_partitions[i] = NULL; if (opts->appended_partitions[i] != NULL) { @@ -1833,6 +1835,11 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) /* Volume Descriptor Set Terminator */ target->curblock++; + /* All empty files point to the Volume Descriptor Set Terminator + * rather than to addresses of non-empty files. + */ + target->empty_file_block = target->curblock - 1; + /* * Create the writer for possible padding to ensure that in case of image * growing we can safely overwrite the first 64 KiB of image. diff --git a/libisofs/ecma119.h b/libisofs/ecma119.h index c65610a..3f0cf22 100644 --- a/libisofs/ecma119.h +++ b/libisofs/ecma119.h @@ -470,6 +470,11 @@ struct ecma119_image */ uint32_t curblock; + /* + * The address to be used for the content pointer of empty data files. + */ + uint32_t empty_file_block; + /* * number of dirs in ECMA-119 tree, computed together with dir position, * and needed for path table computation in a efficient way diff --git a/libisofs/eltorito.c b/libisofs/eltorito.c index 01acb53..8e8af13 100644 --- a/libisofs/eltorito.c +++ b/libisofs/eltorito.c @@ -309,6 +309,7 @@ int create_image(IsoImage *image, const char *image_path, int boot_media_type = 0; int load_sectors = 0; /* number of sector to load */ unsigned char partition_type = 0; + off_t size; IsoNode *imgfile; IsoStream *stream; @@ -331,9 +332,16 @@ int create_image(IsoImage *image, const char *image_path, return ISO_BOOT_IMAGE_NOT_VALID; } + size = iso_stream_get_size(stream); + if (size <= 0) { + iso_msg_submit(image->id, ISO_BOOT_IMAGE_NOT_VALID, 0, + "Boot image file is empty"); + return ISO_BOOT_IMAGE_NOT_VALID; + } + switch (type) { case ELTORITO_FLOPPY_EMUL: - switch (iso_stream_get_size(stream)) { + switch (size) { case 1200 * 1024: boot_media_type = 1; /* 1.2 meg diskette */ break; diff --git a/libisofs/filesrc.c b/libisofs/filesrc.c index f1f7732..4f0afbc 100644 --- a/libisofs/filesrc.c +++ b/libisofs/filesrc.c @@ -266,7 +266,12 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer) /* * final section */ - file->sections[extent].block = t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE); + if (section_size <= 0) { + file->sections[extent].block = t->empty_file_block; + } else { + file->sections[extent].block = + t->curblock + extent * (ISO_EXTENT_SIZE / BLOCK_SIZE); + } file->sections[extent].size = (uint32_t)section_size; t->curblock += DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE); diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index 5a79efb..f3bf6aa 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -1224,7 +1224,6 @@ void iso_write_opts_free(IsoWriteOpts *opts); */ int iso_write_opts_set_will_cancel(IsoWriteOpts *opts, int will_cancel); - /** * Set the ISO-9960 level to write at. *