@@ -409,7 +409,8 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
409
409
}
410
410
}
411
411
if (digest == NULL ) {
412
- _setException (state -> unsupported_digestmod_error , "unsupported hash type %s" , name );
412
+ (void )_setException (state -> unsupported_digestmod_error ,
413
+ "unsupported hash type %s" , name );
413
414
return NULL ;
414
415
}
415
416
return digest ;
@@ -424,7 +425,6 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
424
425
*/
425
426
static PY_EVP_MD *
426
427
py_digest_by_digestmod (PyObject * module , PyObject * digestmod , enum Py_hash_type py_ht ) {
427
- PY_EVP_MD * evp ;
428
428
PyObject * name_obj = NULL ;
429
429
const char * name ;
430
430
@@ -450,12 +450,7 @@ py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type
450
450
return NULL ;
451
451
}
452
452
453
- evp = py_digest_by_name (module , name , py_ht );
454
- if (evp == NULL ) {
455
- return NULL ;
456
- }
457
-
458
- return evp ;
453
+ return py_digest_by_name (module , name , py_ht );
459
454
}
460
455
461
456
static EVPobject *
@@ -489,7 +484,7 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
489
484
else
490
485
process = Py_SAFE_DOWNCAST (len , Py_ssize_t , unsigned int );
491
486
if (!EVP_DigestUpdate (self -> ctx , (const void * )cp , process )) {
492
- _setException (PyExc_ValueError , NULL );
487
+ ( void ) _setException (PyExc_ValueError , NULL );
493
488
return -1 ;
494
489
}
495
490
len -= process ;
@@ -567,17 +562,20 @@ EVP_digest_impl(EVPobject *self)
567
562
}
568
563
569
564
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
570
- return _setException ( PyExc_ValueError , NULL ) ;
565
+ goto error ;
571
566
}
572
567
digest_size = EVP_MD_CTX_size (temp_ctx );
573
568
if (!EVP_DigestFinal (temp_ctx , digest , NULL )) {
574
- _setException (PyExc_ValueError , NULL );
575
- return NULL ;
569
+ goto error ;
576
570
}
577
571
578
572
retval = PyBytes_FromStringAndSize ((const char * )digest , digest_size );
579
573
EVP_MD_CTX_free (temp_ctx );
580
574
return retval ;
575
+
576
+ error :
577
+ EVP_MD_CTX_free (temp_ctx );
578
+ return _setException (PyExc_ValueError , NULL );
581
579
}
582
580
583
581
/*[clinic input]
@@ -602,17 +600,20 @@ EVP_hexdigest_impl(EVPobject *self)
602
600
603
601
/* Get the raw (binary) digest value */
604
602
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
605
- return _setException ( PyExc_ValueError , NULL ) ;
603
+ goto error ;
606
604
}
607
605
digest_size = EVP_MD_CTX_size (temp_ctx );
608
606
if (!EVP_DigestFinal (temp_ctx , digest , NULL )) {
609
- _setException (PyExc_ValueError , NULL );
610
- return NULL ;
607
+ goto error ;
611
608
}
612
609
613
610
EVP_MD_CTX_free (temp_ctx );
614
611
615
612
return _Py_strhex ((const char * )digest , (Py_ssize_t )digest_size );
613
+
614
+ error :
615
+ EVP_MD_CTX_free (temp_ctx );
616
+ return _setException (PyExc_ValueError , NULL );
616
617
}
617
618
618
619
/*[clinic input]
@@ -682,7 +683,11 @@ EVP_get_digest_size(EVPobject *self, void *closure)
682
683
static PyObject *
683
684
EVP_get_name (EVPobject * self , void * closure )
684
685
{
685
- return py_digest_name (EVP_MD_CTX_md (self -> ctx ));
686
+ const EVP_MD * md = EVP_MD_CTX_md (self -> ctx );
687
+ if (md == NULL ) {
688
+ return _setException (PyExc_ValueError , NULL );
689
+ }
690
+ return py_digest_name (md );
686
691
}
687
692
688
693
static PyGetSetDef EVP_getseters [] = {
@@ -780,21 +785,22 @@ EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length)
780
785
}
781
786
782
787
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
783
- Py_DECREF (retval );
784
- EVP_MD_CTX_free (temp_ctx );
785
- return _setException (PyExc_ValueError , NULL );
788
+ goto error ;
786
789
}
787
790
if (!EVP_DigestFinalXOF (temp_ctx ,
788
791
(unsigned char * )PyBytes_AS_STRING (retval ),
789
- length )) {
790
- Py_DECREF (retval );
791
- EVP_MD_CTX_free (temp_ctx );
792
- _setException (PyExc_ValueError , NULL );
793
- return NULL ;
792
+ length ))
793
+ {
794
+ goto error ;
794
795
}
795
796
796
797
EVP_MD_CTX_free (temp_ctx );
797
798
return retval ;
799
+
800
+ error :
801
+ Py_DECREF (retval );
802
+ EVP_MD_CTX_free (temp_ctx );
803
+ return _setException (PyExc_ValueError , NULL );
798
804
}
799
805
800
806
/*[clinic input]
@@ -828,22 +834,22 @@ EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length)
828
834
829
835
/* Get the raw (binary) digest value */
830
836
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
831
- PyMem_Free (digest );
832
- EVP_MD_CTX_free (temp_ctx );
833
- return _setException (PyExc_ValueError , NULL );
837
+ goto error ;
834
838
}
835
839
if (!EVP_DigestFinalXOF (temp_ctx , digest , length )) {
836
- PyMem_Free (digest );
837
- EVP_MD_CTX_free (temp_ctx );
838
- _setException (PyExc_ValueError , NULL );
839
- return NULL ;
840
+ goto error ;
840
841
}
841
842
842
843
EVP_MD_CTX_free (temp_ctx );
843
844
844
845
retval = _Py_strhex ((const char * )digest , length );
845
846
PyMem_Free (digest );
846
847
return retval ;
848
+
849
+ error :
850
+ PyMem_Free (digest );
851
+ EVP_MD_CTX_free (temp_ctx );
852
+ return _setException (PyExc_ValueError , NULL );
847
853
}
848
854
849
855
static PyMethodDef EVPXOF_methods [] = {
@@ -944,7 +950,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
944
950
945
951
int result = EVP_DigestInit_ex (self -> ctx , digest , NULL );
946
952
if (!result ) {
947
- _setException (PyExc_ValueError , NULL );
953
+ ( void ) _setException (PyExc_ValueError , NULL );
948
954
Py_CLEAR (self );
949
955
goto exit ;
950
956
}
@@ -965,7 +971,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
965
971
}
966
972
}
967
973
968
- exit :
974
+ exit :
969
975
if (data_obj != NULL ) {
970
976
PyBuffer_Release (& view );
971
977
}
@@ -1410,14 +1416,14 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1410
1416
r = PyLong_AsUnsignedLong (r_obj );
1411
1417
if (r == (unsigned long ) -1 && PyErr_Occurred ()) {
1412
1418
PyErr_SetString (PyExc_TypeError ,
1413
- "r is required and must be an unsigned int" );
1419
+ "r is required and must be an unsigned int" );
1414
1420
return NULL ;
1415
1421
}
1416
1422
1417
1423
p = PyLong_AsUnsignedLong (p_obj );
1418
1424
if (p == (unsigned long ) -1 && PyErr_Occurred ()) {
1419
1425
PyErr_SetString (PyExc_TypeError ,
1420
- "p is required and must be an unsigned int" );
1426
+ "p is required and must be an unsigned int" );
1421
1427
return NULL ;
1422
1428
}
1423
1429
@@ -1426,22 +1432,22 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1426
1432
future. The maxmem constant is private to OpenSSL. */
1427
1433
PyErr_Format (PyExc_ValueError ,
1428
1434
"maxmem must be positive and smaller than %d" ,
1429
- INT_MAX );
1435
+ INT_MAX );
1430
1436
return NULL ;
1431
1437
}
1432
1438
1433
1439
if (dklen < 1 || dklen > INT_MAX ) {
1434
1440
PyErr_Format (PyExc_ValueError ,
1435
- "dklen must be greater than 0 and smaller than %d" ,
1436
- INT_MAX );
1441
+ "dklen must be greater than 0 and smaller than %d" ,
1442
+ INT_MAX );
1437
1443
return NULL ;
1438
1444
}
1439
1445
1440
1446
/* let OpenSSL validate the rest */
1441
1447
retval = EVP_PBE_scrypt (NULL , 0 , NULL , 0 , n , r , p , maxmem , NULL , 0 );
1442
1448
if (!retval ) {
1443
- _setException (PyExc_ValueError , "Invalid parameter combination for n, r, p, maxmem." );
1444
- return NULL ;
1449
+ return _setException (PyExc_ValueError ,
1450
+ "Invalid parameter combination for n, r, p, maxmem." ) ;
1445
1451
}
1446
1452
1447
1453
key_obj = PyBytes_FromStringAndSize (NULL , dklen );
@@ -1461,8 +1467,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1461
1467
1462
1468
if (!retval ) {
1463
1469
Py_CLEAR (key_obj );
1464
- _setException (PyExc_ValueError , NULL );
1465
- return NULL ;
1470
+ return _setException (PyExc_ValueError , NULL );
1466
1471
}
1467
1472
return key_obj ;
1468
1473
}
@@ -1518,8 +1523,7 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
1518
1523
PY_EVP_MD_free (evp );
1519
1524
1520
1525
if (result == NULL ) {
1521
- _setException (PyExc_ValueError , NULL );
1522
- return NULL ;
1526
+ return _setException (PyExc_ValueError , NULL );
1523
1527
}
1524
1528
return PyBytes_FromStringAndSize ((const char * )md , md_len );
1525
1529
}
@@ -1568,14 +1572,15 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1568
1572
1569
1573
ctx = HMAC_CTX_new ();
1570
1574
if (ctx == NULL ) {
1575
+ PY_EVP_MD_free (digest );
1571
1576
PyErr_NoMemory ();
1572
1577
goto error ;
1573
1578
}
1574
1579
1575
1580
r = HMAC_Init_ex (ctx , key -> buf , (int )key -> len , digest , NULL /* impl */ );
1576
1581
PY_EVP_MD_free (digest );
1577
1582
if (r == 0 ) {
1578
- _setException (PyExc_ValueError , NULL );
1583
+ ( void ) _setException (PyExc_ValueError , NULL );
1579
1584
goto error ;
1580
1585
}
1581
1586
@@ -1613,11 +1618,20 @@ locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self)
1613
1618
return result ;
1614
1619
}
1615
1620
1621
+ /* returning 0 means that an error occurred and an exception is set */
1616
1622
static unsigned int
1617
1623
_hmac_digest_size (HMACobject * self )
1618
1624
{
1619
- unsigned int digest_size = EVP_MD_size (HMAC_CTX_get_md (self -> ctx ));
1625
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1626
+ if (md == NULL ) {
1627
+ (void )_setException (PyExc_ValueError , NULL );
1628
+ return 0 ;
1629
+ }
1630
+ unsigned int digest_size = EVP_MD_size (md );
1620
1631
assert (digest_size <= EVP_MAX_MD_SIZE );
1632
+ if (digest_size == 0 ) {
1633
+ (void )_setException (PyExc_ValueError , NULL );
1634
+ }
1621
1635
return digest_size ;
1622
1636
}
1623
1637
@@ -1647,7 +1661,7 @@ _hmac_update(HMACobject *self, PyObject *obj)
1647
1661
PyBuffer_Release (& view );
1648
1662
1649
1663
if (r == 0 ) {
1650
- _setException (PyExc_ValueError , NULL );
1664
+ ( void ) _setException (PyExc_ValueError , NULL );
1651
1665
return 0 ;
1652
1666
}
1653
1667
return 1 ;
@@ -1703,7 +1717,11 @@ _hmac_dealloc(HMACobject *self)
1703
1717
static PyObject *
1704
1718
_hmac_repr (HMACobject * self )
1705
1719
{
1706
- PyObject * digest_name = py_digest_name (HMAC_CTX_get_md (self -> ctx ));
1720
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1721
+ if (md == NULL ) {
1722
+ return _setException (PyExc_ValueError , NULL );
1723
+ }
1724
+ PyObject * digest_name = py_digest_name (md );
1707
1725
if (digest_name == NULL ) {
1708
1726
return NULL ;
1709
1727
}
@@ -1736,18 +1754,18 @@ _hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len)
1736
1754
{
1737
1755
HMAC_CTX * temp_ctx = HMAC_CTX_new ();
1738
1756
if (temp_ctx == NULL ) {
1739
- PyErr_NoMemory ();
1757
+ ( void ) PyErr_NoMemory ();
1740
1758
return 0 ;
1741
1759
}
1742
1760
if (!locked_HMAC_CTX_copy (temp_ctx , self )) {
1743
1761
HMAC_CTX_free (temp_ctx );
1744
- _setException (PyExc_ValueError , NULL );
1762
+ ( void ) _setException (PyExc_ValueError , NULL );
1745
1763
return 0 ;
1746
1764
}
1747
1765
int r = HMAC_Final (temp_ctx , buf , & len );
1748
1766
HMAC_CTX_free (temp_ctx );
1749
1767
if (r == 0 ) {
1750
- _setException (PyExc_ValueError , NULL );
1768
+ ( void ) _setException (PyExc_ValueError , NULL );
1751
1769
return 0 ;
1752
1770
}
1753
1771
return 1 ;
@@ -1765,7 +1783,7 @@ _hashlib_HMAC_digest_impl(HMACobject *self)
1765
1783
unsigned char digest [EVP_MAX_MD_SIZE ];
1766
1784
unsigned int digest_size = _hmac_digest_size (self );
1767
1785
if (digest_size == 0 ) {
1768
- return _setException ( PyExc_ValueError , NULL ) ;
1786
+ return NULL ;
1769
1787
}
1770
1788
int r = _hmac_digest (self , digest , digest_size );
1771
1789
if (r == 0 ) {
@@ -1790,7 +1808,7 @@ _hashlib_HMAC_hexdigest_impl(HMACobject *self)
1790
1808
unsigned char digest [EVP_MAX_MD_SIZE ];
1791
1809
unsigned int digest_size = _hmac_digest_size (self );
1792
1810
if (digest_size == 0 ) {
1793
- return _setException ( PyExc_ValueError , NULL ) ;
1811
+ return NULL ;
1794
1812
}
1795
1813
int r = _hmac_digest (self , digest , digest_size );
1796
1814
if (r == 0 ) {
@@ -1804,7 +1822,7 @@ _hashlib_hmac_get_digest_size(HMACobject *self, void *closure)
1804
1822
{
1805
1823
unsigned int digest_size = _hmac_digest_size (self );
1806
1824
if (digest_size == 0 ) {
1807
- return _setException ( PyExc_ValueError , NULL ) ;
1825
+ return NULL ;
1808
1826
}
1809
1827
return PyLong_FromLong (digest_size );
1810
1828
}
@@ -1822,7 +1840,11 @@ _hashlib_hmac_get_block_size(HMACobject *self, void *closure)
1822
1840
static PyObject *
1823
1841
_hashlib_hmac_get_name (HMACobject * self , void * closure )
1824
1842
{
1825
- PyObject * digest_name = py_digest_name (HMAC_CTX_get_md (self -> ctx ));
1843
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1844
+ if (md == NULL ) {
1845
+ return _setException (PyExc_ValueError , NULL );
1846
+ }
1847
+ PyObject * digest_name = py_digest_name (md );
1826
1848
if (digest_name == NULL ) {
1827
1849
return NULL ;
1828
1850
}
@@ -1978,7 +2000,7 @@ _hashlib_get_fips_mode_impl(PyObject *module)
1978
2000
// But 0 is also a valid result value.
1979
2001
unsigned long errcode = ERR_peek_last_error ();
1980
2002
if (errcode ) {
1981
- _setException (PyExc_ValueError , NULL );
2003
+ ( void ) _setException (PyExc_ValueError , NULL );
1982
2004
return -1 ;
1983
2005
}
1984
2006
}
0 commit comments