SVN commit 1148198 by sengels: restrict process checks to the installation directory also fix bug so that --terminate etc work again M +51 -9 kinit_win.cpp --- trunk/KDE/kdelibs/kinit/kinit_win.cpp #1148197:1148198 @@ -106,6 +106,7 @@ ProcessListEntry *hasProcessInList(const QString &name, K_UID owner=0 ); bool terminateProcess(const QString &name); QList &list() { return processList; } + QList listProcesses(); private: void initProcessList(); void getProcessNameAndID( DWORD processID ); @@ -216,11 +217,36 @@ getProcessNameAndID( aProcesses[i] ); } +QList ProcessList::listProcesses() +{ + // Get the list of process identifiers. + DWORD aProcesses[1024], cbNeeded, cProcesses; + unsigned int i; + + if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) + return QList(); + + // Calculate how many process identifiers were returned. + + cProcesses = cbNeeded / sizeof(DWORD); + + // Print the name and process identifier for each process. + + processList.erase(processList.begin(), processList.end()); + for ( i = 0; i < cProcesses; i++ ) + if( aProcesses[i] != 0 ) + getProcessNameAndID( aProcesses[i] ); + + return processList; +} + + ProcessList::~ProcessList() { ProcessListEntry *ple; - foreach(ple,processList) { + QList l = listProcesses(); + foreach(ple,l) { CloseHandle(ple->handle); delete ple; } @@ -237,7 +263,17 @@ qDebug() << "negative pid!"; continue; } - if (ple->name == name || ple->name == name + ".exe") { + + if (ple->name != name && ple->name != name + ".exe") { + continue; + } + + if (!ple->path.isEmpty() && !ple->path.toLower().startsWith(KStandardDirs::installPath("kdedir").toLower())) { + // process is outside of installation directory + qDebug() << "path of the process" << name << "seems to be outside of the installPath:" << ple->path << KStandardDirs::installPath("kdedir"); + continue; + } + if(owner) { // owner is set @@ -250,7 +286,6 @@ if(EqualSid(user.uid(), ple->owner)) return ple; } } - } return NULL; } @@ -259,13 +294,18 @@ */ bool ProcessList::terminateProcess(const QString &name) { + qDebug() << "going to terminate process" << name; ProcessListEntry *p = hasProcessInList(name); - if (!p) + if (!p) { + qDebug() << "could not find ProcessListEntry for process name" << name; return false; + } bool ret = TerminateProcess(p->handle,0); if (ret) { CloseHandle(p->handle); + int i = processList.indexOf(p); + if(i != -1) processList.removeAt(i); delete p; return true; } else { @@ -292,7 +332,7 @@ } else { if (verbose) - fprintf(stderr, "kdeinit4: could not launch %s, exiting",qPrintable(cmd)); + fprintf(stderr, "kdeinit4: could not launch %s, exiting\n",qPrintable(cmd)); } return pid; } @@ -321,10 +361,11 @@ { ProcessListEntry *ple; QString installPrefix = KStandardDirs::installPath("kdedir"); + QList l = processList.listProcesses(); - foreach(ple,processList.list()) + foreach(ple,l) { - if (ple->path.toLower().startsWith(installPrefix.toLower())) + if (!ple->path.isEmpty() && ple->path.toLower().startsWith(installPrefix.toLower())) fprintf(stderr,"path: %s name: %s pid: %u\n", ple->path.toLatin1().data(), ple->name.toLatin1().data(), ple->pid); } } @@ -333,10 +374,11 @@ { ProcessListEntry *ple; QString installPrefix = KStandardDirs::installPath("kdedir"); + QList l = processList.listProcesses(); - foreach(ple,processList.list()) + foreach(ple,l) { - if (ple->path.toLower().startsWith(installPrefix.toLower())) + if (!ple->path.isEmpty() && ple->path.toLower().startsWith(installPrefix.toLower())) { if (verbose) fprintf(stderr,"terminating path: %s name: %s pid: %u\n", ple->path.toLatin1().data(), ple->name.toLatin1().data(), ple->pid);