@@ -15582,6 +15582,7 @@ typedef struct {
15582
15582
ino_t d_ino ;
15583
15583
int dir_fd ;
15584
15584
#endif
15585
+ PyMutex mutex ;
15585
15586
} DirEntry ;
15586
15587
15587
15588
#define DirEntry_CAST (op ) ((DirEntry *)(op))
@@ -15591,10 +15592,12 @@ DirEntry_dealloc(PyObject *op)
15591
15592
{
15592
15593
DirEntry * entry = DirEntry_CAST (op );
15593
15594
PyTypeObject * tp = Py_TYPE (entry );
15595
+ PyMutex_Lock (& entry -> mutex );
15594
15596
Py_XDECREF (entry -> name );
15595
15597
Py_XDECREF (entry -> path );
15596
15598
Py_XDECREF (entry -> stat );
15597
15599
Py_XDECREF (entry -> lstat );
15600
+ PyMutex_Unlock (& entry -> mutex );
15598
15601
freefunc free_func = PyType_GetSlot (tp , Py_tp_free );
15599
15602
free_func (entry );
15600
15603
Py_DECREF (tp );
@@ -15712,6 +15715,7 @@ DirEntry_fetch_stat(PyObject *module, DirEntry *self, int follow_symlinks)
15712
15715
static PyObject *
15713
15716
DirEntry_get_lstat (PyTypeObject * defining_class , DirEntry * self )
15714
15717
{
15718
+ /* Must be called with self->mutex held */
15715
15719
if (!self -> lstat ) {
15716
15720
PyObject * module = PyType_GetModule (defining_class );
15717
15721
#ifdef MS_WINDOWS
@@ -15739,12 +15743,17 @@ os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class,
15739
15743
/*[clinic end generated code: output=23f803e19c3e780e input=e816273c4e67ee98]*/
15740
15744
{
15741
15745
if (!follow_symlinks ) {
15742
- return DirEntry_get_lstat (defining_class , self );
15746
+ PyMutex_Lock (& self -> mutex );
15747
+ PyObject * stat = DirEntry_get_lstat (defining_class , self );
15748
+ PyMutex_Unlock (& self -> mutex );
15749
+ return stat ;
15743
15750
}
15744
15751
15752
+ PyMutex_Lock (& self -> mutex );
15745
15753
if (!self -> stat ) {
15746
15754
int result = os_DirEntry_is_symlink_impl (self , defining_class );
15747
15755
if (result == -1 ) {
15756
+ PyMutex_Unlock (& self -> mutex );
15748
15757
return NULL ;
15749
15758
}
15750
15759
if (result ) {
@@ -15755,6 +15764,7 @@ os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class,
15755
15764
self -> stat = DirEntry_get_lstat (defining_class , self );
15756
15765
}
15757
15766
}
15767
+ PyMutex_Unlock (& self -> mutex );
15758
15768
15759
15769
return Py_XNewRef (self -> stat );
15760
15770
}
@@ -16029,6 +16039,7 @@ DirEntry_from_find_data(PyObject *module, path_t *path, WIN32_FIND_DATAW *dataW)
16029
16039
entry -> stat = NULL ;
16030
16040
entry -> lstat = NULL ;
16031
16041
entry -> got_file_index = 0 ;
16042
+ entry -> mutex = (PyMutex ){0 };
16032
16043
16033
16044
entry -> name = PyUnicode_FromWideChar (dataW -> cFileName , -1 );
16034
16045
if (!entry -> name )
@@ -16121,6 +16132,7 @@ DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name,
16121
16132
entry -> path = NULL ;
16122
16133
entry -> stat = NULL ;
16123
16134
entry -> lstat = NULL ;
16135
+ entry -> mutex = (PyMutex ){0 };
16124
16136
16125
16137
if (path -> fd != -1 ) {
16126
16138
entry -> dir_fd = path -> fd ;
0 commit comments