@@ -1101,39 +1101,39 @@ _hashlib_HASHXOF_digest_impl(HASHobject *self, Py_ssize_t length)
11011101/*[clinic end generated code: output=dcb09335dd2fe908 input=224d047da2c12a42]*/
11021102{
11031103 EVP_MD_CTX * temp_ctx ;
1104- PyObject * retval ;
11051104
11061105 if (length == 0 ) {
11071106 return Py_GetConstant (Py_CONSTANT_EMPTY_BYTES );
11081107 }
11091108
1110- retval = PyBytes_FromStringAndSize ( NULL , length );
1111- if (retval == NULL ) {
1109+ PyBytesWriter * writer = PyBytesWriter_Create ( length );
1110+ if (writer == NULL ) {
11121111 return NULL ;
11131112 }
11141113
11151114 temp_ctx = py_wrapper_EVP_MD_CTX_new ();
11161115 if (temp_ctx == NULL ) {
1117- Py_DECREF (retval );
1116+ PyBytesWriter_Discard (writer );
1117+ PyErr_NoMemory ();
11181118 return NULL ;
11191119 }
11201120
11211121 if (_hashlib_HASH_copy_locked (self , temp_ctx ) < 0 ) {
11221122 goto error ;
11231123 }
11241124 if (!EVP_DigestFinalXOF (temp_ctx ,
1125- (unsigned char * )PyBytes_AS_STRING ( retval ),
1125+ (unsigned char * )PyBytesWriter_GetData ( writer ),
11261126 length ))
11271127 {
11281128 notify_ssl_error_occurred_in (Py_STRINGIFY (EVP_DigestFinalXOF ));
11291129 goto error ;
11301130 }
11311131
11321132 EVP_MD_CTX_free (temp_ctx );
1133- return retval ;
1133+ return PyBytesWriter_Finish ( writer ) ;
11341134
11351135error :
1136- Py_DECREF ( retval );
1136+ PyBytesWriter_Discard ( writer );
11371137 EVP_MD_CTX_free (temp_ctx );
11381138 return NULL ;
11391139}
@@ -1750,7 +1750,6 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
17501750 long maxmem , long dklen )
17511751/*[clinic end generated code: output=d424bc3e8c6b9654 input=bdeac9628d07f7a1]*/
17521752{
1753- PyObject * key = NULL ;
17541753 int retval ;
17551754
17561755 if (password -> len > INT_MAX ) {
@@ -1791,8 +1790,8 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
17911790 return NULL ;
17921791 }
17931792
1794- key = PyBytes_FromStringAndSize ( NULL , dklen );
1795- if (key == NULL ) {
1793+ PyBytesWriter * writer = PyBytesWriter_Create ( dklen );
1794+ if (writer == NULL ) {
17961795 return NULL ;
17971796 }
17981797
@@ -1801,16 +1800,16 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt,
18011800 (const char * )password -> buf , (size_t )password -> len ,
18021801 (const unsigned char * )salt -> buf , (size_t )salt -> len ,
18031802 (uint64_t )n , (uint64_t )r , (uint64_t )p , (uint64_t )maxmem ,
1804- ( unsigned char * ) PyBytes_AS_STRING ( key ), (size_t )dklen
1803+ PyBytesWriter_GetData ( writer ), (size_t )dklen
18051804 );
18061805 Py_END_ALLOW_THREADS
18071806
18081807 if (!retval ) {
1809- Py_DECREF ( key );
1808+ PyBytesWriter_Discard ( writer );
18101809 notify_ssl_error_occurred_in (Py_STRINGIFY (EVP_PBE_scrypt ));
18111810 return NULL ;
18121811 }
1813- return key ;
1812+ return PyBytesWriter_Finish ( writer ) ;
18141813}
18151814
18161815#undef HASHLIB_SCRYPT_MAX_DKLEN
0 commit comments