DevHeads.net

KConfigIniBackend::isWritable bug

Hi,

I'm trying to get kdelibs unit tests to run in a clean and headless
environment (for automated testing). I'm starting an X server, dbus, and
kdeinit by hand.

Currently kded (started by kdeinit) is failing to start up if I'm running it
for the first time and there is currently no ~/.kde directory.
Specifically, it's showing a kdialog popup with 'Configuration file
"/var/lib/buildbot/.kde/share/config/kdedrc" not writable.'. (I don't even
see the popup because it's on the invisible Xvfb server).

After some code-reading and debugging, I found the cause. kded checks if
~/.kde/share/config/kdedrc is writable via KConfigIniBackend::isWritable().
This function first checks if the file itself is writable using access()
(well, KStandardDirs::checkAccess). Then there is this code:

// The check might have failed because any of the containing dirs
// did not exist. If the file does not exist, check if the deepest
// existing dir is writable.
if (!QFileInfo(filePath()).exists()) {
QDir dir = QFileInfo(filePath()).absolutePath();
while (!dir.exists()) {
if (!dir.cdUp()) {
return false;
}
}
return QFileInfo(dir.absolutePath()).isWritable();
}

This code will never succeed for more than one level of directories:
QDir::cdUp() requires an existing and readable parent directory! So it would
only work in this case if ~/.kde/share already exists.

What's the cleanest way to rewrite it? dir=dir.filePath("..")?