summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_support_format_lha.c
diff options
context:
space:
mode:
authorMartin Matuska <martin@matuska.org>2020-01-09 12:36:59 +0100
committerMartin Matuska <martin@matuska.org>2020-01-09 12:36:59 +0100
commit96970037ca0822e64ac14146c44679d02d4fee9f (patch)
tree8bd001d20591ae3e593008c6824304fd7a6780d6 /libarchive/archive_read_support_format_lha.c
parentc34952a78284b505c88546a3d0a056182bf1c0da (diff)
downloadlibarchive-96970037ca0822e64ac14146c44679d02d4fee9f.tar.gz
LHA reader UTF16: dirSep must match machine endianess
Diffstat (limited to 'libarchive/archive_read_support_format_lha.c')
-rw-r--r--libarchive/archive_read_support_format_lha.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/libarchive/archive_read_support_format_lha.c b/libarchive/archive_read_support_format_lha.c
index aa115f87..bff0f01f 100644
--- a/libarchive/archive_read_support_format_lha.c
+++ b/libarchive/archive_read_support_format_lha.c
@@ -1293,14 +1293,19 @@ lha_read_file_extended_header(struct archive_read *a, struct lha *lha,
* Convert directory delimiter from 0xFFFF
* to '/' for local system.
*/
- const uint16_t dirSep = '/'; /* UTF-16LE */
+ uint16_t dirSep;
+ uint16_t d = 1;
+ if (archive_be16dec(&d) == 1)
+ dirSep = 0x2F00;
+ else
+ dirSep = 0x002F;
+
/* UTF-16LE character */
uint16_t *utf16name =
(uint16_t *)lha->dirname.s;
for (i = 0; i < lha->dirname.length / 2; i++) {
if (utf16name[i] == 0xFFFF) {
- archive_le16enc(utf16name + i,
- dirSep);
+ utf16name[i] = dirSep;
}
}
/* Is last character directory separator? */