From 1757e6f081cc74485bc3dc7921fe18feff001727 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Thu, 13 Feb 2014 21:25:34 +0000 Subject: [PATCH] [iso] fix a libcdio memleak for RR symlinks * Also handle symlinks more gracefully by telling the user that they are ignored * Also tell the user which extensions will be used on extraction --- src/iso.c | 27 +++++++++++++++++++++++---- src/rufus.c | 6 +++--- src/rufus.h | 1 + src/rufus.rc | 12 ++++++------ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/iso.c b/src/iso.c index 6c41ea27..ebd44455 100644 --- a/src/iso.c +++ b/src/iso.c @@ -345,7 +345,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) { HANDLE file_handle = NULL; DWORD buf_size, wr_size, err; - BOOL s, is_syslinux_cfg, is_old_c32[NB_OLD_C32]; + BOOL s, is_syslinux_cfg, is_old_c32[NB_OLD_C32], is_symlink; int i_length, r = 1; char tmp[128], psz_fullpath[1024], *psz_basename; const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)]; @@ -379,10 +379,18 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) || (strcmp(p_statbuf->filename, "..") == 0) ) continue; // Rock Ridge requires an exception + is_symlink = FALSE; if ((p_statbuf->rr.b3_rock == yep) && enable_rockridge) { safe_strcpy(psz_basename, sizeof(psz_fullpath)-i_length-1, p_statbuf->filename); if (safe_strlen(p_statbuf->filename) > 64) iso_report.has_long_filename = TRUE; + // libcdio has a memleak for Rock Ridge symlinks. It doesn't look like there's an easy fix there as + // 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) + iso_report.has_symlinks = TRUE; + if (scan_only) + safe_free(p_statbuf->rr.psz_symlink); } else { iso9660_name_translate_ext(p_statbuf->filename, psz_basename, i_joliet_level); } @@ -419,6 +427,11 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) continue; if (sanitize_filename(psz_fullpath)) uprintf(" File name sanitized to '%s'\n", psz_fullpath); + if (is_symlink) { + if (i_file_length == 0) + uprintf(" Ignoring Rock Ridge symbolic link to '%s'\n", p_statbuf->rr.psz_symlink); + safe_free(p_statbuf->rr.psz_symlink); + } file_handle = CreateFileU(psz_fullpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { @@ -544,9 +557,9 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) 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. If that is the case (has_long_filename) - // then we also disable Joliet during the extract phase. - if ((!enable_joliet) || (scan_only && enable_rockridge) || (iso_report.has_long_filename && enable_rockridge)) { + // 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 || iso_report.has_long_filename || iso_report.has_symlinks))) { iso_extension_mask &= ~ISO_EXTENSION_JOLIET; } if (!enable_rockridge) { @@ -567,6 +580,12 @@ try_iso: safe_free(tmp); } else iso_report.label[0] = 0; + } else { + if (iso_extension_mask & (ISO_EXTENSION_JOLIET|ISO_EXTENSION_ROCK_RIDGE)) + uprintf("This image will be extracted using %s extensions (if present)", + (iso_extension_mask & ISO_EXTENSION_JOLIET)?"Joliet":"Rock Ridge"); + else + uprintf("This image will not be extracted using any ISO extensions"); } r = iso_extract_files(p_iso, ""); diff --git a/src/rufus.c b/src/rufus.c index 114af8b4..3b6e5e06 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -1242,10 +1242,10 @@ DWORD WINAPI ISOScanThread(LPVOID param) if (HAS_SYSLINUX(iso_report)) { safe_sprintf(isolinux_str, sizeof(isolinux_str), "Yes (%s)", iso_report.sl_version_str); } - uprintf("ISO label: '%s'\r\n Size: %lld bytes\r\n Has a >64 chars filename: %s\r\n Has a >4GB file: %s\r\n" + uprintf("ISO label: '%s'\r\n Size: %lld bytes\r\n Has a >64 chars filename: %s\r\n Has Symlinks: %s\r\n Has a >4GB file: %s\r\n" " ReactOS: %s\r\n Uses EFI: %s%s\r\n Uses Bootmgr: %s\r\n Uses WinPE: %s%s\r\n Uses isolinux: %s\r\n", - iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", iso_report.has_4GB_file?"Yes":"No", - IS_REACTOS(iso_report)?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No", + iso_report.label, iso_report.projected_size, iso_report.has_long_filename?"Yes":"No", iso_report.has_symlinks?"Yes":"No", + iso_report.has_4GB_file?"Yes":"No", IS_REACTOS(iso_report)?"Yes":"No", (iso_report.has_efi || iso_report.has_win7_efi)?"Yes":"No", (iso_report.has_win7_efi && (!iso_report.has_efi))?" (win7_x64)":"", iso_report.has_bootmgr?"Yes":"No", IS_WINPE(iso_report.winpe)?"Yes":"No", (iso_report.uses_minint)?" (with /minint)":"", isolinux_str); if (HAS_SYSLINUX(iso_report) && (SL_MAJOR(iso_report.sl_version) < 5)) { diff --git a/src/rufus.h b/src/rufus.h index d97ec22d..f2ab1ef8 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -235,6 +235,7 @@ typedef struct { uint8_t winpe; BOOL has_4GB_file; BOOL has_long_filename; + BOOL has_symlinks; BOOL has_bootmgr; BOOL has_efi; BOOL has_win7_efi; diff --git a/src/rufus.rc b/src/rufus.rc index a3b714db..06e5bf01 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.4.4.407" +CAPTION "Rufus 1.4.4.408" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -165,7 +165,7 @@ END RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.4.4.407" +CAPTION "Rufus 1.4.4.408" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -427,8 +427,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,4,407 - PRODUCTVERSION 1,4,4,407 + FILEVERSION 1,4,4,408 + PRODUCTVERSION 1,4,4,408 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -445,13 +445,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.4.4.407" + VALUE "FileVersion", "1.4.4.408" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.4.4.407" + VALUE "ProductVersion", "1.4.4.408" END END BLOCK "VarFileInfo"