X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/f66f0baa67e8b1939fc4ff730a594501ad271101..4d5a902f0888f36c21597874373bc3fcd8ef9862:/ircd/client.c?ds=sidebyside diff --git a/ircd/client.c b/ircd/client.c index bd6982d0..9ec5c6cc 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -23,17 +23,16 @@ * USA */ #include "stdinc.h" -#include "config.h" +#include "defaults.h" #include "client.h" #include "class.h" -#include "common.h" #include "hash.h" #include "match.h" #include "ircd.h" #include "numeric.h" #include "packet.h" -#include "s_auth.h" +#include "authproc.h" #include "s_conf.h" #include "s_newconf.h" #include "logger.h" @@ -48,11 +47,11 @@ #include "hook.h" #include "msg.h" #include "monitor.h" -#include "blacklist.h" #include "reject.h" #include "scache.h" #include "rb_dictionary.h" #include "sslproc.h" +#include "wsproc.h" #include "s_assert.h" #define DEBUG_EXITED_CLIENTS @@ -77,9 +76,9 @@ static rb_bh *pclient_heap = NULL; static rb_bh *user_heap = NULL; static rb_bh *away_heap = NULL; static char current_uid[IDLEN]; -static int32_t current_connid = 0; +static uint32_t current_connid = 0; -struct Dictionary *nd_dict = NULL; +rb_dictionary *nd_dict = NULL; enum { @@ -130,6 +129,80 @@ init_client(void) nd_dict = rb_dictionary_create("nickdelay", irccmp); } +/* + * connid_get - allocate a connid + * + * inputs - none + * outputs - a connid token which is used to represent a logical circuit + * side effects - current_connid is incremented, possibly multiple times. + * the association of the connid to it's client is committed. + */ +uint32_t +connid_get(struct Client *client_p) +{ + s_assert(MyConnect(client_p)); + if (!MyConnect(client_p)) + return 0; + + /* find a connid that is available */ + while (find_cli_connid_hash(++current_connid) != NULL) + { + /* handle wraparound, current_connid must NEVER be 0 */ + if (current_connid == 0) + ++current_connid; + } + + add_to_cli_connid_hash(client_p, current_connid); + rb_dlinkAddAlloc(RB_UINT_TO_POINTER(current_connid), &client_p->localClient->connids); + + return current_connid; +} + +/* + * connid_put - free a connid + * + * inputs - connid to free + * outputs - nothing + * side effects - connid bookkeeping structures are freed + */ +void +connid_put(uint32_t id) +{ + struct Client *client_p; + + s_assert(id != 0); + if (id == 0) + return; + + client_p = find_cli_connid_hash(id); + if (client_p == NULL) + return; + + del_from_cli_connid_hash(id); + rb_dlinkFindDestroy(RB_UINT_TO_POINTER(id), &client_p->localClient->connids); +} + +/* + * client_release_connids - release any connids still attached to a client + * + * inputs - client to garbage collect + * outputs - none + * side effects - client's connids are garbage collected + */ +void +client_release_connids(struct Client *client_p) +{ + rb_dlink_node *ptr, *ptr2; + + if (client_p->localClient->connids.head) + s_assert(MyConnect(client_p)); + + if (!MyConnect(client_p)) + return; + + RB_DLINK_FOREACH_SAFE(ptr, ptr2, client_p->localClient->connids.head) + connid_put(RB_POINTER_TO_UINT(ptr->data)); +} /* * make_client - create a new Client struct and set it to initial state. @@ -161,17 +234,6 @@ make_client(struct Client *from) client_p->localClient->F = NULL; - if(current_connid+1 == 0) - current_connid++; - - client_p->localClient->connid = ++current_connid; - - if(current_connid+1 == 0) - current_connid++; - - client_p->localClient->zconnid = ++current_connid; - add_to_cli_connid_hash(client_p); - client_p->preClient = rb_bh_alloc(pclient_heap); /* as good a place as any... */ @@ -185,7 +247,7 @@ make_client(struct Client *from) } SetUnknown(client_p); - strcpy(client_p->username, "unknown"); + rb_strlcpy(client_p->username, "unknown", sizeof(client_p->username)); return client_p; } @@ -193,17 +255,15 @@ make_client(struct Client *from) void free_pre_client(struct Client *client_p) { - struct Blacklist *blptr; - s_assert(NULL != client_p); if(client_p->preClient == NULL) return; - blptr = client_p->preClient->dnsbl_listed; - if (blptr != NULL) - unref_blacklist(blptr); - s_assert(rb_dlink_list_length(&client_p->preClient->dnsbl_queries) == 0); + s_assert(client_p->preClient->auth.cid == 0); + + rb_free(client_p->preClient->auth.data); + rb_free(client_p->preClient->auth.reason); rb_bh_free(pclient_heap, client_p->preClient); client_p->preClient = NULL; @@ -230,7 +290,7 @@ free_local_client(struct Client *client_p) client_p->localClient->listener = 0; } - del_from_cli_connid_hash(client_p); + client_release_connids(client_p); if(client_p->localClient->F != NULL) { rb_close(client_p->localClient->F); @@ -251,11 +311,14 @@ free_local_client(struct Client *client_p) if (client_p->localClient->privset) privilegeset_unref(client_p->localClient->privset); - if(IsSSL(client_p)) - ssld_decrement_clicount(client_p->localClient->ssl_ctl); + if (IsSSL(client_p)) + ssld_decrement_clicount(client_p->localClient->ssl_ctl); - if(IsCapable(client_p, CAP_ZIP)) - ssld_decrement_clicount(client_p->localClient->z_ctl); + if (IsCapable(client_p, CAP_ZIP)) + ssld_decrement_clicount(client_p->localClient->z_ctl); + + if (client_p->localClient->ws_ctl != NULL) + wsockd_decrement_clicount(client_p->localClient->ws_ctl); rb_bh_free(lclient_heap, client_p->localClient); client_p->localClient = NULL; @@ -394,9 +457,8 @@ check_unknowns_list(rb_dlink_list * list) if(IsDead(client_p) || IsClosing(client_p)) continue; - /* still has DNSbls to validate against */ - if(client_p->preClient != NULL && - rb_dlink_list_length(&client_p->preClient->dnsbl_queries) > 0) + /* Still querying with authd */ + if(client_p->preClient != NULL && client_p->preClient->auth.cid != 0) continue; /* @@ -542,7 +604,7 @@ check_dlines(void) if(IsMe(client_p)) continue; - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, GET_SS_FAMILY(&client_p->localClient->ip))) != NULL) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -561,7 +623,7 @@ check_dlines(void) { client_p = ptr->data; - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, GET_SS_FAMILY(&client_p->localClient->ip))) != NULL) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -1017,9 +1079,9 @@ free_exited_clients(void *unused) { s_assert(0); sendto_realops_snomask(SNO_GENERAL, L_ALL, - "On abort_list: %s stat: %u flags: %u/%u handler: %c", + "On abort_list: %s stat: %u flags: %llu handler: %c", target_p->name, (unsigned int) target_p->status, - target_p->flags, target_p->flags2, target_p->handler); + (unsigned long long)target_p->flags, target_p->handler); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Please report this to the charybdis developers!"); found++; @@ -1161,9 +1223,9 @@ exit_aborted_clients(void *unused) { s_assert(0); sendto_realops_snomask(SNO_GENERAL, L_ALL, - "On dead_list: %s stat: %u flags: %u/%u handler: %c", + "On dead_list: %s stat: %u flags: %llu handler: %c", abt->client->name, (unsigned int) abt->client->status, - abt->client->flags, abt->client->flags2, abt->client->handler); + (unsigned long long)abt->client->flags, abt->client->handler); sendto_realops_snomask(SNO_GENERAL, L_ALL, "Please report this to the charybdis developers!"); continue; @@ -1292,11 +1354,18 @@ exit_remote_client(struct Client *client_p, struct Client *source_p, struct Clie */ static int -exit_unknown_client(struct Client *client_p, struct Client *source_p, struct Client *from, - const char *comment) +exit_unknown_client(struct Client *client_p, /* The local client originating the + * exit or NULL, if this exit is + * generated by this server for + * internal reasons. + * This will not get any of the + * generated messages. */ + struct Client *source_p, /* Client exiting */ + struct Client *from, /* Client firing off this Exit, + * never NULL! */ + const char *comment) { - delete_auth_queries(source_p); - abort_blacklist_queries(source_p); + authd_abort_client(source_p); rb_dlinkDelete(&source_p->localClient->tnode, &unknown_list); if(!IsIOError(source_p)) @@ -1802,15 +1871,15 @@ free_user(struct User *user, struct Client *client_p) if(user->refcnt < 0 || user->invited.head || user->channel.head) { sendto_realops_snomask(SNO_GENERAL, L_ALL, - "* %#lx user (%s!%s@%s) %#lx %#lx %#lx %lu %d *", - (unsigned long) client_p, + "* %p user (%s!%s@%s) %p %p %p %lu %d *", + client_p, client_p ? client_p-> name : "", client_p->username, client_p->host, - (unsigned long) user, - (unsigned long) user->invited.head, - (unsigned long) user->channel.head, + user, + user->invited.head, + user->channel.head, rb_dlink_list_length(&user->channel), user->refcnt); s_assert(!user->refcnt); @@ -1950,7 +2019,7 @@ close_connection(struct Client *client_p) else ServerStats.is_ni++; - del_from_cli_connid_hash(client_p); + client_release_connids(client_p); if(client_p->localClient->F != NULL) {