mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[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:
parent
50d119ba0b
commit
4ebed1eac2
5 changed files with 33 additions and 16 deletions
21
src/iso.c
21
src/iso.c
|
@ -33,6 +33,7 @@
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <virtdisk.h>
|
#include <virtdisk.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include <cdio/cdio.h>
|
#include <cdio/cdio.h>
|
||||||
#include <cdio/logging.h>
|
#include <cdio/logging.h>
|
||||||
|
@ -51,6 +52,10 @@
|
||||||
#define PROGRESS_THRESHOLD 128
|
#define PROGRESS_THRESHOLD 128
|
||||||
#define FOUR_GIGABYTES 4294967296LL
|
#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
|
// Needed for UDF ISO access
|
||||||
CdIo_t* cdio_open (const char* psz_source, driver_id_t driver_id) {return NULL;}
|
CdIo_t* cdio_open (const char* psz_source, driver_id_t driver_id) {return NULL;}
|
||||||
void cdio_destroy (CdIo_t* p_cdio) {}
|
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)
|
if (file_length >= FOUR_GIGABYTES)
|
||||||
img_report.has_4GB_file = TRUE;
|
img_report.has_4GB_file = TRUE;
|
||||||
// Compute projected size needed
|
// Compute projected size needed (NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE)
|
||||||
total_blocks += file_length / ISO_BLOCKSIZE;
|
if (file_length != 0)
|
||||||
// NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE
|
total_blocks += (file_length + (ISO_BLOCKSIZE - 1)) / ISO_BLOCKSIZE;
|
||||||
if ((file_length != 0) && (file_length % ISO_BLOCKSIZE != 0))
|
|
||||||
total_blocks++;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
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) {
|
if (length < 0) {
|
||||||
goto out;
|
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 (udf_is_dir(p_udf_dirent)) {
|
||||||
if (!scan_only) {
|
if (!scan_only) {
|
||||||
psz_sanpath = sanitize_filename(psz_fullpath, &is_identical);
|
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
|
// 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);
|
is_symlink = (p_statbuf->rr.psz_symlink != NULL);
|
||||||
if (is_symlink)
|
if (is_symlink)
|
||||||
img_report.has_symlinks = TRUE;
|
img_report.has_symlinks = SYMLINKS_RR;
|
||||||
if (scan_only)
|
if (scan_only)
|
||||||
safe_free(p_statbuf->rr.psz_symlink);
|
safe_free(p_statbuf->rr.psz_symlink);
|
||||||
} else {
|
} else {
|
||||||
|
@ -769,7 +774,6 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
|
||||||
} else {
|
} else {
|
||||||
uprintf("Extracting files...\n");
|
uprintf("Extracting files...\n");
|
||||||
IGNORE_RETVAL(_chdirU(app_dir));
|
IGNORE_RETVAL(_chdirU(app_dir));
|
||||||
// PrintInfo(0, MSG_231);
|
|
||||||
if (total_blocks == 0) {
|
if (total_blocks == 0) {
|
||||||
uprintf("Error: ISO has not been properly scanned.\n");
|
uprintf("Error: ISO has not been properly scanned.\n");
|
||||||
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN);
|
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
|
// 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
|
// 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.
|
// 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;
|
iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
|
||||||
}
|
}
|
||||||
if (!enable_rockridge) {
|
if (!enable_rockridge) {
|
||||||
|
|
|
@ -87,6 +87,12 @@
|
||||||
#if !defined S_IFIFO && defined _WIN32
|
#if !defined S_IFIFO && defined _WIN32
|
||||||
# define S_IFIFO 0x1000
|
# define S_IFIFO 0x1000
|
||||||
#endif
|
#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
|
#if !defined S_ISBLK && defined S_IFBLK
|
||||||
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||||
|
|
|
@ -1073,8 +1073,12 @@ static void DisplayISOProps(void)
|
||||||
(img_report.wininst_version >> 16) & 0xff, (img_report.wininst_version >> 8) & 0xff,
|
(img_report.wininst_version >> 16) & 0xff, (img_report.wininst_version >> 8) & 0xff,
|
||||||
(img_report.wininst_version >= SPECIAL_WIM_VERSION) ? "+": "");
|
(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,
|
||||||
PRINT_ISO_PROP(img_report.has_symlinks, " Because of this, some features from this image may not work...");
|
" 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
|
// Insert the image name into the Boot selection dropdown
|
||||||
|
|
|
@ -312,6 +312,8 @@ enum checksum_type {
|
||||||
#define HAS_WINTOGO(r) (HAS_BOOTMGR(r) && IS_EFI_BOOTABLE(r) && HAS_WININST(r))
|
#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 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 IS_FAT(fs) ((fs_type == FS_FAT16) || (fs_type == FS_FAT32))
|
||||||
|
#define SYMLINKS_RR 0x01
|
||||||
|
#define SYMLINKS_UDF 0x02
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char label[192]; // 3*64 to account for UTF-8
|
char label[192]; // 3*64 to account for UTF-8
|
||||||
|
@ -331,9 +333,9 @@ typedef struct {
|
||||||
uint16_t winpe;
|
uint16_t winpe;
|
||||||
uint8_t has_efi;
|
uint8_t has_efi;
|
||||||
uint8_t wininst_index;
|
uint8_t wininst_index;
|
||||||
|
uint8_t has_symlinks;
|
||||||
BOOLEAN has_4GB_file;
|
BOOLEAN has_4GB_file;
|
||||||
BOOLEAN has_long_filename;
|
BOOLEAN has_long_filename;
|
||||||
BOOLEAN has_symlinks;
|
|
||||||
BOOLEAN has_bootmgr;
|
BOOLEAN has_bootmgr;
|
||||||
BOOLEAN has_bootmgr_efi;
|
BOOLEAN has_bootmgr_efi;
|
||||||
BOOLEAN has_autorun;
|
BOOLEAN has_autorun;
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 3.9.1600"
|
CAPTION "Rufus 3.9.1601"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -394,8 +394,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,9,1600,0
|
FILEVERSION 3,9,1601,0
|
||||||
PRODUCTVERSION 3,9,1600,0
|
PRODUCTVERSION 3,9,1601,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -413,13 +413,13 @@ BEGIN
|
||||||
VALUE "Comments", "https://rufus.ie"
|
VALUE "Comments", "https://rufus.ie"
|
||||||
VALUE "CompanyName", "Akeo Consulting"
|
VALUE "CompanyName", "Akeo Consulting"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "3.9.1600"
|
VALUE "FileVersion", "3.9.1601"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||||
VALUE "OriginalFilename", "rufus-3.9.exe"
|
VALUE "OriginalFilename", "rufus-3.9.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.9.1600"
|
VALUE "ProductVersion", "3.9.1601"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue