@@ -4230,30 +4230,43 @@ static PyObject *
4230
4230
os_listdrives_impl (PyObject * module )
4231
4231
/*[clinic end generated code: output=aaece9dacdf682b5 input=1af9ccc9e583798e]*/
4232
4232
{
4233
- DWORD buflen = 64 ;
4234
4233
wchar_t defaultBuffer [64 ];
4234
+ int success = 0 ;
4235
+ DWORD buflen = Py_ARRAY_LENGTH (defaultBuffer );
4235
4236
LPWSTR buffer = defaultBuffer ;
4236
4237
if (PySys_Audit ("os.listdrives" , NULL ) < 0 ) {
4237
4238
return NULL ;
4238
4239
}
4239
- Py_BEGIN_ALLOW_THREADS ;
4240
- buflen = GetLogicalDriveStringsW (buflen , buffer );
4241
- if (buflen >= Py_ARRAY_LENGTH (defaultBuffer )) {
4242
- Py_BLOCK_THREADS ;
4243
- buffer = (wchar_t * )PyMem_Malloc (sizeof (wchar_t ) * (buflen + 1 ));
4244
- Py_UNBLOCK_THREADS ;
4245
- if (buffer ) {
4246
- buflen = GetLogicalDriveStringsW (buflen , buffer );
4240
+ while (1 ) {
4241
+ DWORD requiredlen ;
4242
+ Py_BEGIN_ALLOW_THREADS ;
4243
+ requiredlen = GetLogicalDriveStringsW (buflen , buffer );
4244
+ Py_END_ALLOW_THREADS ;
4245
+ if (!requiredlen ) {
4246
+ PyErr_SetFromWindowsErr (0 );
4247
+ break ;
4248
+ } else if (requiredlen >= buflen ) {
4249
+ buflen = requiredlen ;
4250
+ if (buffer != defaultBuffer ) {
4251
+ PyMem_Free ((void * )buffer );
4252
+ }
4253
+ buffer = (wchar_t * )PyMem_Malloc (sizeof (wchar_t ) * (buflen + 1 ));
4254
+ if (!buffer ) {
4255
+ PyErr_NoMemory ();
4256
+ break ;
4257
+ }
4258
+ } else {
4259
+ success = 1 ;
4260
+ buflen = requiredlen ;
4261
+ break ;
4247
4262
}
4248
4263
}
4249
- Py_END_ALLOW_THREADS ;
4250
-
4251
4264
4252
4265
PyObject * str = NULL ;
4253
4266
PyObject * nullchar = NULL ;
4254
4267
PyObject * r = NULL ;
4255
4268
4256
- if (!buffer ) {
4269
+ if (!success || ! buffer ) {
4257
4270
goto exit ;
4258
4271
}
4259
4272
@@ -4292,7 +4305,7 @@ os_listvolumes_impl(PyObject *module)
4292
4305
{
4293
4306
PyObject * result = PyList_New (0 );
4294
4307
HANDLE find = INVALID_HANDLE_VALUE ;
4295
- wchar_t buffer [256 ];
4308
+ wchar_t buffer [MAX_PATH + 1 ];
4296
4309
if (!result ) {
4297
4310
return NULL ;
4298
4311
}
@@ -4303,7 +4316,7 @@ os_listvolumes_impl(PyObject *module)
4303
4316
4304
4317
int err = 0 ;
4305
4318
Py_BEGIN_ALLOW_THREADS ;
4306
- find = FindFirstVolumeW (buffer , 256 );
4319
+ find = FindFirstVolumeW (buffer , Py_ARRAY_LENGTH ( buffer ) );
4307
4320
if (find == INVALID_HANDLE_VALUE ) {
4308
4321
err = GetLastError ();
4309
4322
}
@@ -4319,7 +4332,7 @@ os_listvolumes_impl(PyObject *module)
4319
4332
Py_DECREF (s );
4320
4333
4321
4334
Py_BEGIN_ALLOW_THREADS ;
4322
- if (!FindNextVolumeW (find , buffer , 256 )) {
4335
+ if (!FindNextVolumeW (find , buffer , Py_ARRAY_LENGTH ( buffer ) )) {
4323
4336
err = GetLastError ();
4324
4337
}
4325
4338
Py_END_ALLOW_THREADS ;
@@ -4332,9 +4345,8 @@ os_listvolumes_impl(PyObject *module)
4332
4345
}
4333
4346
if (err && err != ERROR_NO_MORE_FILES ) {
4334
4347
PyErr_SetFromWindowsErr (err );
4335
- if (result ) {
4336
- Py_CLEAR (result );
4337
- }
4348
+ Py_XDECREF (result );
4349
+ result = NULL ;
4338
4350
}
4339
4351
return result ;
4340
4352
}
@@ -4355,60 +4367,55 @@ static PyObject *
4355
4367
os_listmounts_impl (PyObject * module , path_t * volume )
4356
4368
/*[clinic end generated code: output=06da49679de4512e input=a8a27178e3f67845]*/
4357
4369
{
4358
- DWORD buflen = 64 ;
4359
- wchar_t defaultBuffer [64 ];
4360
- LPWSTR buffer = defaultBuffer ;
4361
- int err = 0 ;
4370
+ wchar_t default_buffer [MAX_PATH + 1 ];
4371
+ DWORD buflen = Py_ARRAY_LENGTH (default_buffer );
4372
+ LPWSTR buffer = default_buffer ;
4373
+ PyObject * str = NULL ;
4374
+ PyObject * nullchar = NULL ;
4375
+ PyObject * result = NULL ;
4362
4376
if (PySys_Audit ("os.listmounts" , "O" , volume -> object ) < 0 ) {
4363
4377
return NULL ;
4364
4378
}
4365
- Py_BEGIN_ALLOW_THREADS ;
4366
- if (!GetVolumePathNamesForVolumeNameW (volume -> wide , buffer , buflen , & buflen )) {
4367
- err = GetLastError ();
4368
- if (err == ERROR_MORE_DATA ) {
4369
- Py_BLOCK_THREADS ;
4370
- buffer = (wchar_t * )PyMem_Malloc (sizeof (wchar_t ) * buflen );
4371
- Py_UNBLOCK_THREADS ;
4372
- if (buffer ) {
4373
- if (!GetVolumePathNamesForVolumeNameW (volume -> wide , buffer ,
4374
- buflen , & buflen )) {
4375
- err = GetLastError ();
4376
- }
4377
- }
4379
+ while (1 ) {
4380
+ BOOL success ;
4381
+ Py_BEGIN_ALLOW_THREADS
4382
+ success = GetVolumePathNamesForVolumeNameW (volume -> wide , buffer ,
4383
+ buflen , & buflen );
4384
+ Py_END_ALLOW_THREADS
4385
+ if (success ) {
4386
+ break ;
4387
+ }
4388
+ if (GetLastError () != ERROR_MORE_DATA ) {
4389
+ PyErr_SetFromWindowsErr (0 );
4390
+ goto exit ;
4391
+ }
4392
+ if (buffer != default_buffer ) {
4393
+ PyMem_Free ((void * )buffer );
4394
+ }
4395
+ buffer = (wchar_t * )PyMem_Malloc (sizeof (wchar_t ) * buflen );
4396
+ if (!buffer ) {
4397
+ PyErr_NoMemory ();
4398
+ goto exit ;
4378
4399
}
4379
- }
4380
- Py_END_ALLOW_THREADS ;
4381
-
4382
- PyObject * str = NULL ;
4383
- PyObject * nullchar = NULL ;
4384
- PyObject * r = NULL ;
4385
-
4386
- if (err ) {
4387
- PyErr_SetFromWindowsErr (err );
4388
- goto exit ;
4389
- }
4390
- if (!buffer ) {
4391
- goto exit ;
4392
4400
}
4393
4401
if (buflen < 2 ) {
4394
- r = PyList_New (0 );
4402
+ result = PyList_New (0 );
4395
4403
goto exit ;
4396
4404
}
4397
-
4398
- /* buflen includes two null terminators (one for the last string
4399
- and one for the array of strings */
4405
+ // buflen includes two null terminators, one for the last string
4406
+ // and one for the array of strings.
4400
4407
str = PyUnicode_FromWideChar (buffer , buflen - 2 );
4401
4408
nullchar = PyUnicode_FromStringAndSize ("\0" , 1 );
4402
4409
if (str && nullchar ) {
4403
- r = PyUnicode_Split (str , nullchar , buflen );
4410
+ result = PyUnicode_Split (str , nullchar , -1 );
4404
4411
}
4405
4412
exit :
4406
- if (buffer && buffer != defaultBuffer ) {
4407
- PyMem_Free (( void * ) buffer );
4413
+ if (buffer != default_buffer ) {
4414
+ PyMem_Free (buffer );
4408
4415
}
4409
4416
Py_XDECREF (nullchar );
4410
4417
Py_XDECREF (str );
4411
- return r ;
4418
+ return result ;
4412
4419
}
4413
4420
4414
4421
0 commit comments