aboutsummaryrefslogtreecommitdiff
path: root/C/7zDec.c
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /C/7zDec.c
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-24.05.tar.gz
7zip-24.05.tar.bz2
7zip-24.05.zip
24.0524.05
Diffstat (limited to 'C/7zDec.c')
-rw-r--r--C/7zDec.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/C/7zDec.c b/C/7zDec.c
index 96c6035..c9b4064 100644
--- a/C/7zDec.c
+++ b/C/7zDec.c
@@ -1,5 +1,5 @@
1/* 7zDec.c -- Decoding from 7z folder 1/* 7zDec.c -- Decoding from 7z folder
22023-04-02 : Igor Pavlov : Public domain */ 22024-03-01 : Igor Pavlov : Public domain */
3 3
4#include "Precomp.h" 4#include "Precomp.h"
5 5
@@ -51,6 +51,7 @@
51 51
52#ifndef Z7_NO_METHODS_FILTERS 52#ifndef Z7_NO_METHODS_FILTERS
53#define k_Delta 3 53#define k_Delta 3
54#define k_RISCV 0xb
54#define k_BCJ 0x3030103 55#define k_BCJ 0x3030103
55#define k_PPC 0x3030205 56#define k_PPC 0x3030205
56#define k_IA64 0x3030401 57#define k_IA64 0x3030401
@@ -362,6 +363,7 @@ static SRes CheckSupportedFolder(const CSzFolder *f)
362 case k_IA64: 363 case k_IA64:
363 case k_SPARC: 364 case k_SPARC:
364 case k_ARM: 365 case k_ARM:
366 case k_RISCV:
365 #endif 367 #endif
366 #ifdef Z7_USE_FILTER_ARM64 368 #ifdef Z7_USE_FILTER_ARM64
367 case k_ARM64: 369 case k_ARM64:
@@ -535,10 +537,10 @@ static SRes SzFolder_Decode2(const CSzFolder *folder,
535 } 537 }
536 } 538 }
537 } 539 }
538 #if defined(Z7_USE_BRANCH_FILTER) 540#if defined(Z7_USE_BRANCH_FILTER)
539 else if (ci == 1) 541 else if (ci == 1)
540 { 542 {
541 #if !defined(Z7_NO_METHODS_FILTERS) 543#if !defined(Z7_NO_METHODS_FILTERS)
542 if (coder->MethodID == k_Delta) 544 if (coder->MethodID == k_Delta)
543 { 545 {
544 if (coder->PropsSize != 1) 546 if (coder->PropsSize != 1)
@@ -550,22 +552,43 @@ static SRes SzFolder_Decode2(const CSzFolder *folder,
550 } 552 }
551 continue; 553 continue;
552 } 554 }
553 #endif 555#endif
554 556
555 #ifdef Z7_USE_FILTER_ARM64 557#ifdef Z7_USE_FILTER_ARM64
556 if (coder->MethodID == k_ARM64) 558 if (coder->MethodID == k_ARM64)
557 { 559 {
558 UInt32 pc = 0; 560 UInt32 pc = 0;
559 if (coder->PropsSize == 4) 561 if (coder->PropsSize == 4)
562 {
560 pc = GetUi32(propsData + coder->PropsOffset); 563 pc = GetUi32(propsData + coder->PropsOffset);
564 if (pc & 3)
565 return SZ_ERROR_UNSUPPORTED;
566 }
561 else if (coder->PropsSize != 0) 567 else if (coder->PropsSize != 0)
562 return SZ_ERROR_UNSUPPORTED; 568 return SZ_ERROR_UNSUPPORTED;
563 z7_BranchConv_ARM64_Dec(outBuffer, outSize, pc); 569 z7_BranchConv_ARM64_Dec(outBuffer, outSize, pc);
564 continue; 570 continue;
565 } 571 }
566 #endif 572#endif
567 573
568 #if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT) 574#if !defined(Z7_NO_METHODS_FILTERS)
575 if (coder->MethodID == k_RISCV)
576 {
577 UInt32 pc = 0;
578 if (coder->PropsSize == 4)
579 {
580 pc = GetUi32(propsData + coder->PropsOffset);
581 if (pc & 1)
582 return SZ_ERROR_UNSUPPORTED;
583 }
584 else if (coder->PropsSize != 0)
585 return SZ_ERROR_UNSUPPORTED;
586 z7_BranchConv_RISCV_Dec(outBuffer, outSize, pc);
587 continue;
588 }
589#endif
590
591#if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT)
569 { 592 {
570 if (coder->PropsSize != 0) 593 if (coder->PropsSize != 0)
571 return SZ_ERROR_UNSUPPORTED; 594 return SZ_ERROR_UNSUPPORTED;
@@ -579,7 +602,8 @@ static SRes SzFolder_Decode2(const CSzFolder *folder,
579 z7_BranchConvSt_X86_Dec(outBuffer, outSize, 0, &state); // pc = 0 602 z7_BranchConvSt_X86_Dec(outBuffer, outSize, 0, &state); // pc = 0
580 break; 603 break;
581 } 604 }
582 CASE_BRA_CONV(PPC) 605 case k_PPC: Z7_BRANCH_CONV_DEC_2(BranchConv_PPC)(outBuffer, outSize, 0); break; // pc = 0;
606 // CASE_BRA_CONV(PPC)
583 CASE_BRA_CONV(IA64) 607 CASE_BRA_CONV(IA64)
584 CASE_BRA_CONV(SPARC) 608 CASE_BRA_CONV(SPARC)
585 CASE_BRA_CONV(ARM) 609 CASE_BRA_CONV(ARM)
@@ -592,9 +616,9 @@ static SRes SzFolder_Decode2(const CSzFolder *folder,
592 } 616 }
593 continue; 617 continue;
594 } 618 }
595 #endif 619#endif
596 } // (c == 1) 620 } // (c == 1)
597 #endif 621#endif // Z7_USE_BRANCH_FILTER
598 else 622 else
599 return SZ_ERROR_UNSUPPORTED; 623 return SZ_ERROR_UNSUPPORTED;
600 } 624 }