diff --git a/src/core/inf.c b/src/core/inf.c index 85c57a7..b7cfff3 100644 --- a/src/core/inf.c +++ b/src/core/inf.c @@ -337,9 +337,19 @@ static int check_logged_in(struct hub_info* hub, struct hub_user* user, struct a { if (lookup1 == lookup2) { - LOG_DEBUG("check_logged_in: exact same user is logged in: %s", user->id.nick); - hub_disconnect_user(hub, lookup1, quit_ghost_timeout); - return 0; + if (user_flag_get(lookup1, flag_choke)) + { + LOG_DEBUG("check_logged_in: exact same user is already logged in, but likely ghost: %s", user->id.nick); + + // Old user unable to swallow data. + // Disconnect the existing user, and allow new user to enter. + hub_disconnect_user(hub, lookup1, quit_ghost_timeout); + } + else + { + LOG_DEBUG("check_logged_in: exact same user is already logged in: %s", user->id.nick); + return status_msg_inf_error_cid_taken; + } } else { diff --git a/src/core/route.c b/src/core/route.c index 0ff8998..4a52bb1 100644 --- a/src/core/route.c +++ b/src/core/route.c @@ -82,16 +82,19 @@ static int check_send_queue(struct hub_info* hub, struct hub_user* user, struct if ((user->send_queue->size + msg->length) > get_max_send_queue(hub)) { + user_flag_set(user, flag_choke); LOG_WARN("send queue overflowed, message discarded."); return -1; } if (user->send_queue->size > get_max_send_queue_soft(hub)) { + user_flag_set(user, flag_choke); LOG_WARN("send queue soft overflowed."); return 0; } + user_flag_unset(user, flag_choke); return 1; }