@@ -427,7 +427,8 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
427
427
}
428
428
}
429
429
if (digest == NULL ) {
430
- _setException (state -> unsupported_digestmod_error , "unsupported hash type %s" , name );
430
+ (void )_setException (state -> unsupported_digestmod_error ,
431
+ "unsupported hash type %s" , name );
431
432
return NULL ;
432
433
}
433
434
return digest ;
@@ -442,7 +443,6 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
442
443
*/
443
444
static PY_EVP_MD *
444
445
py_digest_by_digestmod (PyObject * module , PyObject * digestmod , enum Py_hash_type py_ht ) {
445
- PY_EVP_MD * evp ;
446
446
PyObject * name_obj = NULL ;
447
447
const char * name ;
448
448
@@ -468,12 +468,7 @@ py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type
468
468
return NULL ;
469
469
}
470
470
471
- evp = py_digest_by_name (module , name , py_ht );
472
- if (evp == NULL ) {
473
- return NULL ;
474
- }
475
-
476
- return evp ;
471
+ return py_digest_by_name (module , name , py_ht );
477
472
}
478
473
479
474
static EVPobject *
@@ -506,7 +501,7 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
506
501
else
507
502
process = Py_SAFE_DOWNCAST (len , Py_ssize_t , unsigned int );
508
503
if (!EVP_DigestUpdate (self -> ctx , (const void * )cp , process )) {
509
- _setException (PyExc_ValueError , NULL );
504
+ ( void ) _setException (PyExc_ValueError , NULL );
510
505
return -1 ;
511
506
}
512
507
len -= process ;
@@ -582,17 +577,20 @@ EVP_digest_impl(EVPobject *self)
582
577
}
583
578
584
579
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
585
- return _setException ( PyExc_ValueError , NULL ) ;
580
+ goto error ;
586
581
}
587
582
digest_size = EVP_MD_CTX_size (temp_ctx );
588
583
if (!EVP_DigestFinal (temp_ctx , digest , NULL )) {
589
- _setException (PyExc_ValueError , NULL );
590
- return NULL ;
584
+ goto error ;
591
585
}
592
586
593
587
retval = PyBytes_FromStringAndSize ((const char * )digest , digest_size );
594
588
EVP_MD_CTX_free (temp_ctx );
595
589
return retval ;
590
+
591
+ error :
592
+ EVP_MD_CTX_free (temp_ctx );
593
+ return _setException (PyExc_ValueError , NULL );
596
594
}
597
595
598
596
/*[clinic input]
@@ -617,17 +615,20 @@ EVP_hexdigest_impl(EVPobject *self)
617
615
618
616
/* Get the raw (binary) digest value */
619
617
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
620
- return _setException ( PyExc_ValueError , NULL ) ;
618
+ goto error ;
621
619
}
622
620
digest_size = EVP_MD_CTX_size (temp_ctx );
623
621
if (!EVP_DigestFinal (temp_ctx , digest , NULL )) {
624
- _setException (PyExc_ValueError , NULL );
625
- return NULL ;
622
+ goto error ;
626
623
}
627
624
628
625
EVP_MD_CTX_free (temp_ctx );
629
626
630
627
return _Py_strhex ((const char * )digest , (Py_ssize_t )digest_size );
628
+
629
+ error :
630
+ EVP_MD_CTX_free (temp_ctx );
631
+ return _setException (PyExc_ValueError , NULL );
631
632
}
632
633
633
634
/*[clinic input]
@@ -695,7 +696,11 @@ EVP_get_digest_size(EVPobject *self, void *closure)
695
696
static PyObject *
696
697
EVP_get_name (EVPobject * self , void * closure )
697
698
{
698
- return py_digest_name (EVP_MD_CTX_md (self -> ctx ));
699
+ const EVP_MD * md = EVP_MD_CTX_md (self -> ctx );
700
+ if (md == NULL ) {
701
+ return _setException (PyExc_ValueError , NULL );
702
+ }
703
+ return py_digest_name (md );
699
704
}
700
705
701
706
static PyGetSetDef EVP_getseters [] = {
@@ -793,21 +798,22 @@ EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length)
793
798
}
794
799
795
800
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
796
- Py_DECREF (retval );
797
- EVP_MD_CTX_free (temp_ctx );
798
- return _setException (PyExc_ValueError , NULL );
801
+ goto error ;
799
802
}
800
803
if (!EVP_DigestFinalXOF (temp_ctx ,
801
804
(unsigned char * )PyBytes_AS_STRING (retval ),
802
- length )) {
803
- Py_DECREF (retval );
804
- EVP_MD_CTX_free (temp_ctx );
805
- _setException (PyExc_ValueError , NULL );
806
- return NULL ;
805
+ length ))
806
+ {
807
+ goto error ;
807
808
}
808
809
809
810
EVP_MD_CTX_free (temp_ctx );
810
811
return retval ;
812
+
813
+ error :
814
+ Py_DECREF (retval );
815
+ EVP_MD_CTX_free (temp_ctx );
816
+ return _setException (PyExc_ValueError , NULL );
811
817
}
812
818
813
819
/*[clinic input]
@@ -841,22 +847,22 @@ EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length)
841
847
842
848
/* Get the raw (binary) digest value */
843
849
if (!locked_EVP_MD_CTX_copy (temp_ctx , self )) {
844
- PyMem_Free (digest );
845
- EVP_MD_CTX_free (temp_ctx );
846
- return _setException (PyExc_ValueError , NULL );
850
+ goto error ;
847
851
}
848
852
if (!EVP_DigestFinalXOF (temp_ctx , digest , length )) {
849
- PyMem_Free (digest );
850
- EVP_MD_CTX_free (temp_ctx );
851
- _setException (PyExc_ValueError , NULL );
852
- return NULL ;
853
+ goto error ;
853
854
}
854
855
855
856
EVP_MD_CTX_free (temp_ctx );
856
857
857
858
retval = _Py_strhex ((const char * )digest , length );
858
859
PyMem_Free (digest );
859
860
return retval ;
861
+
862
+ error :
863
+ PyMem_Free (digest );
864
+ EVP_MD_CTX_free (temp_ctx );
865
+ return _setException (PyExc_ValueError , NULL );
860
866
}
861
867
862
868
static PyMethodDef EVPXOF_methods [] = {
@@ -957,7 +963,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
957
963
958
964
int result = EVP_DigestInit_ex (self -> ctx , digest , NULL );
959
965
if (!result ) {
960
- _setException (PyExc_ValueError , NULL );
966
+ ( void ) _setException (PyExc_ValueError , NULL );
961
967
Py_CLEAR (self );
962
968
goto exit ;
963
969
}
@@ -978,7 +984,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
978
984
}
979
985
}
980
986
981
- exit :
987
+ exit :
982
988
if (data_obj != NULL ) {
983
989
PyBuffer_Release (& view );
984
990
}
@@ -1423,14 +1429,14 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1423
1429
r = PyLong_AsUnsignedLong (r_obj );
1424
1430
if (r == (unsigned long ) -1 && PyErr_Occurred ()) {
1425
1431
PyErr_SetString (PyExc_TypeError ,
1426
- "r is required and must be an unsigned int" );
1432
+ "r is required and must be an unsigned int" );
1427
1433
return NULL ;
1428
1434
}
1429
1435
1430
1436
p = PyLong_AsUnsignedLong (p_obj );
1431
1437
if (p == (unsigned long ) -1 && PyErr_Occurred ()) {
1432
1438
PyErr_SetString (PyExc_TypeError ,
1433
- "p is required and must be an unsigned int" );
1439
+ "p is required and must be an unsigned int" );
1434
1440
return NULL ;
1435
1441
}
1436
1442
@@ -1439,22 +1445,22 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1439
1445
future. The maxmem constant is private to OpenSSL. */
1440
1446
PyErr_Format (PyExc_ValueError ,
1441
1447
"maxmem must be positive and smaller than %d" ,
1442
- INT_MAX );
1448
+ INT_MAX );
1443
1449
return NULL ;
1444
1450
}
1445
1451
1446
1452
if (dklen < 1 || dklen > INT_MAX ) {
1447
1453
PyErr_Format (PyExc_ValueError ,
1448
- "dklen must be greater than 0 and smaller than %d" ,
1449
- INT_MAX );
1454
+ "dklen must be greater than 0 and smaller than %d" ,
1455
+ INT_MAX );
1450
1456
return NULL ;
1451
1457
}
1452
1458
1453
1459
/* let OpenSSL validate the rest */
1454
1460
retval = EVP_PBE_scrypt (NULL , 0 , NULL , 0 , n , r , p , maxmem , NULL , 0 );
1455
1461
if (!retval ) {
1456
- _setException (PyExc_ValueError , "Invalid parameter combination for n, r, p, maxmem." );
1457
- return NULL ;
1462
+ return _setException (PyExc_ValueError ,
1463
+ "Invalid parameter combination for n, r, p, maxmem." ) ;
1458
1464
}
1459
1465
1460
1466
key_obj = PyBytes_FromStringAndSize (NULL , dklen );
@@ -1474,8 +1480,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
1474
1480
1475
1481
if (!retval ) {
1476
1482
Py_CLEAR (key_obj );
1477
- _setException (PyExc_ValueError , NULL );
1478
- return NULL ;
1483
+ return _setException (PyExc_ValueError , NULL );
1479
1484
}
1480
1485
return key_obj ;
1481
1486
}
@@ -1531,8 +1536,7 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
1531
1536
PY_EVP_MD_free (evp );
1532
1537
1533
1538
if (result == NULL ) {
1534
- _setException (PyExc_ValueError , NULL );
1535
- return NULL ;
1539
+ return _setException (PyExc_ValueError , NULL );
1536
1540
}
1537
1541
return PyBytes_FromStringAndSize ((const char * )md , md_len );
1538
1542
}
@@ -1581,14 +1585,15 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1581
1585
1582
1586
ctx = HMAC_CTX_new ();
1583
1587
if (ctx == NULL ) {
1588
+ PY_EVP_MD_free (digest );
1584
1589
PyErr_NoMemory ();
1585
1590
goto error ;
1586
1591
}
1587
1592
1588
1593
r = HMAC_Init_ex (ctx , key -> buf , (int )key -> len , digest , NULL /* impl */ );
1589
1594
PY_EVP_MD_free (digest );
1590
1595
if (r == 0 ) {
1591
- _setException (PyExc_ValueError , NULL );
1596
+ ( void ) _setException (PyExc_ValueError , NULL );
1592
1597
goto error ;
1593
1598
}
1594
1599
@@ -1626,11 +1631,20 @@ locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self)
1626
1631
return result ;
1627
1632
}
1628
1633
1634
+ /* returning 0 means that an error occurred and an exception is set */
1629
1635
static unsigned int
1630
1636
_hmac_digest_size (HMACobject * self )
1631
1637
{
1632
- unsigned int digest_size = EVP_MD_size (HMAC_CTX_get_md (self -> ctx ));
1638
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1639
+ if (md == NULL ) {
1640
+ (void )_setException (PyExc_ValueError , NULL );
1641
+ return 0 ;
1642
+ }
1643
+ unsigned int digest_size = EVP_MD_size (md );
1633
1644
assert (digest_size <= EVP_MAX_MD_SIZE );
1645
+ if (digest_size == 0 ) {
1646
+ (void )_setException (PyExc_ValueError , NULL );
1647
+ }
1634
1648
return digest_size ;
1635
1649
}
1636
1650
@@ -1658,7 +1672,7 @@ _hmac_update(HMACobject *self, PyObject *obj)
1658
1672
PyBuffer_Release (& view );
1659
1673
1660
1674
if (r == 0 ) {
1661
- _setException (PyExc_ValueError , NULL );
1675
+ ( void ) _setException (PyExc_ValueError , NULL );
1662
1676
return 0 ;
1663
1677
}
1664
1678
return 1 ;
@@ -1711,7 +1725,11 @@ _hmac_dealloc(HMACobject *self)
1711
1725
static PyObject *
1712
1726
_hmac_repr (HMACobject * self )
1713
1727
{
1714
- PyObject * digest_name = py_digest_name (HMAC_CTX_get_md (self -> ctx ));
1728
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1729
+ if (md == NULL ) {
1730
+ return _setException (PyExc_ValueError , NULL );
1731
+ }
1732
+ PyObject * digest_name = py_digest_name (md );
1715
1733
if (digest_name == NULL ) {
1716
1734
return NULL ;
1717
1735
}
@@ -1744,18 +1762,18 @@ _hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len)
1744
1762
{
1745
1763
HMAC_CTX * temp_ctx = HMAC_CTX_new ();
1746
1764
if (temp_ctx == NULL ) {
1747
- PyErr_NoMemory ();
1765
+ ( void ) PyErr_NoMemory ();
1748
1766
return 0 ;
1749
1767
}
1750
1768
if (!locked_HMAC_CTX_copy (temp_ctx , self )) {
1751
1769
HMAC_CTX_free (temp_ctx );
1752
- _setException (PyExc_ValueError , NULL );
1770
+ ( void ) _setException (PyExc_ValueError , NULL );
1753
1771
return 0 ;
1754
1772
}
1755
1773
int r = HMAC_Final (temp_ctx , buf , & len );
1756
1774
HMAC_CTX_free (temp_ctx );
1757
1775
if (r == 0 ) {
1758
- _setException (PyExc_ValueError , NULL );
1776
+ ( void ) _setException (PyExc_ValueError , NULL );
1759
1777
return 0 ;
1760
1778
}
1761
1779
return 1 ;
@@ -1773,7 +1791,7 @@ _hashlib_HMAC_digest_impl(HMACobject *self)
1773
1791
unsigned char digest [EVP_MAX_MD_SIZE ];
1774
1792
unsigned int digest_size = _hmac_digest_size (self );
1775
1793
if (digest_size == 0 ) {
1776
- return _setException ( PyExc_ValueError , NULL ) ;
1794
+ return NULL ;
1777
1795
}
1778
1796
int r = _hmac_digest (self , digest , digest_size );
1779
1797
if (r == 0 ) {
@@ -1798,7 +1816,7 @@ _hashlib_HMAC_hexdigest_impl(HMACobject *self)
1798
1816
unsigned char digest [EVP_MAX_MD_SIZE ];
1799
1817
unsigned int digest_size = _hmac_digest_size (self );
1800
1818
if (digest_size == 0 ) {
1801
- return _setException ( PyExc_ValueError , NULL ) ;
1819
+ return NULL ;
1802
1820
}
1803
1821
int r = _hmac_digest (self , digest , digest_size );
1804
1822
if (r == 0 ) {
@@ -1812,7 +1830,7 @@ _hashlib_hmac_get_digest_size(HMACobject *self, void *closure)
1812
1830
{
1813
1831
unsigned int digest_size = _hmac_digest_size (self );
1814
1832
if (digest_size == 0 ) {
1815
- return _setException ( PyExc_ValueError , NULL ) ;
1833
+ return NULL ;
1816
1834
}
1817
1835
return PyLong_FromLong (digest_size );
1818
1836
}
@@ -1830,7 +1848,11 @@ _hashlib_hmac_get_block_size(HMACobject *self, void *closure)
1830
1848
static PyObject *
1831
1849
_hashlib_hmac_get_name (HMACobject * self , void * closure )
1832
1850
{
1833
- PyObject * digest_name = py_digest_name (HMAC_CTX_get_md (self -> ctx ));
1851
+ const EVP_MD * md = HMAC_CTX_get_md (self -> ctx );
1852
+ if (md == NULL ) {
1853
+ return _setException (PyExc_ValueError , NULL );
1854
+ }
1855
+ PyObject * digest_name = py_digest_name (md );
1834
1856
if (digest_name == NULL ) {
1835
1857
return NULL ;
1836
1858
}
@@ -1981,7 +2003,7 @@ _hashlib_get_fips_mode_impl(PyObject *module)
1981
2003
// But 0 is also a valid result value.
1982
2004
unsigned long errcode = ERR_peek_last_error ();
1983
2005
if (errcode ) {
1984
- _setException (PyExc_ValueError , NULL );
2006
+ ( void ) _setException (PyExc_ValueError , NULL );
1985
2007
return -1 ;
1986
2008
}
1987
2009
}
0 commit comments