@@ -829,7 +829,7 @@ static PyObject *
829829audioop_tostereo (PyObject * self , PyObject * args )
830830{
831831 signed char * cp , * ncp ;
832- int len , size , val1 , val2 , val = 0 ;
832+ int len , new_len , size , val1 , val2 , val = 0 ;
833833 double fac1 , fac2 , fval , maxval ;
834834 PyObject * rv ;
835835 int i ;
@@ -846,7 +846,14 @@ audioop_tostereo(PyObject *self, PyObject *args)
846846 return 0 ;
847847 }
848848
849- rv = PyBytes_FromStringAndSize (NULL , len * 2 );
849+ new_len = len * 2 ;
850+ if (new_len < 0 ) {
851+ PyErr_SetString (PyExc_MemoryError ,
852+ "not enough memory for output buffer" );
853+ return 0 ;
854+ }
855+
856+ rv = PyBytes_FromStringAndSize (NULL , new_len );
850857 if ( rv == 0 )
851858 return 0 ;
852859 ncp = (signed char * )PyBytes_AsString (rv );
@@ -1009,7 +1016,7 @@ audioop_lin2lin(PyObject *self, PyObject *args)
10091016{
10101017 signed char * cp ;
10111018 unsigned char * ncp ;
1012- int len , size , size2 , val = 0 ;
1019+ int len , new_len , size , size2 , val = 0 ;
10131020 PyObject * rv ;
10141021 int i , j ;
10151022
@@ -1023,7 +1030,13 @@ audioop_lin2lin(PyObject *self, PyObject *args)
10231030 return 0 ;
10241031 }
10251032
1026- rv = PyBytes_FromStringAndSize (NULL , (len /size )* size2 );
1033+ new_len = (len /size )* size2 ;
1034+ if (new_len < 0 ) {
1035+ PyErr_SetString (PyExc_MemoryError ,
1036+ "not enough memory for output buffer" );
1037+ return 0 ;
1038+ }
1039+ rv = PyBytes_FromStringAndSize (NULL , new_len );
10271040 if ( rv == 0 )
10281041 return 0 ;
10291042 ncp = (unsigned char * )PyBytes_AsString (rv );
@@ -1059,6 +1072,7 @@ audioop_ratecv(PyObject *self, PyObject *args)
10591072 int chan , d , * prev_i , * cur_i , cur_o ;
10601073 PyObject * state , * samps , * str , * rv = NULL ;
10611074 int bytes_per_frame ;
1075+ size_t alloc_size ;
10621076
10631077 weightA = 1 ;
10641078 weightB = 0 ;
@@ -1101,8 +1115,14 @@ audioop_ratecv(PyObject *self, PyObject *args)
11011115 inrate /= d ;
11021116 outrate /= d ;
11031117
1104- prev_i = (int * ) malloc (nchannels * sizeof (int ));
1105- cur_i = (int * ) malloc (nchannels * sizeof (int ));
1118+ alloc_size = sizeof (int ) * (unsigned )nchannels ;
1119+ if (alloc_size < nchannels ) {
1120+ PyErr_SetString (PyExc_MemoryError ,
1121+ "not enough memory for output buffer" );
1122+ return 0 ;
1123+ }
1124+ prev_i = (int * ) malloc (alloc_size );
1125+ cur_i = (int * ) malloc (alloc_size );
11061126 if (prev_i == NULL || cur_i == NULL ) {
11071127 (void ) PyErr_NoMemory ();
11081128 goto exit ;
@@ -1275,7 +1295,7 @@ audioop_ulaw2lin(PyObject *self, PyObject *args)
12751295 unsigned char * cp ;
12761296 unsigned char cval ;
12771297 signed char * ncp ;
1278- int len , size , val ;
1298+ int len , new_len , size , val ;
12791299 PyObject * rv ;
12801300 int i ;
12811301
@@ -1288,12 +1308,18 @@ audioop_ulaw2lin(PyObject *self, PyObject *args)
12881308 return 0 ;
12891309 }
12901310
1291- rv = PyBytes_FromStringAndSize (NULL , len * size );
1311+ new_len = len * size ;
1312+ if (new_len < 0 ) {
1313+ PyErr_SetString (PyExc_MemoryError ,
1314+ "not enough memory for output buffer" );
1315+ return 0 ;
1316+ }
1317+ rv = PyBytes_FromStringAndSize (NULL , new_len );
12921318 if ( rv == 0 )
12931319 return 0 ;
12941320 ncp = (signed char * )PyBytes_AsString (rv );
12951321
1296- for ( i = 0 ; i < len * size ; i += size ) {
1322+ for ( i = 0 ; i < new_len ; i += size ) {
12971323 cval = * cp ++ ;
12981324 val = st_ulaw2linear16 (cval );
12991325
@@ -1343,7 +1369,7 @@ audioop_alaw2lin(PyObject *self, PyObject *args)
13431369 unsigned char * cp ;
13441370 unsigned char cval ;
13451371 signed char * ncp ;
1346- int len , size , val ;
1372+ int len , new_len , size , val ;
13471373 PyObject * rv ;
13481374 int i ;
13491375
@@ -1356,12 +1382,18 @@ audioop_alaw2lin(PyObject *self, PyObject *args)
13561382 return 0 ;
13571383 }
13581384
1359- rv = PyBytes_FromStringAndSize (NULL , len * size );
1385+ new_len = len * size ;
1386+ if (new_len < 0 ) {
1387+ PyErr_SetString (PyExc_MemoryError ,
1388+ "not enough memory for output buffer" );
1389+ return 0 ;
1390+ }
1391+ rv = PyBytes_FromStringAndSize (NULL , new_len );
13601392 if ( rv == 0 )
13611393 return 0 ;
13621394 ncp = (signed char * )PyBytes_AsString (rv );
13631395
1364- for ( i = 0 ; i < len * size ; i += size ) {
1396+ for ( i = 0 ; i < new_len ; i += size ) {
13651397 cval = * cp ++ ;
13661398 val = st_alaw2linear16 (cval );
13671399
@@ -1486,7 +1518,7 @@ audioop_adpcm2lin(PyObject *self, PyObject *args)
14861518{
14871519 signed char * cp ;
14881520 signed char * ncp ;
1489- int len , size , valpred , step , delta , index , sign , vpdiff ;
1521+ int len , new_len , size , valpred , step , delta , index , sign , vpdiff ;
14901522 PyObject * rv , * str , * state ;
14911523 int i , inputbuffer = 0 , bufferstep ;
14921524
@@ -1508,15 +1540,21 @@ audioop_adpcm2lin(PyObject *self, PyObject *args)
15081540 } else if ( !PyArg_ParseTuple (state , "ii" , & valpred , & index ) )
15091541 return 0 ;
15101542
1511- str = PyBytes_FromStringAndSize (NULL , len * size * 2 );
1543+ new_len = len * size * 2 ;
1544+ if (new_len < 0 ) {
1545+ PyErr_SetString (PyExc_MemoryError ,
1546+ "not enough memory for output buffer" );
1547+ return 0 ;
1548+ }
1549+ str = PyBytes_FromStringAndSize (NULL , new_len );
15121550 if ( str == 0 )
15131551 return 0 ;
15141552 ncp = (signed char * )PyBytes_AsString (str );
15151553
15161554 step = stepsizeTable [index ];
15171555 bufferstep = 0 ;
15181556
1519- for ( i = 0 ; i < len * size * 2 ; i += size ) {
1557+ for ( i = 0 ; i < new_len ; i += size ) {
15201558 /* Step 1 - get the delta value and compute next index */
15211559 if ( bufferstep ) {
15221560 delta = inputbuffer & 0xf ;
0 commit comments