Changeset 2896
- Timestamp:
- Sep 8, 2016, 5:32:09 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kDepObj.c
r2894 r2896 752 752 int kDepObjCOFFParse(const KU8 *pbFile, KSIZE cbFile) 753 753 { 754 IMAGE_FILE_HEADER const *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile; 755 IMAGE_SECTION_HEADER const *paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader); 756 unsigned cSHdrs = pFileHdr->NumberOfSections; 757 unsigned iSHdr; 758 KPCUINT u; 759 int rcRet = 2; 760 int rc; 754 IMAGE_FILE_HEADER const *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile; 755 ANON_OBJECT_HEADER_BIGOBJ const *pBigObjHdr = (ANON_OBJECT_HEADER_BIGOBJ const *)pbFile; 756 IMAGE_SECTION_HEADER const *paSHdrs; 757 KU32 cSHdrs; 758 unsigned iSHdr; 759 KPCUINT u; 760 int rcRet = 2; 761 int rc; 762 763 if ( pBigObjHdr->Sig1 == 0 764 && pBigObjHdr->Sig2 == KU16_MAX) 765 { 766 paSHdrs = (IMAGE_SECTION_HEADER const *)(pBigObjHdr + 1); 767 cSHdrs = pBigObjHdr->NumberOfSections; 768 } 769 else 770 { 771 paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader); 772 cSHdrs = pFileHdr->NumberOfSections; 773 } 774 761 775 762 776 dprintf(("COFF file!\n")); … … 795 809 KBOOL kDepObjCOFFTest(const KU8 *pbFile, KSIZE cbFile) 796 810 { 797 IMAGE_FILE_HEADER const *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile; 798 IMAGE_SECTION_HEADER const *paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader); 799 unsigned cSHdrs = pFileHdr->NumberOfSections; 800 unsigned iSHdr; 801 KSIZE cbHdrs = (const KU8 *)&paSHdrs[cSHdrs] - (const KU8 *)pbFile; 811 IMAGE_FILE_HEADER const *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile; 812 ANON_OBJECT_HEADER_BIGOBJ const *pBigObjHdr = (ANON_OBJECT_HEADER_BIGOBJ const *)pbFile; 813 IMAGE_SECTION_HEADER const *paSHdrs; 814 KU32 cSHdrs; 815 KU32 iSHdr; 816 KSIZE cbHdrs; 802 817 803 818 if (cbFile <= sizeof(*pFileHdr)) 804 819 return K_FALSE; 805 if ( pFileHdr->Machine != IMAGE_FILE_MACHINE_I386 806 && pFileHdr->Machine != IMAGE_FILE_MACHINE_AMD64) 820 821 /* 822 * Deal with -bigobj output first. 823 */ 824 if ( pBigObjHdr->Sig1 == 0 825 && pBigObjHdr->Sig2 == KU16_MAX) 826 { 827 static const KU8 s_abClsId[16] = { ANON_OBJECT_HEADER_BIGOBJ_CLS_ID_BYTES }; 828 829 paSHdrs = (IMAGE_SECTION_HEADER const *)(pBigObjHdr + 1); 830 cSHdrs = pBigObjHdr->NumberOfSections; 831 cbHdrs = sizeof(IMAGE_SECTION_HEADER) * cSHdrs; 832 833 if (cbFile <= sizeof(*pBigObjHdr)) 834 return K_FALSE; 835 836 if (pBigObjHdr->Version != 2) 837 return K_FALSE; 838 if (memcmp(&pBigObjHdr->ClassID[0], s_abClsId, sizeof(pBigObjHdr->ClassID)) != 0) 839 return K_FALSE; 840 841 if ( pBigObjHdr->Machine != IMAGE_FILE_MACHINE_I386 842 && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_AMD64 843 && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARM 844 && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARMNT 845 && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARM64 846 && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_EBC) 847 { 848 fprintf(stderr, "kDepObj: error: bigobj Machine not supported: %#x\n", pBigObjHdr->Machine); 849 return K_FALSE; 850 } 851 if (pBigObjHdr->Flags != 0) 852 { 853 fprintf(stderr, "kDepObj: error: bigobj Flags field is non-zero: %#x\n", pBigObjHdr->Flags); 854 return K_FALSE; 855 } 856 if (pBigObjHdr->SizeOfData != 0) 857 { 858 fprintf(stderr, "kDepObj: error: bigobj SizeOfData field is non-zero: %#x\n", pBigObjHdr->SizeOfData); 859 return K_FALSE; 860 } 861 862 if ( pBigObjHdr->PointerToSymbolTable != 0 863 && ( pBigObjHdr->PointerToSymbolTable < cbHdrs 864 || pBigObjHdr->PointerToSymbolTable > cbFile)) 865 return K_FALSE; 866 if ( pBigObjHdr->PointerToSymbolTable == 0 867 && pBigObjHdr->NumberOfSymbols != 0) 868 return K_FALSE; 869 } 870 /* 871 * Look for normal COFF object. 872 */ 873 else 874 { 875 paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader); 876 cSHdrs = pFileHdr->NumberOfSections; 877 cbHdrs = (const KU8 *)&paSHdrs[cSHdrs] - (const KU8 *)pbFile; 878 879 if ( pFileHdr->Machine != IMAGE_FILE_MACHINE_I386 880 && pFileHdr->Machine != IMAGE_FILE_MACHINE_AMD64 881 && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARM 882 && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARMNT 883 && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARM64 884 && pFileHdr->Machine != IMAGE_FILE_MACHINE_EBC) 885 return K_FALSE; 886 887 if (pFileHdr->SizeOfOptionalHeader != 0) 888 return K_FALSE; /* COFF files doesn't have an optional header */ 889 890 if ( pFileHdr->PointerToSymbolTable != 0 891 && ( pFileHdr->PointerToSymbolTable < cbHdrs 892 || pFileHdr->PointerToSymbolTable > cbFile)) 893 return K_FALSE; 894 if ( pFileHdr->PointerToSymbolTable == 0 895 && pFileHdr->NumberOfSymbols != 0) 896 return K_FALSE; 897 if ( pFileHdr->Characteristics 898 & ( IMAGE_FILE_DLL 899 | IMAGE_FILE_SYSTEM 900 | IMAGE_FILE_UP_SYSTEM_ONLY 901 | IMAGE_FILE_NET_RUN_FROM_SWAP 902 | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 903 | IMAGE_FILE_EXECUTABLE_IMAGE 904 | IMAGE_FILE_RELOCS_STRIPPED)) 905 return K_FALSE; 906 } 907 if ( cSHdrs <= 1 908 || cSHdrs > cbFile) 807 909 return K_FALSE; 808 if (pFileHdr->SizeOfOptionalHeader != 0)809 return K_FALSE; /* COFF files doesn't have an optional header */810 811 if ( pFileHdr->NumberOfSections <= 1812 || pFileHdr->NumberOfSections > cbFile)813 return K_FALSE;814 815 910 if (cbHdrs >= cbFile) 816 911 return K_FALSE; 817 912 818 if ( pFileHdr->PointerToSymbolTable != 0 819 && ( pFileHdr->PointerToSymbolTable < cbHdrs 820 || pFileHdr->PointerToSymbolTable > cbFile)) 821 return K_FALSE; 822 if ( pFileHdr->PointerToSymbolTable == 0 823 && pFileHdr->NumberOfSymbols != 0) 824 return K_FALSE; 825 if ( pFileHdr->Characteristics 826 & ( IMAGE_FILE_DLL 827 | IMAGE_FILE_SYSTEM 828 | IMAGE_FILE_UP_SYSTEM_ONLY 829 | IMAGE_FILE_NET_RUN_FROM_SWAP 830 | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 831 | IMAGE_FILE_EXECUTABLE_IMAGE 832 | IMAGE_FILE_RELOCS_STRIPPED)) 833 return K_FALSE; 834 913 /* 914 * Check the section headers. 915 */ 835 916 for (iSHdr = 0; iSHdr < cSHdrs; iSHdr++) 836 917 { 837 if ( 838 && 839 840 841 return K_FALSE; 842 if ( 843 && 844 845 846 return K_FALSE; 847 if ( 848 && 849 850 918 if ( paSHdrs[iSHdr].PointerToRawData != 0 919 && ( paSHdrs[iSHdr].PointerToRawData < cbHdrs 920 || paSHdrs[iSHdr].PointerToRawData >= cbFile 921 || paSHdrs[iSHdr].PointerToRawData + paSHdrs[iSHdr].SizeOfRawData > cbFile)) 922 return K_FALSE; 923 if ( paSHdrs[iSHdr].PointerToRelocations != 0 924 && ( paSHdrs[iSHdr].PointerToRelocations < cbHdrs 925 || paSHdrs[iSHdr].PointerToRelocations >= cbFile 926 || paSHdrs[iSHdr].PointerToRelocations + paSHdrs[iSHdr].NumberOfRelocations * 10 > cbFile)) /* IMAGE_RELOCATION */ 927 return K_FALSE; 928 if ( paSHdrs[iSHdr].PointerToLinenumbers != 0 929 && ( paSHdrs[iSHdr].PointerToLinenumbers < cbHdrs 930 || paSHdrs[iSHdr].PointerToLinenumbers >= cbFile 931 || paSHdrs[iSHdr].PointerToLinenumbers + paSHdrs[iSHdr].NumberOfLinenumbers * 6 > cbFile)) /* IMAGE_LINENUMBER */ 851 932 return K_FALSE; 852 933 } … … 882 963 else 883 964 { 884 fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF file.\n", argv0);965 fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF/COFF file.\n", argv0); 885 966 rc = 1; 886 967 }
Note:
See TracChangeset
for help on using the changeset viewer.