X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Freparse.c;h=3b36548c3c63951c858c37970a8dde011a70c13d;hp=446b6f9f3765fc74f1c89c5eca495338be9cc53f;hb=5a08c61d7a83a846813863fcbec4b7d5098a2abf;hpb=f2f293a1759c81e7bd5deb904c3909368f3feaa5 diff --git a/src/reparse.c b/src/reparse.c index 446b6f9f..3b36548c 100644 --- a/src/reparse.c +++ b/src/reparse.c @@ -45,6 +45,8 @@ #include #include +/* On-disk format of a symbolic link (WIM_IO_REPARSE_TAG_SYMLINK) or junction + * point (WIM_IO_REPARSE_TAG_MOUNT_POINT) reparse data buffer. */ struct reparse_buffer_disk { le32 rptag; le16 rpdatalen; @@ -184,7 +186,7 @@ parse_reparse_data(const u8 * restrict rpbuf, u16 rpbuflen, if (rpdata->rptag == WIM_IO_REPARSE_TAG_SYMLINK) { if (rpbuflen < 20) goto out_invalid; - rpdata->rpflags = le16_to_cpu(rpbuf_disk->symlink.rpflags); + rpdata->rpflags = le32_to_cpu(rpbuf_disk->symlink.rpflags); data = rpbuf_disk->symlink.data; } else { data = rpbuf_disk->junction.data; @@ -213,7 +215,8 @@ out_invalid: */ int make_reparse_buffer(const struct reparse_data * restrict rpdata, - u8 * restrict rpbuf) + u8 * restrict rpbuf, + u16 * restrict rpbuflen_ret) { struct reparse_buffer_disk *rpbuf_disk = (struct reparse_buffer_disk*)rpbuf; @@ -250,6 +253,7 @@ make_reparse_buffer(const struct reparse_data * restrict rpdata, *(utf16lechar*)data = cpu_to_le16(0); data += 2; rpbuf_disk->rpdatalen = cpu_to_le16(data - rpbuf - 8); + *rpbuflen_ret = data - rpbuf; return 0; } @@ -397,6 +401,7 @@ wim_inode_set_symlink(struct wim_inode *inode, utf16lechar *name_utf16le; size_t name_utf16le_nbytes; int ret; + u16 rpbuflen; DEBUG("Creating reparse point data buffer for UNIX " "symlink target \"%s\"", target); @@ -417,8 +422,8 @@ wim_inode_set_symlink(struct wim_inode *inode, * ways to provide Windows paths.) * * To change a UNIX relative symbolic link to Windows format, we only - * need to translate it to UTF-16LE and replace backslashes with forward - * slashes. We do not make any attempt to handle filename character + * need to translate it to UTF-16LE and replace forward slashes with + * backslashes. We do not make any attempt to handle filename character * problems, such as a link target that itself contains backslashes on * UNIX. Then, for these relative links, we set the reparse header * @flags field to SYMBOLIC_LINK_RELATIVE. @@ -479,11 +484,11 @@ wim_inode_set_symlink(struct wim_inode *inode, rpdata.rpflags = SYMBOLIC_LINK_RELATIVE; } - ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk); + ret = make_reparse_buffer(&rpdata, (u8*)&rpbuf_disk, &rpbuflen); if (ret == 0) { ret = inode_set_unnamed_stream(inode, (u8*)&rpbuf_disk + 8, - le16_to_cpu(rpbuf_disk.rpdatalen), + rpbuflen - 8, lookup_table); } FREE(name_utf16le); @@ -511,12 +516,13 @@ unix_get_ino_and_dev(const char *path, u64 *ino_ret, u64 *dev_ret) #endif /* !defined(__WIN32__) */ +/* is_rp_path_separator() - characters treated as path separators in absolute + * symbolic link targets */ + #ifdef __WIN32__ -# define RP_PATH_SEPARATOR L'\\' # define is_rp_path_separator(c) ((c) == L'\\' || (c) == L'/') # define os_get_ino_and_dev win32_get_file_and_vol_ids #else -# define RP_PATH_SEPARATOR '/' # define is_rp_path_separator(c) ((c) == '/') # define os_get_ino_and_dev unix_get_ino_and_dev #endif @@ -558,7 +564,7 @@ capture_fixup_absolute_symlink(tchar *dest, /* Link points inside capture root. Return abbreviated * path. */ if (*p == T('\0')) - *(p - 1) = RP_PATH_SEPARATOR; + *(p - 1) = OS_PREFERRED_PATH_SEPARATOR; while (p - 1 >= dest && is_rp_path_separator(*(p - 1))) p--; #ifdef __WIN32__