[iso] report usage of UDF symbolic links

* These may dramatically increase the size required for extraction
  so users may want to have some hints about these.
* Closes #1446
This commit is contained in:
Pete Batard 2020-02-05 13:23:49 +00:00
parent 50d119ba0b
commit 4ebed1eac2
No known key found for this signature in database
GPG Key ID: 38E0CF5E69EDD671
5 changed files with 33 additions and 16 deletions

View File

@ -33,6 +33,7 @@
#include <direct.h>
#include <ctype.h>
#include <virtdisk.h>
#include <sys/stat.h>
#include <cdio/cdio.h>
#include <cdio/logging.h>
@ -51,6 +52,10 @@
#define PROGRESS_THRESHOLD 128
#define FOUR_GIGABYTES 4294967296LL
// Needed for UDF symbolic link testing
#define S_IFLNK 0xA000
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
// Needed for UDF ISO access
CdIo_t* cdio_open (const char* psz_source, driver_id_t driver_id) {return NULL;}
void cdio_destroy (CdIo_t* p_cdio) {}
@ -280,11 +285,9 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t file_length, const
}
if (file_length >= FOUR_GIGABYTES)
img_report.has_4GB_file = TRUE;
// Compute projected size needed
total_blocks += file_length / ISO_BLOCKSIZE;
// NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE
if ((file_length != 0) && (file_length % ISO_BLOCKSIZE != 0))
total_blocks++;
// Compute projected size needed (NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE)
if (file_length != 0)
total_blocks += (file_length + (ISO_BLOCKSIZE - 1)) / ISO_BLOCKSIZE;
return TRUE;
}
return FALSE;
@ -463,6 +466,8 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
if (length < 0) {
goto out;
}
if (S_ISLNK(udf_get_posix_filemode(p_udf_dirent)))
img_report.has_symlinks = SYMLINKS_UDF;
if (udf_is_dir(p_udf_dirent)) {
if (!scan_only) {
psz_sanpath = sanitize_filename(psz_fullpath, &is_identical);
@ -608,7 +613,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
// a generic list that's unaware of RR extensions is being used, so we prevent that memleak ourselves
is_symlink = (p_statbuf->rr.psz_symlink != NULL);
if (is_symlink)
img_report.has_symlinks = TRUE;
img_report.has_symlinks = SYMLINKS_RR;
if (scan_only)
safe_free(p_statbuf->rr.psz_symlink);
} else {
@ -769,7 +774,6 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
} else {
uprintf("Extracting files...\n");
IGNORE_RETVAL(_chdirU(app_dir));
// PrintInfo(0, MSG_231);
if (total_blocks == 0) {
uprintf("Error: ISO has not been properly scanned.\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN);
@ -803,7 +807,8 @@ try_iso:
// Perform our first scan with Joliet disabled (if Rock Ridge is enabled), so that we can find if
// there exists a Rock Ridge file with a name > 64 chars or if there are symlinks. If that is the
// case then we also disable Joliet during the extract phase.
if ((!enable_joliet) || (enable_rockridge && (scan_only || img_report.has_long_filename || img_report.has_symlinks))) {
if ((!enable_joliet) || (enable_rockridge && (scan_only || img_report.has_long_filename ||
(img_report.has_symlinks == SYMLINKS_RR)))) {
iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
}
if (!enable_rockridge) {

View File

@ -87,6 +87,12 @@
#if !defined S_IFIFO && defined _WIN32
# define S_IFIFO 0x1000
#endif
#if !defined S_IFLNK && defined _WIN32
#define S_IFLNK 0xA000
#endif
#if !defined S_IFSOCK && defined _WIN32
#define S_IFSOCK 0xC000
#endif
#if !defined S_ISBLK && defined S_IFBLK
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)

View File

@ -1073,8 +1073,12 @@ static void DisplayISOProps(void)
(img_report.wininst_version >> 16) & 0xff, (img_report.wininst_version >> 8) & 0xff,
(img_report.wininst_version >= SPECIAL_WIM_VERSION) ? "+": "");
}
PRINT_ISO_PROP(img_report.has_symlinks, " Note: This ISO uses symbolic links, which will not be replicated due to file system limitations.");
PRINT_ISO_PROP(img_report.has_symlinks, " Because of this, some features from this image may not work...");
PRINT_ISO_PROP(img_report.has_symlinks,
" Note: This ISO uses symbolic links, which will not be replicated due to file system limitations.");
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_RR),
" Because of this, some features from this image may not work...");
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_UDF),
" Because of this, the size required for the target media may be much larger than size of the ISO...");
}
// Insert the image name into the Boot selection dropdown

View File

@ -312,6 +312,8 @@ enum checksum_type {
#define HAS_WINTOGO(r) (HAS_BOOTMGR(r) && IS_EFI_BOOTABLE(r) && HAS_WININST(r))
#define HAS_PERSISTENCE(r) ((HAS_SYSLINUX(r) || HAS_GRUB(r)) && !(HAS_WINDOWS(r) || HAS_REACTOS(r) || HAS_KOLIBRIOS(r)))
#define IS_FAT(fs) ((fs_type == FS_FAT16) || (fs_type == FS_FAT32))
#define SYMLINKS_RR 0x01
#define SYMLINKS_UDF 0x02
typedef struct {
char label[192]; // 3*64 to account for UTF-8
@ -331,9 +333,9 @@ typedef struct {
uint16_t winpe;
uint8_t has_efi;
uint8_t wininst_index;
uint8_t has_symlinks;
BOOLEAN has_4GB_file;
BOOLEAN has_long_filename;
BOOLEAN has_symlinks;
BOOLEAN has_bootmgr;
BOOLEAN has_bootmgr_efi;
BOOLEAN has_autorun;

View File

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 232, 326
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 3.9.1600"
CAPTION "Rufus 3.9.1601"
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
BEGIN
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
@ -394,8 +394,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 3,9,1600,0
PRODUCTVERSION 3,9,1600,0
FILEVERSION 3,9,1601,0
PRODUCTVERSION 3,9,1601,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -413,13 +413,13 @@ BEGIN
VALUE "Comments", "https://rufus.ie"
VALUE "CompanyName", "Akeo Consulting"
VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "3.9.1600"
VALUE "FileVersion", "3.9.1601"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
VALUE "OriginalFilename", "rufus-3.9.exe"
VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "3.9.1600"
VALUE "ProductVersion", "3.9.1601"
END
END
BLOCK "VarFileInfo"