fix(PIDir): initialize list pointer and check scandir return
dirent** list was uninitialized, so scandir failure (returning -1) left it with indeterminate value. The unconditional free(list) at the end was then UB — typically heap corruption or crash.
This commit is contained in:
@@ -372,15 +372,16 @@ PIVector<PIFile::FileInfo> PIDir::entries(const PIRegularExpression & regexp) {
|
|||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
dirent ** list;
|
dirent ** list = nullptr;
|
||||||
int cnt = scandir(p.data(),
|
int cnt = scandir(p.data(),
|
||||||
&list,
|
&list,
|
||||||
0,
|
0,
|
||||||
# if defined(MAC_OS) || defined(ANDROID) || defined(BLACKBERRY)
|
# if defined(MAC_OS) || defined(ANDROID) || defined(BLACKBERRY)
|
||||||
alphasort);
|
alphasort);
|
||||||
# else
|
# else
|
||||||
versionsort);
|
versionsort);
|
||||||
# endif
|
# endif
|
||||||
|
if (cnt < 0) return ret;
|
||||||
for (int i = 0; i < cnt; ++i) {
|
for (int i = 0; i < cnt; ++i) {
|
||||||
ret << PIFile::fileInfo(dp + PIString(list[i]->d_name));
|
ret << PIFile::fileInfo(dp + PIString(list[i]->d_name));
|
||||||
free(list[i]);
|
free(list[i]);
|
||||||
|
|||||||
Reference in New Issue
Block a user