summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2022-02-10 08:26:11 +0100
committerPino Toscano <toscano.pino@tiscali.it>2022-02-11 15:36:02 +0100
commit7c54988b1b3b9eb4d2f3650c1ba5ffe97673ca92 (patch)
tree4ece7623f793e4cd2f3dbec66ce935f62f9b215b /src/corelib/io
parent15f7ef26b8d2901ded1edf866dfbc32a9ac6042a (diff)
Avoid a stack buffer when not needed
Allocate a PATH_MAX-sized buffer on stack only in case we are not using realpath(X, null), i.e. on platforms with older POSIX versions, macOS, or Android. This fixes the build on platforms that do not have PATH_MAX (e.g. GNU/Hurd), and it provides a minor optimization on realpath(X, null) platforms. Change-Id: Icd92a1b15ec18c5eef8113408e9610dfac774101 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/io')
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 6e8229daec..fb66d47d38 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -686,7 +686,9 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
Q_UNUSED(data);
return QFileSystemEntry(slowCanonicalized(absoluteName(entry).filePath()));
#else
+# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID) || _POSIX_VERSION < 200801L
char stack_result[PATH_MAX+1];
+# endif
char *resolved_name = nullptr;
# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID)
// On some Android and macOS versions, realpath() will return a path even if
@@ -714,8 +716,10 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;
data.entryFlags |= QFileSystemMetaData::ExistsAttribute;
QString canonicalPath = QDir::cleanPath(QFile::decodeName(resolved_name));
+# if defined(Q_OS_DARWIN) || defined(Q_OS_ANDROID) || _POSIX_VERSION < 200801L
if (resolved_name != stack_result)
free(resolved_name);
+# endif
return QFileSystemEntry(canonicalPath);
} else if (errno == ENOENT || errno == ENOTDIR) { // file doesn't exist
data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute;