mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[iso] notify if the file size on disk is smaller than expected ISO size
* Closes #963 * Also fix a potential issue with Notification()
This commit is contained in:
		
							parent
							
								
									390c134b7a
								
							
						
					
					
						commit
						150be52479
					
				
					 8 changed files with 46 additions and 7 deletions
				
			
		|  | @ -559,6 +559,10 @@ t MSG_293 "Unsupported Windows version" | ||||||
| t MSG_294 "This version of Windows is no longer supported by Rufus." | t MSG_294 "This version of Windows is no longer supported by Rufus." | ||||||
| t MSG_295 "Warning: Unofficial version" | t MSG_295 "Warning: Unofficial version" | ||||||
| t MSG_296 "This version of Rufus was NOT produced by its official developer(s).\n\nAre you sure you want to run it?" | t MSG_296 "This version of Rufus was NOT produced by its official developer(s).\n\nAre you sure you want to run it?" | ||||||
|  | t MSG_297 "Truncated ISO detected" | ||||||
|  | t MSG_298 "The ISO file you have selected does not match its declared size: %s of data is missing!\n\nIf you obtained " | ||||||
|  | 	"this file from the Internet, you should try to download a new copy and verify that the MD5 or SHA checksums match " | ||||||
|  | 	"the official ones.\n\nNote that you can compute the MD5 or SHA in Rufus by clicking the '#' button." | ||||||
| 
 | 
 | ||||||
| ################################################################################ | ################################################################################ | ||||||
| ############################# TRANSLATOR END COPY ############################## | ############################# TRANSLATOR END COPY ############################## | ||||||
|  |  | ||||||
|  | @ -651,6 +651,7 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) | ||||||
| 	FILE* fd; | 	FILE* fd; | ||||||
| 	int r = 1; | 	int r = 1; | ||||||
| 	iso9660_t* p_iso = NULL; | 	iso9660_t* p_iso = NULL; | ||||||
|  | 	iso9660_pvd_t pvd; | ||||||
| 	udf_t* p_udf = NULL; | 	udf_t* p_udf = NULL; | ||||||
| 	udf_dirent_t* p_udf_root; | 	udf_dirent_t* p_udf_root; | ||||||
| 	char *tmp, *buf, *ext; | 	char *tmp, *buf, *ext; | ||||||
|  | @ -705,6 +706,8 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) | ||||||
| 	if (scan_only) { | 	if (scan_only) { | ||||||
| 		if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 0) | 		if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 0) | ||||||
| 			img_report.label[0] = 0; | 			img_report.label[0] = 0; | ||||||
|  | 		// Open the UDF as ISO so that we can perform size checks
 | ||||||
|  | 		p_iso = iso9660_open(src_iso); | ||||||
| 	} | 	} | ||||||
| 	r = udf_extract_files(p_udf, p_udf_root, ""); | 	r = udf_extract_files(p_udf, p_udf_root, ""); | ||||||
| 	goto out; | 	goto out; | ||||||
|  | @ -746,6 +749,10 @@ try_iso: | ||||||
| out: | out: | ||||||
| 	iso_blocking_status = -1; | 	iso_blocking_status = -1; | ||||||
| 	if (scan_only) { | 	if (scan_only) { | ||||||
|  | 		struct __stat64 stat; | ||||||
|  | 		// Find if there is a mismatch between the ISO size, as reported by the PVD, and the actual file size
 | ||||||
|  | 		if ((iso9660_ifs_read_pvd(p_iso, &pvd)) && (_stat64U(src_iso, &stat) == 0)) | ||||||
|  | 			img_report.mismatch_size = (int64_t)(iso9660_get_pvd_space_size(&pvd)) * ISO_BLOCKSIZE - stat.st_size; | ||||||
| 		// Remove trailing spaces from the label
 | 		// Remove trailing spaces from the label
 | ||||||
| 		for (j=safe_strlen(img_report.label)-1; ((j>0)&&(isspaceU(img_report.label[j]))); j--) | 		for (j=safe_strlen(img_report.label)-1; ((j>0)&&(isspaceU(img_report.label[j]))); j--) | ||||||
| 			img_report.label[j] = 0; | 			img_report.label[j] = 0; | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
|  * Compensating for what Microsoft should have done a long long time ago. |  * Compensating for what Microsoft should have done a long long time ago. | ||||||
|  * Also see http://utf8everywhere.org/
 |  * Also see http://utf8everywhere.org/
 | ||||||
|  * |  * | ||||||
|  * Copyright © 2010-2015 Pete Batard <pete@akeo.ie> |  * Copyright © 2010-2017 Pete Batard <pete@akeo.ie> | ||||||
|  * |  * | ||||||
|  * This library is free software; you can redistribute it and/or |  * This library is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU Lesser General Public |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  | @ -31,6 +31,8 @@ | ||||||
| #include <share.h> | #include <share.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <io.h> | #include <io.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/stat.h> | ||||||
| #if !defined(DDKBUILD) | #if !defined(DDKBUILD) | ||||||
| #include <psapi.h> | #include <psapi.h> | ||||||
| #endif | #endif | ||||||
|  | @ -924,6 +926,15 @@ static __inline int _openU(const char *filename, int oflag , int pmode) | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | static __inline int _stat64U(const char *path, struct __stat64 *buffer) | ||||||
|  | { | ||||||
|  | 	int ret; | ||||||
|  | 	wconvert(path); | ||||||
|  | 	ret = _wstat64(wpath, buffer); | ||||||
|  | 	wfree(path); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // returned UTF-8 string must be freed
 | // returned UTF-8 string must be freed
 | ||||||
| static __inline char* getenvU(const char* varname) | static __inline char* getenvU(const char* varname) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -533,6 +533,9 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) | ||||||
| 		} | 		} | ||||||
| 		vuprintf("Found match for %s on server %s", urlpath, server_url); | 		vuprintf("Found match for %s on server %s", urlpath, server_url); | ||||||
| 
 | 
 | ||||||
|  | 		// IMPORTANT: You might need to edit your server's MIME conf so that it returns
 | ||||||
|  | 		// 'text/plain' for .ver files. Use 'curl -I' to check that you get something
 | ||||||
|  | 		// like 'Content-Type: text/plain; charset=UTF-8' when fetching your .ver files.
 | ||||||
| 		dwSize = sizeof(mime); | 		dwSize = sizeof(mime); | ||||||
| 		HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL); | 		HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL); | ||||||
| 		if (strncmp(mime, "text/plain", sizeof("text/plain")-1) != 0) | 		if (strncmp(mime, "text/plain", sizeof("text/plain")-1) != 0) | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -973,6 +973,17 @@ static void DisplayISOProps(void) | ||||||
| 
 | 
 | ||||||
| 	uprintf("ISO label: '%s'", img_report.label); | 	uprintf("ISO label: '%s'", img_report.label); | ||||||
| 	uprintf("  Size: %s (Projected)", SizeToHumanReadable(img_report.projected_size, FALSE, FALSE)); | 	uprintf("  Size: %s (Projected)", SizeToHumanReadable(img_report.projected_size, FALSE, FALSE)); | ||||||
|  | 	if (img_report.mismatch_size > 0) { | ||||||
|  | 		uprintf("  ERROR: Detected that file on disk has been truncated by %s!", | ||||||
|  | 			SizeToHumanReadable(img_report.mismatch_size, FALSE, FALSE)); | ||||||
|  | 		MessageBoxU(hMainDialog, lmprintf(MSG_298, SizeToHumanReadable(img_report.mismatch_size, FALSE, FALSE)), | ||||||
|  | 			lmprintf(MSG_297), MB_ICONWARNING); | ||||||
|  | 	} else if (img_report.mismatch_size < 0) { | ||||||
|  | 		// Not an error (ISOHybrid?), but we report it just in case
 | ||||||
|  | 		uprintf("  Note: File on disk is larger than reported ISO size by %s...", | ||||||
|  | 			SizeToHumanReadable(-img_report.mismatch_size, FALSE, FALSE)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	PRINT_ISO_PROP(img_report.has_4GB_file, "  Has a >4GB file"); | 	PRINT_ISO_PROP(img_report.has_4GB_file, "  Has a >4GB file"); | ||||||
| 	PRINT_ISO_PROP(img_report.has_long_filename, "  Has a >64 chars filename"); | 	PRINT_ISO_PROP(img_report.has_long_filename, "  Has a >64 chars filename"); | ||||||
| 	PRINT_ISO_PROP(HAS_SYSLINUX(img_report), "  Uses: Syslinux/Isolinux v%s", img_report.sl_version_str); | 	PRINT_ISO_PROP(HAS_SYSLINUX(img_report), "  Uses: Syslinux/Isolinux v%s", img_report.sl_version_str); | ||||||
|  |  | ||||||
|  | @ -279,6 +279,7 @@ typedef struct { | ||||||
| 	char install_wim_path[64];	/* path to install.wim or install.swm */ | 	char install_wim_path[64];	/* path to install.wim or install.swm */ | ||||||
| 	uint64_t image_size; | 	uint64_t image_size; | ||||||
| 	uint64_t projected_size; | 	uint64_t projected_size; | ||||||
|  | 	int64_t mismatch_size; | ||||||
| 	uint32_t install_wim_version; | 	uint32_t install_wim_version; | ||||||
| 	BOOLEAN is_iso; | 	BOOLEAN is_iso; | ||||||
| 	BOOLEAN is_bootable_img; | 	BOOLEAN is_bootable_img; | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 242, 376 | IDD_DIALOG DIALOGEX 12, 12, 242, 376 | ||||||
| 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 2.15.1119" | CAPTION "Rufus 2.15.1120" | ||||||
| FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | FONT 8, "Segoe UI Symbol", 400, 0, 0x0 | ||||||
| BEGIN | BEGIN | ||||||
|     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 |     LTEXT           "Device",IDS_DEVICE_TXT,9,6,200,8 | ||||||
|  | @ -334,8 +334,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 2,15,1119,0 |  FILEVERSION 2,15,1120,0 | ||||||
|  PRODUCTVERSION 2,15,1119,0 |  PRODUCTVERSION 2,15,1120,0 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -352,13 +352,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" |             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "2.15.1119" |             VALUE "FileVersion", "2.15.1120" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "2.15.1119" |             VALUE "ProductVersion", "2.15.1120" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
|  | @ -813,7 +813,8 @@ BOOL Notification(int type, const notification_info* more_info, char* title, cha | ||||||
| 	dialog_showing++; | 	dialog_showing++; | ||||||
| 	szMessageText = (char*)malloc(MAX_PATH); | 	szMessageText = (char*)malloc(MAX_PATH); | ||||||
| 	if (szMessageText == NULL) return FALSE; | 	if (szMessageText == NULL) return FALSE; | ||||||
| 	szMessageTitle = title; | 	szMessageTitle = safe_strdup(title); | ||||||
|  | 	if (szMessageTitle == NULL) return FALSE; | ||||||
| 	va_start(args, format); | 	va_start(args, format); | ||||||
| 	safe_vsnprintf(szMessageText, MAX_PATH-1, format, args); | 	safe_vsnprintf(szMessageText, MAX_PATH-1, format, args); | ||||||
| 	va_end(args); | 	va_end(args); | ||||||
|  | @ -839,6 +840,7 @@ BOOL Notification(int type, const notification_info* more_info, char* title, cha | ||||||
| 	} | 	} | ||||||
| 	ret = (MyDialogBox(hMainInstance, IDD_NOTIFICATION, hMainDialog, NotificationCallback) == IDYES); | 	ret = (MyDialogBox(hMainInstance, IDD_NOTIFICATION, hMainDialog, NotificationCallback) == IDYES); | ||||||
| 	safe_free(szMessageText); | 	safe_free(szMessageText); | ||||||
|  | 	safe_free(szMessageTitle); | ||||||
| 	dialog_showing--; | 	dialog_showing--; | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue