diff --git a/src/corelib/io/qstandardpaths_unix.cpp b/src/corelib/io/qstandardpaths_unix.cpp
index 5f4955c53f..ba351acf77 100644
--- a/src/corelib/io/qstandardpaths_unix.cpp
+++ b/src/corelib/io/qstandardpaths_unix.cpp
@@ -142,58 +142,53 @@ QString QStandardPaths::writableLocation(StandardLocation type)
     }
     case RuntimeLocation:
     {
-        // http://standards.freedesktop.org/basedir-spec/latest/
         const uint myUid = uint(geteuid());
-        // since the current user is the owner, set both xxxUser and xxxOwner
-        const QFile::Permissions wantedPerms = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser
-                                               | QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner;
+        // http://standards.freedesktop.org/basedir-spec/latest/
         QFileInfo fileInfo;
         QString xdgRuntimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR"));
         if (xdgRuntimeDir.isEmpty()) {
             const QString userName = QFileSystemEngine::resolveUserName(myUid);
             xdgRuntimeDir = QDir::tempPath() + QLatin1String("/runtime-") + userName;
             fileInfo.setFile(xdgRuntimeDir);
+            if (!fileInfo.isDir()) {
+                if (!QDir().mkdir(xdgRuntimeDir)) {
+                    qWarning("QStandardPaths: error creating runtime directory %s: %s", qPrintable(xdgRuntimeDir), qPrintable(qt_error_string(errno)));
+                    return QString();
+                }
+            }
 #ifndef Q_OS_WASM
             qWarning("QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '%ls'", qUtf16Printable(xdgRuntimeDir));
 #endif
         } else {
             fileInfo.setFile(xdgRuntimeDir);
-        }
-        if (fileInfo.exists()) {
+            if (!fileInfo.exists()) {
+                qWarning("QStandardPaths: XDG_RUNTIME_DIR points to non-existing path '%s', "
+                         "please create it with 0700 permissions.", qPrintable(xdgRuntimeDir));
+                return QString();
+            }
             if (!fileInfo.isDir()) {
                 qWarning("QStandardPaths: XDG_RUNTIME_DIR points to '%ls' which is not a directory",
                          qUtf16Printable(xdgRuntimeDir));
                 return QString();
             }
-        } else {
-            QFileSystemEntry entry(xdgRuntimeDir);
-            if (!QFileSystemEngine::createDirectory(entry, false)) {
-                if (errno != EEXIST) {
-                    qErrnoWarning("QStandardPaths: error creating runtime directory %ls",
-                                  qUtf16Printable(xdgRuntimeDir));
-                    return QString();
-                }
-            } else {
-                QSystemError error;
-                if (!QFileSystemEngine::setPermissions(entry, wantedPerms, error)) {
-                    qWarning("QStandardPaths: could not set correct permissions on runtime directory %ls: %ls",
-                             qUtf16Printable(xdgRuntimeDir), qUtf16Printable(error.toString()));
-                    return QString();
-                }
-            }
         }
         // "The directory MUST be owned by the user"
         if (fileInfo.ownerId() != myUid) {
-            qWarning("QStandardPaths: wrong ownership on runtime directory %ls, %d instead of %d",
-                     qUtf16Printable(xdgRuntimeDir),
+            qWarning("QStandardPaths: wrong ownership on runtime directory %s, %d instead of %d", qPrintable(xdgRuntimeDir),
                      fileInfo.ownerId(), myUid);
             return QString();
         }
         // "and he MUST be the only one having read and write access to it. Its Unix access mode MUST be 0700."
+        // since the current user is the owner, set both xxxUser and xxxOwner
+        const QFile::Permissions wantedPerms = QFile::ReadUser | QFile::WriteUser | QFile::ExeUser
+                                               | QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner;
         if (fileInfo.permissions() != wantedPerms) {
-            qWarning("QStandardPaths: wrong permissions on runtime directory %ls, %x instead of %x",
-                     qUtf16Printable(xdgRuntimeDir), uint(fileInfo.permissions()), uint(wantedPerms));
-            return QString();
+            QFile file(xdgRuntimeDir);
+            if (!file.setPermissions(wantedPerms)) {
+                qWarning("QStandardPaths: could not set correct permissions on runtime directory %s: %s",
+                         qPrintable(xdgRuntimeDir), qPrintable(file.errorString()));
+                return QString();
+            }
         }
 
         return xdgRuntimeDir;
