WIMLIB_SCAN_DENTRY_OK = 0,
/** File or directory is being excluded from capture due
- * to the capture configuration file. */
+ * to the capture configuration file, or being an
+ * absolute symbolic link that points outside of the
+ * capture directory without ::WIMLIB_ADD_FLAG_NORPFIX.
+ */
WIMLIB_SCAN_DENTRY_EXCLUDED,
/** File or directory is being excluded from capture due
if (exclude_path(path, path_len, params->config, false)) {
/* Exclude a file or directory tree based on the capture
* configuration file. */
- params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
ret = 0;
- goto out;
+ goto out_progress;
}
/* Get file attributes */
if (inode->i_nlink > 1) {
/* Shared inode; nothing more to do */
ret = 0;
- goto out_progress_ok;
+ goto out_progress;
}
inode->i_creation_time = le64_to_cpu(ni->creation_time);
DEBUG("No security ID for `%s'", path);
}
}
+ if (ret)
+ goto out;
-out_progress_ok:
+out_progress:
params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
+ if (root == NULL)
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
+ else
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
out:
if (ret == 0)
*root_ret = root;
struct stat stbuf;
if (exclude_path(path, path_len, params->config, true)) {
- params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
ret = 0;
- goto out;
+ goto out_progress;
}
if ((params->add_flags & WIMLIB_ADD_FLAG_DEREFERENCE) ||
if (inode->i_nlink > 1) {
/* Already captured this inode? */
ret = 0;
- goto out_progress_ok;
+ goto out_progress;
}
#ifdef HAVE_STAT_NANOSECOND_PRECISION
if (ret)
goto out;
-out_progress_ok:
+out_progress:
params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
+ if (root == NULL)
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
+ else
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
out:
if (ret)
free_dentry_tree(root, params->lookup_table);
u8 *rpbuf;
u16 rpbuflen;
u16 not_rpfixed;
- HANDLE hFile;
+ HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD desiredAccess;
ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
goto out;
}
- params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
ret = 0;
- goto out;
+ goto out_progress;
}
#if 0
ERROR_WITH_ERRNO("Failed to get file information for \"%ls\"",
path);
ret = WIMLIB_ERR_STAT;
- goto out_close_handle;
+ goto out;
}
if (file_info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
if (ret < 0) {
/* WIMLIB_ERR_* (inverted) */
ret = -ret;
- goto out_close_handle;
+ goto out;
} else if (ret & RP_FIXED) {
not_rpfixed = 0;
} else if (ret == RP_EXCLUDED) {
ret = 0;
- goto out_close_handle;
+ goto out_progress;
} else {
not_rpfixed = 1;
}
(file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)),
&root);
if (ret)
- goto out_close_handle;
+ goto out;
ret = win32_get_short_name(hFile, path, root);
if (ret)
- goto out_close_handle;
+ goto out;
inode = root->d_inode;
if (inode->i_nlink > 1) {
/* Shared inode; nothing more to do */
- goto out_progress_ok;
+ goto out_progress;
}
inode->i_attributes = file_info.dwFileAttributes;
¶ms->sd_set, state,
params->add_flags);
if (ret)
- goto out_close_handle;
+ goto out;
}
file_size = ((u64)file_info.nFileSizeHigh << 32) |
file_size,
vol_flags);
if (ret)
- goto out_close_handle;
+ goto out;
if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
/* Reparse point: set the reparse data (which we read already)
ERROR_WITH_ERRNO("Failed to reopen \"%ls\"",
path);
ret = WIMLIB_ERR_OPEN;
- goto out_close_handle;
+ goto out;
}
}
ret = win32_recurse_directory(hFile,
state,
vol_flags);
}
+ if (ret)
+ goto out;
+
path[path_num_chars] = '\0';
-out_progress_ok:
+out_progress:
params->progress.scan.cur_path = path;
- do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
-out_close_handle:
- CloseHandle(hFile);
+ if (root == NULL)
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL);
+ else
+ do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode);
out:
+ if (hFile != INVALID_HANDLE_VALUE)
+ CloseHandle(hFile);
if (ret == 0)
*root_ret = root;
else