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:
2026-08-06 17:01:30 +03:00
committed by andrey
parent 3e72f4e533
commit 4d9cd20ac5
+6 -5
View File
@@ -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]);