X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Freparse.c;h=d996e3dfd877028596ed8da212bf69485ca0dac6;hb=bc935cde42375026594e2bb93443efa635273859;hp=3b36548c3c63951c858c37970a8dde011a70c13d;hpb=5a08c61d7a83a846813863fcbec4b7d5098a2abf;p=wimlib diff --git a/src/reparse.c b/src/reparse.c index 3b36548c..d996e3df 100644 --- a/src/reparse.c +++ b/src/reparse.c @@ -86,15 +86,15 @@ static const utf16lechar volume_junction_prefix[11] = { * Return value is: * * Non-negative integer: - * The name is an absolute symbolic link in one of several formats, - * and the return value is the number of UTF-16LE characters that need to - * be advanced to reach a simple "absolute" path starting with a backslash - * (i.e. skip over \??\ and/or drive letter) + * The name is an absolute symbolic link in one of several formats, + * and the return value is the number of UTF-16LE characters that need to + * be advanced to reach a simple "absolute" path starting with a backslash + * (i.e. skip over \??\ and/or drive letter) * Negative integer: * SUBST_NAME_IS_VOLUME_JUNCTION: - * The name is a volume junction. + * The name is a volume junction. * SUBST_NAME_IS_RELATIVE_LINK: - * The name is a relative symbolic link. + * The name is a relative symbolic link. * SUBST_NAME_IS_UNKNOWN: * The name does not appear to be a valid symbolic link, junction, * or mount point. @@ -272,7 +272,8 @@ make_reparse_buffer(const struct reparse_data * restrict rpdata, int wim_inode_get_reparse_data(const struct wim_inode * restrict inode, u8 * restrict rpbuf, - u16 * restrict rpbuflen_ret) + u16 * restrict rpbuflen_ret, + struct wim_lookup_table_entry *lte_override) { struct wim_lookup_table_entry *lte; int ret; @@ -281,20 +282,24 @@ wim_inode_get_reparse_data(const struct wim_inode * restrict inode, wimlib_assert(inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT); - lte = inode_unnamed_lte_resolved(inode); - if (!lte) { - ERROR("Reparse point has no reparse data!"); - return WIMLIB_ERR_INVALID_REPARSE_DATA; + if (!lte_override) { + lte = inode_unnamed_lte_resolved(inode); + if (!lte) { + ERROR("Reparse point has no reparse data!"); + return WIMLIB_ERR_INVALID_REPARSE_DATA; + } + } else { + lte = lte_override; } - if (wim_resource_size(lte) > REPARSE_POINT_MAX_SIZE - 8) { + if (lte->size > REPARSE_POINT_MAX_SIZE - 8) { ERROR("Reparse data is too long!"); return WIMLIB_ERR_INVALID_REPARSE_DATA; } - rpdatalen = wim_resource_size(lte); + rpdatalen = lte->size; /* Read the data from the WIM file */ - ret = read_full_resource_into_buf(lte, rpbuf + 8); + ret = read_full_stream_into_buf(lte, rpbuf + 8); if (ret) return ret; @@ -327,7 +332,8 @@ wim_inode_get_reparse_data(const struct wim_inode * restrict inode, * on failure a negated error code is returned rather than -1 with errno set. */ ssize_t wim_inode_readlink(const struct wim_inode * restrict inode, - char * restrict buf, size_t bufsize) + char * restrict buf, size_t bufsize, + struct wim_lookup_table_entry *lte_override) { int ret; struct reparse_buffer_disk rpbuf_disk _aligned_attribute(8); @@ -339,7 +345,8 @@ wim_inode_readlink(const struct wim_inode * restrict inode, wimlib_assert(inode_is_symlink(inode)); - if (wim_inode_get_reparse_data(inode, (u8*)&rpbuf_disk, &rpbuflen)) + if (wim_inode_get_reparse_data(inode, (u8*)&rpbuf_disk, &rpbuflen, + lte_override)) return -EIO; if (parse_reparse_data((const u8*)&rpbuf_disk, rpbuflen, &rpdata))