@@ -267,6 +267,7 @@ Java_com_wolfssl_wolfcrypt_Sha_native_1update_1internal__Ljava_nio_ByteBuffer_2I
267267 int ret = 0 ;
268268 Sha * sha = NULL ;
269269 byte * data = NULL ;
270+ jlong dataSz = 0 ;
270271
271272 sha = (Sha * ) getNativeStruct (env , this );
272273 if ((* env )-> ExceptionOccurred (env )) {
@@ -275,10 +276,15 @@ Java_com_wolfssl_wolfcrypt_Sha_native_1update_1internal__Ljava_nio_ByteBuffer_2I
275276 }
276277
277278 data = getDirectBufferAddress (env , data_buffer );
279+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
278280
279- ret = (!sha || !data )
280- ? BAD_FUNC_ARG
281- : wc_ShaUpdate (sha , data + position , len );
281+ if (!sha || !data || position < 0 || len < 0 ||
282+ ((jlong )position + (jlong )len ) > dataSz ) {
283+ ret = BAD_FUNC_ARG ;
284+ }
285+ else {
286+ ret = wc_ShaUpdate (sha , data + position , len );
287+ }
282288
283289 if (ret != 0 )
284290 throwWolfCryptExceptionFromError (env , ret );
@@ -469,6 +475,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Sha224_native_1update_1interna
469475 int ret = 0 ;
470476 Sha224 * sha = NULL ;
471477 byte * data = NULL ;
478+ jlong dataSz = 0 ;
472479
473480 sha = (Sha224 * ) getNativeStruct (env , this );
474481 if ((* env )-> ExceptionOccurred (env )) {
@@ -477,8 +484,10 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Sha224_native_1update_1interna
477484 }
478485
479486 data = getDirectBufferAddress (env , data_buffer );
487+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
480488
481- if (sha == NULL || data == NULL ) {
489+ if (sha == NULL || data == NULL || position < 0 || len < 0 ||
490+ ((jlong )position + (jlong )len ) > dataSz ) {
482491 ret = BAD_FUNC_ARG ;
483492 }
484493 else {
@@ -693,6 +702,7 @@ Java_com_wolfssl_wolfcrypt_Sha256_native_1update_1internal__Ljava_nio_ByteBuffer
693702 int ret = 0 ;
694703 Sha256 * sha = NULL ;
695704 byte * data = NULL ;
705+ jlong dataSz = 0 ;
696706
697707 sha = (Sha256 * ) getNativeStruct (env , this );
698708 if ((* env )-> ExceptionOccurred (env )) {
@@ -701,10 +711,15 @@ Java_com_wolfssl_wolfcrypt_Sha256_native_1update_1internal__Ljava_nio_ByteBuffer
701711 }
702712
703713 data = getDirectBufferAddress (env , data_buffer );
714+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
704715
705- ret = (!sha || !data )
706- ? BAD_FUNC_ARG
707- : wc_Sha256Update (sha , data + position , len );
716+ if (!sha || !data || position < 0 || len < 0 ||
717+ ((jlong )position + (jlong )len ) > dataSz ) {
718+ ret = BAD_FUNC_ARG ;
719+ }
720+ else {
721+ ret = wc_Sha256Update (sha , data + position , len );
722+ }
708723
709724 if (ret != 0 )
710725 throwWolfCryptExceptionFromError (env , ret );
@@ -890,6 +905,7 @@ Java_com_wolfssl_wolfcrypt_Sha384_native_1update_1internal__Ljava_nio_ByteBuffer
890905 int ret = 0 ;
891906 Sha384 * sha = NULL ;
892907 byte * data = NULL ;
908+ jlong dataSz = 0 ;
893909
894910 sha = (Sha384 * ) getNativeStruct (env , this );
895911 if ((* env )-> ExceptionOccurred (env )) {
@@ -898,10 +914,15 @@ Java_com_wolfssl_wolfcrypt_Sha384_native_1update_1internal__Ljava_nio_ByteBuffer
898914 }
899915
900916 data = getDirectBufferAddress (env , data_buffer );
917+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
901918
902- ret = (!sha || !data )
903- ? BAD_FUNC_ARG
904- : wc_Sha384Update (sha , data + position , len );
919+ if (!sha || !data || position < 0 || len < 0 ||
920+ ((jlong )position + (jlong )len ) > dataSz ) {
921+ ret = BAD_FUNC_ARG ;
922+ }
923+ else {
924+ ret = wc_Sha384Update (sha , data + position , len );
925+ }
905926
906927 if (ret != 0 )
907928 throwWolfCryptExceptionFromError (env , ret );
@@ -1086,6 +1107,7 @@ Java_com_wolfssl_wolfcrypt_Sha512_native_1update_1internal__Ljava_nio_ByteBuffer
10861107 int ret = 0 ;
10871108 Sha512 * sha = NULL ;
10881109 byte * data = NULL ;
1110+ jlong dataSz = 0 ;
10891111
10901112 sha = (Sha512 * ) getNativeStruct (env , this );
10911113 if ((* env )-> ExceptionOccurred (env )) {
@@ -1094,10 +1116,15 @@ Java_com_wolfssl_wolfcrypt_Sha512_native_1update_1internal__Ljava_nio_ByteBuffer
10941116 }
10951117
10961118 data = getDirectBufferAddress (env , data_buffer );
1119+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
10971120
1098- ret = (!sha || !data )
1099- ? BAD_FUNC_ARG
1100- : wc_Sha512Update (sha , data + position , len );
1121+ if (!sha || !data || position < 0 || len < 0 ||
1122+ ((jlong )position + (jlong )len ) > dataSz ) {
1123+ ret = BAD_FUNC_ARG ;
1124+ }
1125+ else {
1126+ ret = wc_Sha512Update (sha , data + position , len );
1127+ }
11011128
11021129 if (ret != 0 )
11031130 throwWolfCryptExceptionFromError (env , ret );
@@ -1349,6 +1376,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Sha3_native_1update_1internal_
13491376 int ret = 0 ;
13501377 byte * data = NULL ;
13511378 wc_Sha3 * sha = NULL ;
1379+ jlong dataSz = 0 ;
13521380
13531381 sha = (wc_Sha3 * ) getNativeStruct (env , this );
13541382 if ((* env )-> ExceptionOccurred (env )) {
@@ -1357,8 +1385,10 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Sha3_native_1update_1internal_
13571385 }
13581386
13591387 data = getDirectBufferAddress (env , data_buffer );
1388+ dataSz = (* env )-> GetDirectBufferCapacity (env , data_buffer );
13601389
1361- if (sha == NULL || data == NULL ) {
1390+ if (sha == NULL || data == NULL || offset < 0 || len < 0 ||
1391+ ((jlong )offset + (jlong )len ) > dataSz ) {
13621392 ret = BAD_FUNC_ARG ;
13631393 }
13641394
0 commit comments