]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Issue 247:Unicode filenames inside RAR not working.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Tue, 6 Mar 2012 09:55:18 +0000 (18:55 +0900)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Tue, 6 Mar 2012 09:55:18 +0000 (18:55 +0900)
libarchive/archive_read_support_format_rar.c

index 9b4a67e9e4d83fb0d25e3ee2f01a8f5444e7eadc..d31708500202ac1f374922b763a33c3d0323bc1e 100644 (file)
@@ -1176,7 +1176,7 @@ read_header(struct archive_read *a, struct archive_entry *entry,
   {
     if (filename_size != strlen(filename))
     {
-      unsigned char highbyte, flagbits, flagbyte, length, offset;
+      unsigned char highbyte, flagbits, flagbyte, offset;
 
       end = filename_size;
       filename_size = 0;
@@ -1210,12 +1210,19 @@ read_header(struct archive_read *a, struct archive_entry *entry,
             break;
           case 3:
           {
-            length = *(p + offset++);
-            while (length)
-            {
-                 if (filename_size >= end)
-                           break;
-              filename[filename_size++] = *(p + offset);
+            char extra, high;
+            uint8_t length = *(p + offset++);
+
+            if (length & 0x80) {
+              extra = *(p + offset++);
+              high = (char)highbyte;
+            } else
+              extra = high = 0;
+            length = (length & 0x7f) + 2;
+            while (length && filename_size < end) {
+              unsigned cp = filename_size >> 1;
+              filename[filename_size++] = high;
+              filename[filename_size++] = p[cp] + extra;
               length--;
             }
           }