@@ -83,9 +83,9 @@ static php_password_algo php_password_determine_algo(const char *hash, const siz
83
83
return PHP_PASSWORD_BCRYPT ;
84
84
}
85
85
#if HAVE_ARGON2LIB
86
- if (hash [ 0 ] == '$' && strstr (hash , "argon2i" )) {
87
- return PHP_PASSWORD_ARGON2I ;
88
- } else if (hash [ 0 ] == '$' && strstr (hash , "argon2d" )) {
86
+ if (len >= sizeof ( "$argon2i$" ) - 1 && ! memcmp (hash , "$ argon2i$" , sizeof ( "$argon2i$" ) - 1 )) {
87
+ return PHP_PASSWORD_ARGON2I ;
88
+ } else if (len >= sizeof ( "$argon2d$" ) - 1 && ! memcmp (hash , "$ argon2d$" , sizeof ( "$argon2d$" ) - 1 )) {
89
89
return PHP_PASSWORD_ARGON2D ;
90
90
}
91
91
#endif
@@ -549,9 +549,6 @@ PHP_FUNCTION(password_hash)
549
549
case PHP_PASSWORD_ARGON2I :
550
550
case PHP_PASSWORD_ARGON2D :
551
551
{
552
- char * out ;
553
- char * encoded ;
554
-
555
552
size_t out_len = 32 ;
556
553
size_t encoded_len ;
557
554
int status = 0 ;
@@ -564,8 +561,8 @@ PHP_FUNCTION(password_hash)
564
561
out_len
565
562
);
566
563
567
- encoded = emalloc ( encoded_len + 1 );
568
- out = emalloc ( out_len + 1 );
564
+ zend_string * out = zend_string_alloc ( out_len , 0 );
565
+ zend_string * encoded = zend_string_alloc ( encoded_len , 0 );
569
566
570
567
status = argon2_hash (
571
568
t_cost ,
@@ -575,26 +572,24 @@ PHP_FUNCTION(password_hash)
575
572
password_len ,
576
573
salt ,
577
574
salt_len ,
578
- out ,
575
+ out -> val ,
579
576
out_len ,
580
- encoded ,
577
+ encoded -> val ,
581
578
encoded_len ,
582
579
type ,
583
580
ARGON2_VERSION_NUMBER
584
581
);
585
582
586
- zend_string * ret = zend_string_init (encoded , encoded_len , 0 );
587
-
588
583
efree (out );
589
584
efree (salt );
590
- efree (encoded );
591
585
592
586
if (status != ARGON2_OK ) {
587
+ efree (encoded );
593
588
php_error_docref (NULL , E_WARNING , argon2_error_message (status ));
594
589
RETURN_FALSE ;
595
590
}
596
591
597
- RETURN_STR (ret );
592
+ RETURN_STR (encoded );
598
593
}
599
594
break ;
600
595
#endif
0 commit comments