mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[iso] libcdio Joliet and UDF fixes
* Fix for broken UDF access with MSVC on some images (eg. Arch Linux) * Fix for broken Joliet access on ISO9660 images and proper Joliet support in iso.c
This commit is contained in:
		
							parent
							
								
									c79bfa0cb4
								
							
						
					
					
						commit
						a851d66e7c
					
				
					 6 changed files with 202 additions and 102 deletions
				
			
		
							
								
								
									
										13
									
								
								src/iso.c
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/iso.c
									
										
									
									
									
								
							|  | @ -241,8 +241,10 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) | ||||||
| 	psz_basename = &psz_fullpath[i_length]; | 	psz_basename = &psz_fullpath[i_length]; | ||||||
| 
 | 
 | ||||||
| 	p_entlist = iso9660_ifs_readdir(p_iso, psz_path); | 	p_entlist = iso9660_ifs_readdir(p_iso, psz_path); | ||||||
| 	if (!p_entlist) | 	if (!p_entlist) { | ||||||
|  | 		uprintf("Could not access directory %s\n", psz_path); | ||||||
| 		return 1; | 		return 1; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	_CDIO_LIST_FOREACH(p_entnode, p_entlist) { | 	_CDIO_LIST_FOREACH(p_entnode, p_entlist) { | ||||||
| 		if (FormatStatus) goto out; | 		if (FormatStatus) goto out; | ||||||
|  | @ -389,19 +391,18 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, bool scan) | ||||||
| 	goto out; | 	goto out; | ||||||
| 
 | 
 | ||||||
| try_iso: | try_iso: | ||||||
| 	p_iso = iso9660_open_ext(src_iso, 0xFF); | 	p_iso = iso9660_open_ext(src_iso, ISO_EXTENSION_ALL); | ||||||
| 	if (p_iso == NULL) { | 	if (p_iso == NULL) { | ||||||
| 		uprintf("Unable to open image '%s'.\n", src_iso); | 		uprintf("Unable to open image '%s'.\n", src_iso); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 	i_joliet_level = iso9660_ifs_get_joliet_level(p_iso); | 	i_joliet_level = iso9660_ifs_get_joliet_level(p_iso); | ||||||
| 	uprintf("Disc image is an ISO9660 image (Joliet = %d)\n", i_joliet_level); | 	uprintf("Disc image is an ISO9660 image (Joliet = %d)\n", i_joliet_level); | ||||||
| 	// FIXME: libcdio's Joliet detection seems broken => override
 |  | ||||||
| 	i_joliet_level = ISO_EXTENSION_JOLIET_LEVEL3; |  | ||||||
| 	if (scan_only) { | 	if (scan_only) { | ||||||
| 		if (iso9660_ifs_get_volume_id(p_iso, &vol_id)) | 		if (iso9660_ifs_get_volume_id(p_iso, &vol_id)) { | ||||||
| 			safe_strcpy(iso_report.label, sizeof(iso_report.label), vol_id); | 			safe_strcpy(iso_report.label, sizeof(iso_report.label), vol_id); | ||||||
| 		else | 			safe_free(vol_id); | ||||||
|  | 		} else | ||||||
| 			iso_report.label[0] = 0; | 			iso_report.label[0] = 0; | ||||||
| 	} | 	} | ||||||
| 	r = iso_extract_files(p_iso, ""); | 	r = iso_extract_files(p_iso, ""); | ||||||
|  |  | ||||||
|  | @ -498,11 +498,20 @@ struct logvol_integrity_desc_s | ||||||
|   udf_extent_ad_t next_integrity_ext; |   udf_extent_ad_t next_integrity_ext; | ||||||
|   udf_Uint8_t     logvol_contents_use[32]; |   udf_Uint8_t     logvol_contents_use[32]; | ||||||
|   udf_Uint32_t    i_partitions; |   udf_Uint32_t    i_partitions; | ||||||
|   udf_Uint32_t    imp_use_len; |   union { /* Same MSVC workaround as with struct udf_fileid_desc_s */ | ||||||
|   union { /* MSVC workaround for multiple zero sized arrays */ |     udf_Uint32_t  imp_use_len; | ||||||
|     udf_Uint32_t  freespace_table[0]; |     struct { | ||||||
|     udf_Uint32_t  size_table[0]; |       udf_Uint32_t unused; | ||||||
|     udf_Uint8_t   imp_use[0]; |       udf_Uint32_t data[0]; | ||||||
|  |     } freespace_table; | ||||||
|  |     struct { | ||||||
|  |       udf_Uint32_t unused; | ||||||
|  |       udf_Uint32_t data[0]; | ||||||
|  |     } size_table; | ||||||
|  |     struct { | ||||||
|  |       udf_Uint32_t unused; | ||||||
|  |       udf_Uint32_t data[0]; | ||||||
|  |     } imp_use; | ||||||
|   } u; |   } u; | ||||||
| } GNUC_PACKED; | } GNUC_PACKED; | ||||||
| 
 | 
 | ||||||
|  | @ -572,11 +581,25 @@ struct udf_fileid_desc_s | ||||||
|   udf_Uint8_t	file_characteristics; |   udf_Uint8_t	file_characteristics; | ||||||
|   udf_Uint8_t	i_file_id; |   udf_Uint8_t	i_file_id; | ||||||
|   udf_long_ad_t	icb; |   udf_long_ad_t	icb; | ||||||
|   udf_Uint16_t	i_imp_use; |   /* MSVC workaround for multiple zero sized arrays
 | ||||||
|   union { /* MSVC workaround for multiple zero sized arrays */ |      Unlike what is the case with GNU, and against logic, an union of zero | ||||||
|     udf_Uint8_t	imp_use[0]; |      sized arrays in the Microsoft world is not zero bytes but one byte! | ||||||
|     udf_Uint8_t	file_id[0]; |      Thus, for sizeof() is consistent across platforms, we have to use an | ||||||
|     udf_Uint8_t	padding[0]; |      ugly workaround that attaches the union to the last non-zero member. */ | ||||||
|  |   union { | ||||||
|  |     udf_Uint16_t	i_imp_use; | ||||||
|  |     struct { | ||||||
|  |       udf_Uint16_t	unused; | ||||||
|  |       udf_Uint8_t	data[0]; | ||||||
|  |     } imp_use; | ||||||
|  |     struct { | ||||||
|  |       udf_Uint16_t	unused; | ||||||
|  |       udf_Uint8_t	data[0]; | ||||||
|  |     } file_id; | ||||||
|  |     struct { | ||||||
|  |       udf_Uint16_t	unused; | ||||||
|  |       udf_Uint8_t	data[0]; | ||||||
|  |     } padding; | ||||||
|   } u; |   } u; | ||||||
| } GNUC_PACKED; | } GNUC_PACKED; | ||||||
| 
 | 
 | ||||||
|  | @ -998,6 +1021,7 @@ struct extended_file_entry | ||||||
|   union { /* MSVC workaround for multiple zero sized arrays */ |   union { /* MSVC workaround for multiple zero sized arrays */ | ||||||
|     udf_Uint8_t   ext_attr[0]; |     udf_Uint8_t   ext_attr[0]; | ||||||
|     udf_Uint8_t   alloc_descs[0]; |     udf_Uint8_t   alloc_descs[0]; | ||||||
|  | 	udf_Uint8_t	  pad_to_one_block[2048-216]; | ||||||
|   } u; |   } u; | ||||||
| } GNUC_PACKED; | } GNUC_PACKED; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -221,80 +221,110 @@ bool cdio_charset_to_utf8(char *src, size_t src_len, cdio_utf8_t **dst, | ||||||
|  * Converts an UTF-16 string to UTF8 (allocate returned string) |  * Converts an UTF-16 string to UTF8 (allocate returned string) | ||||||
|  * Returns NULL on error |  * Returns NULL on error | ||||||
|  */ |  */ | ||||||
| static __inline char* wchar_to_utf8(const wchar_t* wstr) | static inline char* wchar_to_utf8(const wchar_t* wstr) | ||||||
| { |   { | ||||||
| 	int size = 0; |   int size = 0; | ||||||
| 	char* str = NULL; |   char* str = NULL; | ||||||
| 
 | 
 | ||||||
| 	/* Find out the size we need to allocate for our converted string */ |   /* Find out the size we need to allocate for our converted string */ | ||||||
| 	size = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); |   size = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); | ||||||
| 	if (size <= 1)	// An empty string would be size 1
 |   if (size <= 1) /* An empty string would be size 1 */ | ||||||
| 		return NULL; |     return NULL; | ||||||
| 
 | 
 | ||||||
| 	if ((str = (char*)calloc(size, 1)) == NULL) |   if ((str = (char*)calloc(size, 1)) == NULL) | ||||||
| 		return NULL; |     return NULL; | ||||||
| 
 | 
 | ||||||
| 	if (wchar_to_utf8_no_alloc(wstr, str, size) != size) { |   if (wchar_to_utf8_no_alloc(wstr, str, size) != size) { | ||||||
| 		free(str); |     free(str); | ||||||
| 		return NULL; |     return NULL; | ||||||
| 	} |   } | ||||||
| 
 | 
 | ||||||
| 	return str; |   return str; | ||||||
| } |   } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Converts an UTF8 string to UTF-16 (allocate returned string) |  * Converts an UTF8 string to UTF-16 (allocate returned string) | ||||||
|  * Returns NULL on error |  * Returns NULL on error | ||||||
|  */ |  */ | ||||||
| static __inline wchar_t* utf8_to_wchar(const char* str) | static inline wchar_t* utf8_to_wchar(const char* str) | ||||||
| { |   { | ||||||
| 	int size = 0; |   int size = 0; | ||||||
| 	wchar_t* wstr = NULL; |   wchar_t* wstr = NULL; | ||||||
| 
 | 
 | ||||||
| 	/* Find out the size we need to allocate for our converted string */ |   /* Find out the size we need to allocate for our converted string */ | ||||||
| 	size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); |   size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); | ||||||
| 	if (size <= 1)	// An empty string would be size 1
 |   if (size <= 1) /* An empty string would be size 1 */ | ||||||
| 		return NULL; |     return NULL; | ||||||
| 
 | 
 | ||||||
| 	if ((wstr = (wchar_t*)calloc(size, sizeof(wchar_t))) == NULL) |   if ((wstr = (wchar_t*)calloc(size, sizeof(wchar_t))) == NULL) | ||||||
| 		return NULL; |     return NULL; | ||||||
| 
 | 
 | ||||||
| 	if (utf8_to_wchar_no_alloc(str, wstr, size) != size) { |   if (utf8_to_wchar_no_alloc(str, wstr, size) != size) { | ||||||
| 		free(wstr); |     free(wstr); | ||||||
| 		return NULL; |     return NULL; | ||||||
| 	} |   } | ||||||
| 	return wstr; |   return wstr; | ||||||
| } |   } | ||||||
|  | 
 | ||||||
|  | bool cdio_charset_from_utf8(cdio_utf8_t * src, char ** dst, | ||||||
|  |                             int * dst_len, const char * dst_charset) | ||||||
|  |   { | ||||||
|  |   wchar_t* le_dst; | ||||||
|  |   size_t i, len; | ||||||
|  | 
 | ||||||
|  |   if (src == NULL || dst == NULL || dst_len == NULL || dst_charset == NULL || strcmp(dst_charset, "UTF-8") != 0) | ||||||
|  |     return false; | ||||||
|  | 
 | ||||||
|  |   /* Eliminate empty strings */ | ||||||
|  |   le_dst = utf8_to_wchar(src); | ||||||
|  |   if ((le_dst == NULL) || (le_dst[0] == 0)) { | ||||||
|  |     free(le_dst); | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /* Perform byte reversal */ | ||||||
|  |   len = wcslen(le_dst); | ||||||
|  |   *dst = (char*)calloc(len+1, sizeof(wchar_t)); | ||||||
|  |   for (i=0; i<2*len; i++) { | ||||||
|  |     (*dst)[i] = ((char*)le_dst)[i+1]; | ||||||
|  |     (*dst)[i+1] = ((char*)le_dst)[i]; | ||||||
|  |   } | ||||||
|  |   free(le_dst); | ||||||
|  | 
 | ||||||
|  |   return true; | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
| bool cdio_charset_to_utf8(char *src, size_t src_len, cdio_utf8_t **dst, | bool cdio_charset_to_utf8(char *src, size_t src_len, cdio_utf8_t **dst, | ||||||
|                           const char * src_charset) |                           const char * src_charset) | ||||||
| { |   { | ||||||
| 	wchar_t* le_src; |   wchar_t* le_src; | ||||||
|  |   int i; | ||||||
| 
 | 
 | ||||||
| 	if (src == NULL || dst == NULL || src_charset == NULL || strcmp(src_charset, "UCS-2BE") != 0) |   if (src == NULL || dst == NULL || src_charset == NULL || strcmp(src_charset, "UCS-2BE") != 0) | ||||||
| 		return false; |     return false; | ||||||
| 
 | 
 | ||||||
| 	if (src_len == (size_t)-1) { |   if (src_len == (size_t)-1) { | ||||||
| 		for (src_len = 0; ((uint16_t*)src)[src_len] !=0; src_len++); |     for (src_len = 0; ((uint16_t*)src)[src_len] !=0; src_len++); | ||||||
| 		src_len <<=2; |     src_len <<=2; | ||||||
| 	} |   } | ||||||
| 
 | 
 | ||||||
| 	/* zero lenght is a headache (LCMapString doesn't support it)
 |   /* Eliminate empty strings */ | ||||||
| 	   => eliminate this case first */ |   if ((src_len < 2) || ((src[0] == 0) && (src[1] == 0))) { | ||||||
| 	if (src_len == 0) { |     *dst = NULL; | ||||||
| 		*dst = (cdio_utf8_t*)malloc(1); |     return false; | ||||||
| 		*dst[0] = 0; |   } | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	le_src = (wchar_t*)malloc(src_len+2); |   /* Perform byte reversal */ | ||||||
| 	/* WideCharToMultiByte only takes UCS-2LE, and we are fed UCS-2BE 
 |   le_src = (wchar_t*)malloc(src_len+2); | ||||||
| 	   => perform byte reversal */ |   for (i=0; i<src_len; i+=2) { | ||||||
| 	LCMapStringW(0, LCMAP_BYTEREV, (LPCWSTR)src, src_len, le_src, src_len); |     ((char*)le_src)[i] = src[i+1]; | ||||||
| 	*dst = wchar_to_utf8(le_src); |     ((char*)le_src)[i+1] = src[i]; | ||||||
| 	free(le_src); |   } | ||||||
|  |   le_src[src_len/2] = 0; | ||||||
|  |   *dst = wchar_to_utf8(le_src); | ||||||
|  |   free(le_src); | ||||||
| 
 | 
 | ||||||
| 	return (*dst != NULL); |   return (*dst != NULL); | ||||||
| } | } | ||||||
| #endif /* HAVE_ICONV */ | #endif /* HAVE_ICONV */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -85,6 +85,33 @@ struct _iso9660_s { | ||||||
| 			     */ | 			     */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /*!
 | ||||||
|  |    Change trailing blanks in null-terminated *str to nulls | ||||||
|  |    If the end result is an empty string, *str is freed | ||||||
|  | */ | ||||||
|  | static void | ||||||
|  | strip_trail (char** str) | ||||||
|  | { | ||||||
|  |   int j; | ||||||
|  | 
 | ||||||
|  |   if (*str == NULL) | ||||||
|  |     return; | ||||||
|  | 
 | ||||||
|  |   for (j = strlen (*str) - 1; j >= 0; j--) | ||||||
|  |     { | ||||||
|  |       if ((*str)[j] != ' ') | ||||||
|  |         break; | ||||||
|  | 
 | ||||||
|  |       (*str)[j] = '\0'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   if ((*str)[0] == 0) | ||||||
|  |     { | ||||||
|  |       free(*str); | ||||||
|  |       *str = NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static long int iso9660_seek_read_framesize (const iso9660_t *p_iso,  | static long int iso9660_seek_read_framesize (const iso9660_t *p_iso,  | ||||||
| 					     void *ptr, lsn_t start,  | 					     void *ptr, lsn_t start,  | ||||||
| 					     long int size,  | 					     long int size,  | ||||||
|  | @ -294,10 +321,12 @@ iso9660_ifs_get_application_id(iso9660_t *p_iso, | ||||||
|      */ |      */ | ||||||
|   if ( cdio_charset_to_utf8(p_iso->svd.application_id, |   if ( cdio_charset_to_utf8(p_iso->svd.application_id, | ||||||
|                             ISO_MAX_APPLICATION_ID, |                             ISO_MAX_APPLICATION_ID, | ||||||
|                             p_psz_app_id, "UCS-2BE")) |                             p_psz_app_id, "UCS-2BE")) { | ||||||
|       return true; |       strip_trail(p_psz_app_id); | ||||||
|  |       return (*p_psz_app_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /*HAVE_JOLIET*/  | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_app_id = iso9660_get_application_id( &(p_iso->pvd) ); |   *p_psz_app_id = iso9660_get_application_id( &(p_iso->pvd) ); | ||||||
|   return *p_psz_app_id != NULL && strlen(*p_psz_app_id); |   return *p_psz_app_id != NULL && strlen(*p_psz_app_id); | ||||||
| } | } | ||||||
|  | @ -332,8 +361,10 @@ iso9660_ifs_get_preparer_id(iso9660_t *p_iso, | ||||||
|        the PVD, do that. |        the PVD, do that. | ||||||
|      */ |      */ | ||||||
|     if ( cdio_charset_to_utf8(p_iso->svd.preparer_id, ISO_MAX_PREPARER_ID, |     if ( cdio_charset_to_utf8(p_iso->svd.preparer_id, ISO_MAX_PREPARER_ID, | ||||||
|                               p_psz_preparer_id, "UCS-2BE") ) |                               p_psz_preparer_id, "UCS-2BE") ) { | ||||||
|       return true; |       strip_trail(p_psz_preparer_id); | ||||||
|  |       return (*p_psz_preparer_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /*HAVE_JOLIET*/ | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_preparer_id = iso9660_get_preparer_id( &(p_iso->pvd) ); |   *p_psz_preparer_id = iso9660_get_preparer_id( &(p_iso->pvd) ); | ||||||
|  | @ -360,8 +391,10 @@ bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso, | ||||||
|        the PVD, do that. |        the PVD, do that. | ||||||
|      */ |      */ | ||||||
|     if( cdio_charset_to_utf8(p_iso->svd.publisher_id, ISO_MAX_PUBLISHER_ID, |     if( cdio_charset_to_utf8(p_iso->svd.publisher_id, ISO_MAX_PUBLISHER_ID, | ||||||
|                              p_psz_publisher_id, "UCS-2BE") ) |                              p_psz_publisher_id, "UCS-2BE") ) { | ||||||
|       return true; |       strip_trail(p_psz_publisher_id); | ||||||
|  |       return (*p_psz_publisher_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /*HAVE_JOLIET*/ | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_publisher_id = iso9660_get_publisher_id( &(p_iso->pvd) ); |   *p_psz_publisher_id = iso9660_get_publisher_id( &(p_iso->pvd) ); | ||||||
|  | @ -389,8 +422,10 @@ bool iso9660_ifs_get_system_id(iso9660_t *p_iso, | ||||||
|        the PVD, do that. |        the PVD, do that. | ||||||
|      */ |      */ | ||||||
|     if ( cdio_charset_to_utf8(p_iso->svd.system_id, ISO_MAX_SYSTEM_ID, |     if ( cdio_charset_to_utf8(p_iso->svd.system_id, ISO_MAX_SYSTEM_ID, | ||||||
|                               p_psz_system_id, "UCS-2BE") ) |                               p_psz_system_id, "UCS-2BE") ) { | ||||||
|       return true; |       strip_trail(p_psz_system_id); | ||||||
|  |       return (*p_psz_system_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /*HAVE_JOLIET*/ | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_system_id = iso9660_get_system_id( &(p_iso->pvd) ); |   *p_psz_system_id = iso9660_get_system_id( &(p_iso->pvd) ); | ||||||
|  | @ -418,10 +453,12 @@ bool iso9660_ifs_get_volume_id(iso9660_t *p_iso, | ||||||
|        the PVD, do that. |        the PVD, do that. | ||||||
|      */ |      */ | ||||||
|     if ( cdio_charset_to_utf8(p_iso->svd.volume_id, ISO_MAX_VOLUME_ID, |     if ( cdio_charset_to_utf8(p_iso->svd.volume_id, ISO_MAX_VOLUME_ID, | ||||||
|                               p_psz_volume_id, "UCS-2BE") ) |                               p_psz_volume_id, "UCS-2BE") ) { | ||||||
|       return true; |       strip_trail(p_psz_volume_id); | ||||||
|  |       return (*p_psz_volume_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /* HAVE_JOLIET */ | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_volume_id = iso9660_get_volume_id( &(p_iso->pvd) ); |   *p_psz_volume_id = iso9660_get_volume_id( &(p_iso->pvd) ); | ||||||
|   return *p_psz_volume_id != NULL && strlen(*p_psz_volume_id); |   return *p_psz_volume_id != NULL && strlen(*p_psz_volume_id); | ||||||
| } | } | ||||||
|  | @ -449,8 +486,10 @@ bool iso9660_ifs_get_volumeset_id(iso9660_t *p_iso, | ||||||
|     if ( cdio_charset_to_utf8(p_iso->svd.volume_set_id,  |     if ( cdio_charset_to_utf8(p_iso->svd.volume_set_id,  | ||||||
|                               ISO_MAX_VOLUMESET_ID,  |                               ISO_MAX_VOLUMESET_ID,  | ||||||
|                               p_psz_volumeset_id, |                               p_psz_volumeset_id, | ||||||
|                               "UCS-2BE") ) |                               "UCS-2BE") ) { | ||||||
|       return true; |       strip_trail(p_psz_volumeset_id); | ||||||
|  |       return (*p_psz_volumeset_id != NULL); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| #endif /*HAVE_JOLIET*/ | #endif /*HAVE_JOLIET*/ | ||||||
|   *p_psz_volumeset_id = iso9660_get_volumeset_id( &(p_iso->pvd) ); |   *p_psz_volumeset_id = iso9660_get_volumeset_id( &(p_iso->pvd) ); | ||||||
|  | @ -494,19 +533,25 @@ bool | ||||||
| iso9660_ifs_read_superblock (iso9660_t *p_iso,  | iso9660_ifs_read_superblock (iso9660_t *p_iso,  | ||||||
| 			     iso_extension_mask_t iso_extension_mask) | 			     iso_extension_mask_t iso_extension_mask) | ||||||
| { | { | ||||||
|   iso9660_svd_t *p_svd;  /* Secondary volume descriptor. */ |   iso9660_svd_t p_svd;  /* Secondary volume descriptor. */ | ||||||
|    |   int i; | ||||||
|  | 
 | ||||||
|   if (!p_iso || !iso9660_ifs_read_pvd(p_iso, &(p_iso->pvd))) |   if (!p_iso || !iso9660_ifs_read_pvd(p_iso, &(p_iso->pvd))) | ||||||
|     return false; |     return false; | ||||||
| 
 | 
 | ||||||
|   p_svd = &(p_iso->svd); |  | ||||||
|   p_iso->i_joliet_level = 0; |   p_iso->i_joliet_level = 0; | ||||||
| 
 | 
 | ||||||
|   if (0 != iso9660_iso_seek_read (p_iso, p_svd, ISO_PVD_SECTOR+1, 1)) { |   /* There may be multiple Secondary Volume Descriptors (eg. El Torito + Joliet) */ | ||||||
|     if ( ISO_VD_SUPPLEMENTARY == from_711(p_svd->type) ) { |   for (i=1; (0 != iso9660_iso_seek_read (p_iso, &p_svd, ISO_PVD_SECTOR+i, 1)); i++) { | ||||||
|       if (p_svd->escape_sequences[0] == 0x25  |     if (ISO_VD_END == from_711(p_svd.type) ) /* Last SVD */ | ||||||
| 	  && p_svd->escape_sequences[1] == 0x2f) { |       break; | ||||||
| 	switch (p_svd->escape_sequences[2]) { |     if ( ISO_VD_SUPPLEMENTARY == from_711(p_svd.type) ) { | ||||||
|  |       /* We're only interested in Joliet => make sure the SVD isn't overwritten */ | ||||||
|  |       if (p_iso->i_joliet_level == 0) | ||||||
|  |         memcpy(&(p_iso->svd), &p_svd, sizeof(iso9660_svd_t)); | ||||||
|  |       if (p_svd.escape_sequences[0] == 0x25  | ||||||
|  | 	  && p_svd.escape_sequences[1] == 0x2f) { | ||||||
|  | 	switch (p_svd.escape_sequences[2]) { | ||||||
| 	case 0x40: | 	case 0x40: | ||||||
| 	  if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL1)  | 	  if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL1)  | ||||||
| 	    p_iso->i_joliet_level = 1; | 	    p_iso->i_joliet_level = 1; | ||||||
|  |  | ||||||
|  | @ -659,7 +659,7 @@ udf_readdir(udf_dirent_t *p_udf_dirent) | ||||||
|     /* advance to next File Identifier Descriptor */ |     /* advance to next File Identifier Descriptor */ | ||||||
|     /* FIXME: need to advance file entry (fe) as well.  */ |     /* FIXME: need to advance file entry (fe) as well.  */ | ||||||
|     uint32_t ofs = 4 *  |     uint32_t ofs = 4 *  | ||||||
|       ((sizeof(*(p_udf_dirent->fid)) + p_udf_dirent->fid->i_imp_use  |       ((sizeof(*(p_udf_dirent->fid)) + p_udf_dirent->fid->u.i_imp_use  | ||||||
| 	+ p_udf_dirent->fid->i_file_id + 3) / 4); | 	+ p_udf_dirent->fid->i_file_id + 3) / 4); | ||||||
|      |      | ||||||
|     p_udf_dirent->fid =  |     p_udf_dirent->fid =  | ||||||
|  | @ -686,7 +686,7 @@ udf_readdir(udf_dirent_t *p_udf_dirent) | ||||||
|   if (p_udf_dirent->fid && !udf_checktag(&(p_udf_dirent->fid->tag), TAGID_FID)) |   if (p_udf_dirent->fid && !udf_checktag(&(p_udf_dirent->fid->tag), TAGID_FID)) | ||||||
|     { |     { | ||||||
|       uint32_t ofs =  |       uint32_t ofs =  | ||||||
| 	4 * ((sizeof(*p_udf_dirent->fid) + p_udf_dirent->fid->i_imp_use  | 	4 * ((sizeof(*p_udf_dirent->fid) + p_udf_dirent->fid->u.i_imp_use  | ||||||
| 	      + p_udf_dirent->fid->i_file_id + 3) / 4); | 	      + p_udf_dirent->fid->i_file_id + 3) / 4); | ||||||
|        |        | ||||||
|       p_udf_dirent->dir_left -= ofs; |       p_udf_dirent->dir_left -= ofs; | ||||||
|  | @ -708,8 +708,8 @@ udf_readdir(udf_dirent_t *p_udf_dirent) | ||||||
| 	  p_udf_dirent->psz_name = (char *) | 	  p_udf_dirent->psz_name = (char *) | ||||||
| 	    realloc(p_udf_dirent->psz_name, sizeof(char)*i_len+1); | 	    realloc(p_udf_dirent->psz_name, sizeof(char)*i_len+1); | ||||||
| 	 | 	 | ||||||
| 	unicode16_decode(p_udf_dirent->fid->u.imp_use  | 	unicode16_decode(p_udf_dirent->fid->u.imp_use.data  | ||||||
| 			 + p_udf_dirent->fid->i_imp_use,  | 			 + p_udf_dirent->fid->u.i_imp_use,  | ||||||
| 			 i_len, p_udf_dirent->psz_name); | 			 i_len, p_udf_dirent->psz_name); | ||||||
|       } |       } | ||||||
|       return p_udf_dirent; |       return p_udf_dirent; | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 206, 278 | IDD_DIALOG DIALOGEX 12, 12, 206, 278 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.1.1.136" | CAPTION "Rufus v1.1.1.137" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,236,50,14 | ||||||
|  | @ -71,7 +71,7 @@ BEGIN | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP |     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, |     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, | ||||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 |                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||||
|     LTEXT           "Version 1.1.1 (Build 136)",IDC_STATIC,46,19,78,8 |     LTEXT           "Version 1.1.1 (Build 137)",IDC_STATIC,46,19,78,8 | ||||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP |     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL |     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 |     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||||
|  | @ -222,8 +222,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,1,1,136 |  FILEVERSION 1,1,1,137 | ||||||
|  PRODUCTVERSION 1,1,1,136 |  PRODUCTVERSION 1,1,1,137 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -240,13 +240,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "akeo.ie" |             VALUE "CompanyName", "akeo.ie" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.1.1.136" |             VALUE "FileVersion", "1.1.1.137" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011 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", "1.1.1.136" |             VALUE "ProductVersion", "1.1.1.137" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue