#define WIMLIB_EXTRACT_FLAG_FROM_PIPE 0x40000000
#define WIMLIB_EXTRACT_FLAG_FILEMODE 0x20000000
#define WIMLIB_EXTRACT_FLAG_IMAGEMODE 0x10000000
-#define WIMLIB_EXTRACT_MASK_PUBLIC 0x0fffffff
+
+/* Keep in sync with wimlib.h */
+#define WIMLIB_EXTRACT_MASK_PUBLIC \
+ (WIMLIB_EXTRACT_FLAG_NTFS | \
+ WIMLIB_EXTRACT_FLAG_HARDLINK | \
+ WIMLIB_EXTRACT_FLAG_SYMLINK | \
+ WIMLIB_EXTRACT_FLAG_VERBOSE | \
+ WIMLIB_EXTRACT_FLAG_SEQUENTIAL | \
+ WIMLIB_EXTRACT_FLAG_UNIX_DATA | \
+ WIMLIB_EXTRACT_FLAG_NO_ACLS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_ACLS | \
+ WIMLIB_EXTRACT_FLAG_RPFIX | \
+ WIMLIB_EXTRACT_FLAG_NORPFIX | \
+ WIMLIB_EXTRACT_FLAG_TO_STDOUT | \
+ WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES | \
+ WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_TIMESTAMPS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES | \
+ WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS | \
+ WIMLIB_EXTRACT_FLAG_RESUME | \
+ WIMLIB_EXTRACT_FLAG_FILE_ORDER | \
+ WIMLIB_EXTRACT_FLAG_GLOB_PATHS | \
+ WIMLIB_EXTRACT_FLAG_STRICT_GLOB | \
+ WIMLIB_EXTRACT_FLAG_NO_ATTRIBUTES | \
+ WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE)
/* Given a WIM dentry in the tree to be extracted, resolve all streams in the
* corresponding inode and set 'out_refcnt' in each to 0. */
WIMLIB_EXTRACT_FLAG_NORPFIX)) == 0)
{
/* Do reparse point fixups by default if the WIM header says
- * they are enabled and we are extracting a full image. */
+ * they are enabled. */
if (wim->hdr.flags & WIM_HDR_FLAG_RP_FIX)
extract_flags |= WIMLIB_EXTRACT_FLAG_RPFIX;
}
{
int ret;
+ if (extract_flags & (WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE |
+ WIMLIB_EXTRACT_FLAG_TO_STDOUT))
+ return WIMLIB_ERR_INVALID_PARAM;
+
if (image == WIMLIB_ALL_IMAGES)
ret = extract_all_images(wim, target, extract_flags,
progress_func);
default_extract_flags |= WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE;
for (size_t i = 0; i < num_cmds; i++) {
- int cmd_flags = ((cmds[i].extract_flags |
- default_extract_flags) &
- WIMLIB_EXTRACT_MASK_PUBLIC);
+ int cmd_flags = (cmds[i].extract_flags |
+ default_extract_flags);
+
+ if (cmd_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
+
int cmd_link_flags = (cmd_flags & (WIMLIB_EXTRACT_FLAG_SYMLINK |
WIMLIB_EXTRACT_FLAG_HARDLINK));
if (i == 0) {
}
for (size_t i = 0; i < num_cmds; i++) {
- int extract_flags = ((cmds[i].extract_flags |
- default_extract_flags) &
- WIMLIB_EXTRACT_MASK_PUBLIC);
+ int extract_flags = (cmds[i].extract_flags |
+ default_extract_flags);
const tchar *target = cmds[i].fs_dest_path;
const tchar *wim_source_path = cmds[i].wim_source_path;
{
int ret;
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
ret = do_wimlib_extract_paths(wim, image, target, paths, num_paths,
extract_flags, progress_func);
int image;
unsigned i;
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
- if (extract_flags & WIMLIB_EXTRACT_FLAG_TO_STDOUT)
+ if (extract_flags & WIMLIB_EXTRACT_FLAG_FILE_ORDER)
return WIMLIB_ERR_INVALID_PARAM;
/* Read the WIM header from the pipe and get a WIMStruct to represent
int extract_flags,
wimlib_progress_func_t progress_func)
{
- extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC;
+ if (extract_flags & ~WIMLIB_EXTRACT_MASK_PUBLIC)
+ return WIMLIB_ERR_INVALID_PARAM;
return do_wimlib_extract_image(wim, image, target, extract_flags,
progress_func);
}