on xenial help sign in
Cancel open PAM interactions on shutdown - fixes hang on logout on desktop Fixes: 1353041
13e6d69Gerry Boland
tests/mocks/LightDM/demo/GreeterPrivate.cpp+18−8
@@ -59,16 +59,15 @@ public:
59 this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
59 this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
60 }
60 }
61
61
62+ ~GreeterImpl()
63+ {
64+ cancelPam();
65+ }
66+
62 void start(QString username)
67 void start(QString username)
63 {
68 {
64− // Clear out any existing PAM interactions first (we can't simply
69+ // Clear out any existing PAM interactions first
65− // cancel our QFuture because QtConcurrent::run doesn't support cancel)
70+ cancelPam();
66− if (pamHandle != NULL) {
67− pam_handle *handle = pamHandle;
68− pamHandle = NULL; // to disable normal finishPam() handling
69− while (respond(QString())); // clear our local queue of QFutures
70− pam_end(handle, PAM_CONV_ERR);
71− }
72
71
73 AppData *appData = new AppData();
72 AppData *appData = new AppData();
74 appData->impl = this;
73 appData->impl = this;
@@ -241,6 +240,17 @@ private Q_SLOTS:
241 }
240 }
242
241
243private:
242private:
243+ void cancelPam()
244+ {
245+ // Unfortunately we can't simply cancel our QFuture because QtConcurrent::run doesn't support cancel
246+ if (pamHandle != NULL) {
247+ pam_handle *handle = pamHandle;
248+ pamHandle = NULL; // to disable normal finishPam() handling
249+ while (respond(QString())); // clear our local queue of QFutures
250+ pam_end(handle, PAM_CONV_ERR);
251+ }
252+ }
253+
244 Greeter *greeter;
254 Greeter *greeter;
245 GreeterPrivate *greeterPrivate;
255 GreeterPrivate *greeterPrivate;
246 pam_handle* pamHandle;
256 pam_handle* pamHandle;