@@ -266,33 +266,38 @@ int se050_hash_copy(SE050_HASH_Context* src, SE050_HASH_Context* dst)
266266
267267int se050_hash_update (SE050_HASH_Context * se050Ctx , const byte * data , word32 len )
268268{
269- byte * tmp = NULL ;
269+ byte * tmp = NULL ;
270+ word32 usedSz = 0 ;
270271
271- if (se050Ctx == NULL || (len > 0 && data == NULL )) {
272+ if (se050Ctx == NULL || (len > 0 && data == NULL ) || (len == 0 ) ||
273+ !WC_SAFE_SUM_WORD32 (se050Ctx -> used , len , usedSz )) {
272274 return BAD_FUNC_ARG ;
273275 }
274276
275- if (se050Ctx -> len < se050Ctx -> used + len ) {
277+ if (se050Ctx -> len < usedSz ) {
276278 if (se050Ctx -> msg == NULL ) {
277- se050Ctx -> msg = (byte * )XMALLOC (se050Ctx -> used + len ,
279+ se050Ctx -> msg = (byte * )XMALLOC (usedSz ,
278280 se050Ctx -> heap , DYNAMIC_TYPE_TMP_BUFFER );
279- XMEMSET (se050Ctx -> msg , 0 , se050Ctx -> used + len );
281+ if (se050Ctx -> msg == NULL ) {
282+ return MEMORY_E ;
283+ }
284+ XMEMSET (se050Ctx -> msg , 0 , usedSz );
280285 }
281286 else {
282- tmp = (byte * )XMALLOC (se050Ctx -> used + len , se050Ctx -> heap ,
287+ tmp = (byte * )XMALLOC (usedSz , se050Ctx -> heap ,
283288 DYNAMIC_TYPE_TMP_BUFFER );
284289 if (tmp == NULL ) {
285290 return MEMORY_E ;
286291 }
287- XMEMSET (tmp , 0 , se050Ctx -> used + len );
292+ XMEMSET (tmp , 0 , usedSz );
288293 XMEMCPY (tmp , se050Ctx -> msg , se050Ctx -> used );
289294 XFREE (se050Ctx -> msg , se050Ctx -> heap , DYNAMIC_TYPE_TMP_BUFFER );
290295 se050Ctx -> msg = tmp ;
291296 }
292297 if (se050Ctx -> msg == NULL ) {
293298 return MEMORY_E ;
294299 }
295- se050Ctx -> len = se050Ctx -> used + len ;
300+ se050Ctx -> len = usedSz ;
296301 }
297302
298303 XMEMCPY (se050Ctx -> msg + se050Ctx -> used , data , len );
0 commit comments