@@ -884,6 +884,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
884884 TPML_ALG_PROPERTY * algorithms =
885885 & out -> capabilityData .data .algorithms ;
886886 TPM2_Packet_ParseU32 (& packet , & algorithms -> count );
887+ if (algorithms -> count > MAX_CAP_ALGS )
888+ algorithms -> count = MAX_CAP_ALGS ;
887889 for (i = 0 ; i < (int )algorithms -> count ; i ++ ) {
888890 TPM2_Packet_ParseU16 (& packet ,
889891 & algorithms -> algProperties [i ].alg );
@@ -897,6 +899,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
897899 TPML_HANDLE * handles =
898900 & out -> capabilityData .data .handles ;
899901 TPM2_Packet_ParseU32 (& packet , & handles -> count );
902+ if (handles -> count > MAX_CAP_HANDLES )
903+ handles -> count = MAX_CAP_HANDLES ;
900904 for (i = 0 ; i < (int )handles -> count ; i ++ ) {
901905 TPM2_Packet_ParseU32 (& packet , & handles -> handle [i ]);
902906 }
@@ -907,6 +911,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
907911 TPML_CCA * cmdAttribs =
908912 & out -> capabilityData .data .command ;
909913 TPM2_Packet_ParseU32 (& packet , & cmdAttribs -> count );
914+ if (cmdAttribs -> count > MAX_CAP_CC )
915+ cmdAttribs -> count = MAX_CAP_CC ;
910916 for (i = 0 ; i < (int )cmdAttribs -> count ; i ++ ) {
911917 TPM2_Packet_ParseU32 (& packet ,
912918 & cmdAttribs -> commandAttributes [i ]);
@@ -919,6 +925,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
919925 TPML_CC * cmdCodes =
920926 & out -> capabilityData .data .ppCommands ;
921927 TPM2_Packet_ParseU32 (& packet , & cmdCodes -> count );
928+ if (cmdCodes -> count > MAX_CAP_CC )
929+ cmdCodes -> count = MAX_CAP_CC ;
922930 for (i = 0 ; i < (int )cmdCodes -> count ; i ++ ) {
923931 TPM2_Packet_ParseU32 (& packet ,
924932 & cmdCodes -> commandCodes [i ]);
@@ -937,6 +945,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
937945 TPML_TAGGED_TPM_PROPERTY * prop =
938946 & out -> capabilityData .data .tpmProperties ;
939947 TPM2_Packet_ParseU32 (& packet , & prop -> count );
948+ if (prop -> count > MAX_TPM_PROPERTIES )
949+ prop -> count = MAX_TPM_PROPERTIES ;
940950 for (i = 0 ; i < (int )prop -> count ; i ++ ) {
941951 TPM2_Packet_ParseU32 (& packet ,
942952 & prop -> tpmProperty [i ].property );
@@ -950,13 +960,26 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
950960 TPML_TAGGED_PCR_PROPERTY * pcrProp =
951961 & out -> capabilityData .data .pcrProperties ;
952962 TPM2_Packet_ParseU32 (& packet , & pcrProp -> count );
963+ if (pcrProp -> count > MAX_PCR_PROPERTIES )
964+ pcrProp -> count = MAX_PCR_PROPERTIES ;
965+ for (i = 0 ; i < (int )pcrProp -> count ; i ++ ) {
966+ TPMS_TAGGED_PCR_SELECT * sel = & pcrProp -> pcrProperty [i ];
967+ TPM2_Packet_ParseU32 (& packet , & sel -> tag );
968+ TPM2_Packet_ParseU8 (& packet , & sel -> sizeofSelect );
969+ if (sel -> sizeofSelect > PCR_SELECT_MAX )
970+ sel -> sizeofSelect = PCR_SELECT_MAX ;
971+ TPM2_Packet_ParseBytes (& packet , sel -> pcrSelect ,
972+ sel -> sizeofSelect );
973+ }
953974 break ;
954975 }
955976 case TPM_CAP_ECC_CURVES :
956977 {
957978 TPML_ECC_CURVE * eccCurves =
958979 & out -> capabilityData .data .eccCurves ;
959980 TPM2_Packet_ParseU32 (& packet , & eccCurves -> count );
981+ if (eccCurves -> count > MAX_ECC_CURVES )
982+ eccCurves -> count = MAX_ECC_CURVES ;
960983 for (i = 0 ; i < (int )eccCurves -> count ; i ++ ) {
961984 TPM2_Packet_ParseU16 (& packet ,
962985 & eccCurves -> eccCurves [i ]);
@@ -968,6 +991,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
968991 TPML_TAGGED_POLICY * authPol =
969992 & out -> capabilityData .data .authPolicies ;
970993 TPM2_Packet_ParseU32 (& packet , & authPol -> count );
994+ if (authPol -> count > MAX_TAGGED_POLICIES )
995+ authPol -> count = MAX_TAGGED_POLICIES ;
971996 for (i = 0 ; i < (int )authPol -> count ; i ++ ) {
972997 int digSz ;
973998 TPMS_TAGGED_POLICY * pol = & authPol -> policies [i ];
@@ -988,6 +1013,8 @@ TPM_RC TPM2_GetCapability(GetCapability_In* in, GetCapability_Out* out)
9881013 TPML_ACT_DATA * actData =
9891014 & out -> capabilityData .data .actData ;
9901015 TPM2_Packet_ParseU32 (& packet , & actData -> count );
1016+ if (actData -> count > MAX_ACT_DATA )
1017+ actData -> count = MAX_ACT_DATA ;
9911018 for (i = 0 ; i < (int )actData -> count ; i ++ ) {
9921019 TPM2_Packet_ParseU32 (& packet ,
9931020 & actData -> actData [i ].handle );
0 commit comments