We have a couple of cases where libSM enters a seemingly infinite loop
when trying to send a RegisterClient message to the SM.
 - http://bugs.sugarlabs.org/ticket/1624
 - http://dev.laptop.org/ticket/12210

In these cases, the SM rejects registration requests because the session is
shutting down.

However, libSM currently has logic to retry with a NULL previous ID if
the SM rejects a registration - and this behaviour will loop. Avoid this
infinite loop by only retrying with a NULL previous ID when the previous
attempt used a non-NULL ID.

Signed-off-by: Daniel Drake <d...@laptop.org>
---
 src/sm_client.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/sm_client.c b/src/sm_client.c
index 23d8e32..6908008 100644
--- a/src/sm_client.c
+++ b/src/sm_client.c
@@ -255,8 +255,23 @@ SmcOpenConnection(char *networkIdsList, SmPointer context,
            {
                /*
                 * Could not register the client because the previous ID
-                * was bad.  So now we register the client with the
-                * previous ID set to NULL.
+                * was bad. If we were trying NULL, return failure.
+                */
+               if (strlen (previousId) == 0) {
+                   if (errorStringRet && errorLength > 0) {
+                       strncpy (errorStringRet, "SM rejected new registration",
+                                errorLength);
+                       errorStringRet[errorLength - 1] = '\0';
+                   }
+
+                   free (smcConn->vendor);
+                   free (smcConn->release);
+                   free (smcConn);
+                   return NULL;
+               }
+
+               /*
+                * Now we register the client with the previous ID set to NULL.
                 */
 
                extra = ARRAY8_BYTES (0);
@@ -265,7 +280,8 @@ SmcOpenConnection(char *networkIdsList, SmPointer context,
                    SIZEOF (smRegisterClientMsg), WORD64COUNT (extra),
                    smRegisterClientMsg, pMsg, pData);
 
-               STORE_ARRAY8 (pData, 0, "");
+               previousId = "";
+               STORE_ARRAY8 (pData, 0, previousId);
 
                IceFlush (iceConn);
 
-- 
1.7.11.7

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to