@@ -714,16 +714,19 @@ int wh_Client_SheEncEcbResponse(whClientContext* c, uint8_t* out, uint32_t sz)
714714 if (ret == 0 ) {
715715 if (group != WH_MESSAGE_GROUP_SHE ||
716716 action != WH_SHE_ENC_ECB ||
717- dataSz < sizeof (* resp ) ||
718- dataSz < sizeof (* resp ) + resp -> sz ) {
717+ dataSz < sizeof (* resp )) {
719718 ret = WH_ERROR_ABORTED ;
720719 }
721720 }
722721 if (ret == 0 ) {
723722 ret = resp -> rc ;
724723 }
724+ /* payload is only present on success, so validate its size before copy */
725725 if (ret == 0 ) {
726- if (sz < resp -> sz ) {
726+ if (dataSz < sizeof (* resp ) + resp -> sz ) {
727+ ret = WH_ERROR_ABORTED ;
728+ }
729+ else if (sz < resp -> sz ) {
727730 ret = WH_ERROR_BUFFER_SIZE ;
728731 }
729732 else {
@@ -794,16 +797,19 @@ int wh_Client_SheEncCbcResponse(whClientContext* c, uint8_t* out, uint32_t sz)
794797 if (ret == 0 ) {
795798 if (group != WH_MESSAGE_GROUP_SHE ||
796799 action != WH_SHE_ENC_CBC ||
797- dataSz < sizeof (* resp ) ||
798- dataSz < sizeof (* resp ) + resp -> sz ) {
800+ dataSz < sizeof (* resp )) {
799801 ret = WH_ERROR_ABORTED ;
800802 }
801803 }
802804 if (ret == 0 ) {
803805 ret = resp -> rc ;
804806 }
807+ /* payload is only present on success, so validate its size before copy */
805808 if (ret == 0 ) {
806- if (sz < resp -> sz ) {
809+ if (dataSz < sizeof (* resp ) + resp -> sz ) {
810+ ret = WH_ERROR_ABORTED ;
811+ }
812+ else if (sz < resp -> sz ) {
807813 ret = WH_ERROR_BUFFER_SIZE ;
808814 }
809815 else {
@@ -870,16 +876,19 @@ int wh_Client_SheDecEcbResponse(whClientContext* c, uint8_t* out, uint32_t sz)
870876 if (ret == 0 ) {
871877 if (group != WH_MESSAGE_GROUP_SHE ||
872878 action != WH_SHE_DEC_ECB ||
873- dataSz < sizeof (* resp ) ||
874- dataSz < sizeof (* resp ) + resp -> sz ) {
879+ dataSz < sizeof (* resp )) {
875880 ret = WH_ERROR_ABORTED ;
876881 }
877882 }
878883 if (ret == 0 ) {
879884 ret = resp -> rc ;
880885 }
886+ /* payload is only present on success, so validate its size before copy */
881887 if (ret == 0 ) {
882- if (sz < resp -> sz ) {
888+ if (dataSz < sizeof (* resp ) + resp -> sz ) {
889+ ret = WH_ERROR_ABORTED ;
890+ }
891+ else if (sz < resp -> sz ) {
883892 ret = WH_ERROR_BUFFER_SIZE ;
884893 }
885894 else {
@@ -950,16 +959,19 @@ int wh_Client_SheDecCbcResponse(whClientContext* c, uint8_t* out, uint32_t sz)
950959 if (ret == 0 ) {
951960 if (group != WH_MESSAGE_GROUP_SHE ||
952961 action != WH_SHE_DEC_CBC ||
953- dataSz < sizeof (* resp ) ||
954- dataSz < sizeof (* resp ) + resp -> sz ) {
962+ dataSz < sizeof (* resp )) {
955963 ret = WH_ERROR_ABORTED ;
956964 }
957965 }
958966 if (ret == 0 ) {
959967 ret = resp -> rc ;
960968 }
969+ /* payload is only present on success, so validate its size before copy */
961970 if (ret == 0 ) {
962- if (sz < resp -> sz ) {
971+ if (dataSz < sizeof (* resp ) + resp -> sz ) {
972+ ret = WH_ERROR_ABORTED ;
973+ }
974+ else if (sz < resp -> sz ) {
963975 ret = WH_ERROR_BUFFER_SIZE ;
964976 }
965977 else {
0 commit comments