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