Fix QFileSystemEngine::canonicalName() returning corrupt data
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>
Mon, 10 Sep 2012 07:54:14 +0000 (09:54 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 10 Sep 2012 12:09:45 +0000 (14:09 +0200)
In case of an error when calling realpath(), the return value buffer
was uninitalized, but still used.
Now the error value is checked to prevent this. Additionally, this fixes
a memory leak in the error case.

In addition, use the modern version of realpath() on QNX, since it is
available there.

Change-Id: I0ac83454679619f379df9c482c958789ab31866a
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
src/corelib/io/qfilesystemengine_unix.cpp

index 21e2987..9e2c69f 100644 (file)
@@ -191,11 +191,16 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry,
         }
     }
 # else
-#  if _POSIX_VERSION >= 200801L
+#  if (_POSIX_VERSION >= 200801L || defined(Q_OS_QNX))
     ret = realpath(entry.nativeFilePath().constData(), (char*)0);
 #  else
     ret = (char*)malloc(PATH_MAX);
-    realpath(entry.nativeFilePath().constData(), (char*)ret);
+    if (realpath(entry.nativeFilePath().constData(), (char*)ret) == 0) {
+        const int savedErrno = errno; // errno is checked below, and free() might change it
+        free(ret);
+        errno = savedErrno;
+        ret = 0;
+    }
 #  endif
 # endif
     if (ret) {