GUACAMOLE-1293: Do not re-acquire __users_lock while already held for writing.
Per POSIX spec, the behavior of acquiring a read lock on a rwlock that's already acquired for writing is undefined. From the documentation for pthread_rwlock_rdlock(): "... Results are undefined if the calling thread holds a write lock on rwlock at the time the call is made."
This commit is contained in:
parent
07acce8a76
commit
e3adb97085
@ -302,15 +302,15 @@ int guac_client_add_user(guac_client* client, guac_user* user, int argc, char**
|
|||||||
/* Update owner pointer if user is owner */
|
/* Update owner pointer if user is owner */
|
||||||
if (user->owner)
|
if (user->owner)
|
||||||
client->__owner = user;
|
client->__owner = user;
|
||||||
|
|
||||||
/* Notify owner of user joining connection. */
|
|
||||||
else
|
|
||||||
guac_client_owner_notify_join(client, user);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_rwlock_unlock(&(client->__users_lock));
|
pthread_rwlock_unlock(&(client->__users_lock));
|
||||||
|
|
||||||
|
/* Notify owner of user joining connection. */
|
||||||
|
if (retval == 0 && !user->owner)
|
||||||
|
guac_client_owner_notify_join(client, user);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -335,12 +335,12 @@ void guac_client_remove_user(guac_client* client, guac_user* user) {
|
|||||||
if (user->owner)
|
if (user->owner)
|
||||||
client->__owner = NULL;
|
client->__owner = NULL;
|
||||||
|
|
||||||
/* Update owner of user having left the connection. */
|
|
||||||
else
|
|
||||||
guac_client_owner_notify_leave(client, user);
|
|
||||||
|
|
||||||
pthread_rwlock_unlock(&(client->__users_lock));
|
pthread_rwlock_unlock(&(client->__users_lock));
|
||||||
|
|
||||||
|
/* Update owner of user having left the connection. */
|
||||||
|
if (!user->owner)
|
||||||
|
guac_client_owner_notify_leave(client, user);
|
||||||
|
|
||||||
/* Call handler, if defined */
|
/* Call handler, if defined */
|
||||||
if (user->leave_handler)
|
if (user->leave_handler)
|
||||||
user->leave_handler(user);
|
user->leave_handler(user);
|
||||||
|
Loading…
Reference in New Issue
Block a user