From 90a8c3e8ef04ec9b5eb210cbd44bc8c501c504e9 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 28 Dec 2013 20:40:22 -0600 Subject: [PATCH] wimlib_extract_paths(): Validate extract flags --- src/extract.c | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/extract.c b/src/extract.c index c6711ec9..5c2f0f71 100644 --- a/src/extract.c +++ b/src/extract.c @@ -2592,19 +2592,12 @@ extract_tree(WIMStruct *wim, const tchar *wim_source_path, target, extract_flags, progress_func); } -/* Validates a single wimlib_extract_command, mostly checking to make sure the - * extract flags make sense. */ +/* Make sure the extraction flags make sense, and update them if needed. */ static int -check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) +check_extract_flags(int extract_flags, + const u32 wim_header_flags, + int *updated_extract_flags_ret) { - int extract_flags; - - /* Empty destination path? */ - if (cmd->fs_dest_path[0] == T('\0')) - return WIMLIB_ERR_INVALID_PARAM; - - extract_flags = cmd->extract_flags; - /* Check for invalid flag combinations */ if ((extract_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK | @@ -2612,9 +2605,6 @@ check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) WIMLIB_EXTRACT_FLAG_HARDLINK)) return WIMLIB_ERR_INVALID_PARAM; - if (extract_flags & WIMLIB_EXTRACT_FLAG_GLOB_PATHS) - return WIMLIB_ERR_INVALID_PARAM; - if ((extract_flags & (WIMLIB_EXTRACT_FLAG_NO_ACLS | WIMLIB_EXTRACT_FLAG_STRICT_ACLS)) == (WIMLIB_EXTRACT_FLAG_NO_ACLS | @@ -2632,13 +2622,13 @@ check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) WIMLIB_EXTRACT_FLAG_FROM_PIPE)) == WIMLIB_EXTRACT_FLAG_RESUME) return WIMLIB_ERR_INVALID_PARAM; - if (extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) { #ifndef WITH_NTFS_3G + if (extract_flags & WIMLIB_EXTRACT_FLAG_NTFS) { ERROR("wimlib was compiled without support for NTFS-3g, so\n" " we cannot apply a WIM image directly to a NTFS volume."); return WIMLIB_ERR_UNSUPPORTED; -#endif } +#endif if ((extract_flags & (WIMLIB_EXTRACT_FLAG_RPFIX | WIMLIB_EXTRACT_FLAG_NORPFIX)) == 0) @@ -2669,7 +2659,8 @@ check_extract_command(struct wimlib_extract_command *cmd, int wim_header_flags) } } - cmd->extract_flags = extract_flags; + if (updated_extract_flags_ret) + *updated_extract_flags_ret = extract_flags; return 0; } @@ -2700,7 +2691,16 @@ do_wimlib_extract_files(WIMStruct *wim, /* Check for problems with the extraction commands */ for (size_t i = 0; i < num_cmds; i++) { - ret = check_extract_command(&cmds[i], wim->hdr.flags); + + if (cmds[i].fs_dest_path[0] == T('\0')) + return WIMLIB_ERR_INVALID_PARAM; + + if (cmds[i].extract_flags & WIMLIB_EXTRACT_FLAG_GLOB_PATHS) + return WIMLIB_ERR_INVALID_PARAM; + + ret = check_extract_flags(cmds[i].extract_flags, + wim->hdr.flags, + &cmds[i].extract_flags); if (ret) return ret; if (cmds[i].extract_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK | @@ -3117,8 +3117,11 @@ wimlib_extract_pathlist(WIMStruct *wim, int image, void *mem; ret = read_path_list_file(path_list_file, &paths, &num_paths, &mem); - if (ret) + if (ret) { + ERROR("Failed to read path list file \"%"TS"\"", + path_list_file); return ret; + } ret = wimlib_extract_paths(wim, image, target, (const tchar * const *)paths, num_paths, @@ -3177,9 +3180,15 @@ wimlib_extract_paths(WIMStruct *wim, extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC; - if (target == NULL || (num_paths != 0 && paths == NULL)) + if (wim == NULL || target == NULL || target[0] == T('\0') || + (num_paths != 0 && paths == NULL)) return WIMLIB_ERR_INVALID_PARAM; + ret = check_extract_flags(extract_flags, wim->hdr.flags, + &extract_flags); + if (ret) + return ret; + ret = select_wim_image(wim, image); if (ret) return ret; -- 2.43.0