diff options
author | Martin Matuska <martin@matuska.org> | 2020-01-09 12:36:59 +0100 |
---|---|---|
committer | Martin Matuska <martin@matuska.org> | 2020-01-09 12:36:59 +0100 |
commit | 96970037ca0822e64ac14146c44679d02d4fee9f (patch) | |
tree | 8bd001d20591ae3e593008c6824304fd7a6780d6 /libarchive | |
parent | c34952a78284b505c88546a3d0a056182bf1c0da (diff) | |
download | libarchive-96970037ca0822e64ac14146c44679d02d4fee9f.tar.gz |
LHA reader UTF16: dirSep must match machine endianess
Diffstat (limited to 'libarchive')
-rw-r--r-- | libarchive/archive_read_support_format_lha.c | 11 |
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? */ |