X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/1c1d47e2794c63e97f60cdc028ac3e145152f7db..29c92cf95f9b9e669b08e90d13c8a8ba12369d58:/src/s_serv.c diff --git a/src/s_serv.c b/src/s_serv.c index 7cb1715d..cf0dd391 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -55,6 +55,7 @@ #include "reject.h" #include "sslproc.h" #include "capability.h" +#include "s_assert.h" #ifndef INADDR_NONE #define INADDR_NONE ((unsigned int) 0xffffffff) @@ -126,6 +127,8 @@ init_builtin_capabs(void) CAP_MLOCK = capability_put(serv_capindex, "MLOCK"); capability_require(serv_capindex, "QS"); + capability_require(serv_capindex, "EX"); + capability_require(serv_capindex, "IE"); capability_require(serv_capindex, "ENCAP"); } @@ -491,7 +494,7 @@ burst_ban(struct Client *client_p) * side effects - client is sent a list of +b, +e, or +I modes */ static void -burst_modes_TS6(struct Client *client_p, struct Channel *chptr, +burst_modes_TS6(struct Client *client_p, struct Channel *chptr, rb_dlink_list *list, char flag) { rb_dlink_node *ptr; @@ -545,7 +548,7 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, /* * burst_TS6 - * + * * inputs - client (server) to send nick towards * - client to send nick for * output - NONE @@ -554,7 +557,7 @@ burst_modes_TS6(struct Client *client_p, struct Channel *chptr, static void burst_TS6(struct Client *client_p) { - static char ubuf[12]; + char ubuf[BUFSIZE]; struct Client *target_p; struct Channel *chptr; struct membership *msptr; @@ -575,7 +578,7 @@ burst_TS6(struct Client *client_p) if(!IsPerson(target_p)) continue; - send_umode(NULL, target_p, 0, 0, ubuf); + send_umode(NULL, target_p, 0, ubuf); if(!*ubuf) { ubuf[0] = '+'; @@ -585,7 +588,7 @@ burst_TS6(struct Client *client_p) if(IsCapable(client_p, CAP_EUID)) sendto_one(client_p, ":%s EUID %s %d %ld %s %s %s %s %s %s %s :%s", target_p->servptr->id, target_p->name, - target_p->hopcount + 1, + target_p->hopcount + 1, (long) target_p->tsinfo, ubuf, target_p->username, target_p->host, IsIPSpoof(target_p) ? "0" : target_p->sockhost, @@ -596,7 +599,7 @@ burst_TS6(struct Client *client_p) else sendto_one(client_p, ":%s UID %s %d %ld %s %s %s %s %s :%s", target_p->servptr->id, target_p->name, - target_p->hopcount + 1, + target_p->hopcount + 1, (long) target_p->tsinfo, ubuf, target_p->username, target_p->host, IsIPSpoof(target_p) ? "0" : target_p->sockhost, @@ -656,7 +659,7 @@ burst_TS6(struct Client *client_p) t = buf + mlen; } - rb_sprintf(t, "%s%s ", find_channel_status(msptr, 1), + rb_sprintf(t, "%s%s ", find_channel_status(msptr, 1), use_id(msptr->client_p)); cur_len += tlen; @@ -793,7 +796,7 @@ server_estab(struct Client *client_p) if(IsUnknown(client_p)) { /* the server may be linking based on certificate fingerprint now. --nenolod */ - sendto_one(client_p, "PASS %s TS %d :%s", + sendto_one(client_p, "PASS %s TS %d :%s", EmptyString(server_p->spasswd) ? "*" : server_p->spasswd, TS_CURRENT, me.id); /* pass info to new server */ @@ -850,7 +853,7 @@ server_estab(struct Client *client_p) if((rb_dlink_list_length(&lclient_list) + rb_dlink_list_length(&serv_list)) > (unsigned long)MaxConnectionCount) - MaxConnectionCount = rb_dlink_list_length(&lclient_list) + + MaxConnectionCount = rb_dlink_list_length(&lclient_list) + rb_dlink_list_length(&serv_list); /* Show the real host/IP to admins */ @@ -911,7 +914,7 @@ server_estab(struct Client *client_p) ** there are no NICK's to be cancelled...). Of course, ** if cancellation occurs, all this info is sent anyway, ** and I guess the link dies when a read is attempted...? --msa - ** + ** ** Note: Link cancellation to occur at this point means ** that at least two servers from my fragment are building ** up connection this other fragment at the same time, it's @@ -993,23 +996,23 @@ serv_connect_resolved(struct Client *client_p) if(ServerConfVhosted(server_p)) { - memcpy(&myipnum, &server_p->my_ipnum, sizeof(myipnum)); + memcpy(&myipnum, &server_p->my_ipnum, sizeof(server_p->my_ipnum)); ((struct sockaddr_in *)&myipnum)->sin_port = 0; myipnum.ss_family = server_p->aftype; - + } else if(server_p->aftype == AF_INET && ServerInfo.specific_ipv4_vhost) { - memcpy(&myipnum, &ServerInfo.ip, sizeof(myipnum)); + memcpy(&myipnum, &ServerInfo.ip, sizeof(ServerInfo.ip)); ((struct sockaddr_in *)&myipnum)->sin_port = 0; myipnum.ss_family = AF_INET; SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in)); } - + #ifdef RB_IPV6 else if((server_p->aftype == AF_INET6) && ServerInfo.specific_ipv6_vhost) { - memcpy(&myipnum, &ServerInfo.ip6, sizeof(myipnum)); + memcpy(&myipnum, &ServerInfo.ip6, sizeof(ServerInfo.ip6)); ((struct sockaddr_in6 *)&myipnum)->sin6_port = 0; myipnum.ss_family = AF_INET6; SET_SS_LEN(&myipnum, sizeof(struct sockaddr_in6)); @@ -1027,12 +1030,12 @@ serv_connect_resolved(struct Client *client_p) if(ServerConfSSL(server_p)) { rb_connect_tcp(client_p->localClient->F, (struct sockaddr *)&client_p->localClient->ip, - NULL, 0, serv_connect_ssl_callback, + NULL, 0, serv_connect_ssl_callback, client_p, ConfigFileEntry.connect_timeout); } else rb_connect_tcp(client_p->localClient->F, (struct sockaddr *)&client_p->localClient->ip, - NULL, 0, serv_connect_callback, + NULL, 0, serv_connect_callback, client_p, ConfigFileEntry.connect_timeout); return 1; } @@ -1100,7 +1103,7 @@ serv_connect_dns_callback(void *vptr, struct DNSReply *reply) /* * serv_connect() - initiate a server connection * - * inputs - pointer to conf + * inputs - pointer to conf * - pointer to client doing the connet * output - * side effects - @@ -1190,7 +1193,8 @@ serv_connect(struct server_conf *server_p, struct Client *by) make_server(client_p); if(by && IsPerson(by)) { - strcpy(client_p->serv->by, by->name); + rb_strlcpy(client_p->serv->by, by->name, + sizeof client_p->serv->by); if(client_p->serv->user) free_user(client_p->serv->user, NULL); client_p->serv->user = by->user; @@ -1198,7 +1202,8 @@ serv_connect(struct server_conf *server_p, struct Client *by) } else { - strcpy(client_p->serv->by, "AutoConn."); + rb_strlcpy(client_p->serv->by, "AutoConn.", + sizeof client_p->serv->by); if(client_p->serv->user) free_user(client_p->serv->user, NULL); client_p->serv->user = NULL; @@ -1256,7 +1261,7 @@ serv_connect_ssl_callback(rb_fde_t *F, int status, void *data) ilog_error("rb_socketpair failed for server"); serv_connect_callback(F, RB_ERROR, data); return; - + } del_from_cli_fd_hash(client_p); client_p->localClient->F = xF[0]; @@ -1269,7 +1274,7 @@ serv_connect_ssl_callback(rb_fde_t *F, int status, void *data) /* * serv_connect_callback() - complete a server connection. - * + * * This routine is called after the server connection attempt has * completed. If unsucessful, an error is sent to ops and the client * is closed. If sucessful, it goes through the initialisation/check @@ -1312,7 +1317,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) { sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, "Error connecting to %s[%s]: %s", - client_p->name, + client_p->name, "255.255.255.255", rb_errstr(status)); ilog(L_SERVER, "Error connecting to %s[%s]: %s", @@ -1350,7 +1355,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) SetHandshake(client_p); /* the server may be linking based on certificate fingerprint now. --nenolod */ - sendto_one(client_p, "PASS %s TS %d :%s", + sendto_one(client_p, "PASS %s TS %d :%s", EmptyString(server_p->spasswd) ? "*" : server_p->spasswd, TS_CURRENT, me.id); /* pass my info to the new server */ @@ -1362,7 +1367,7 @@ serv_connect_callback(rb_fde_t *F, int status, void *data) me.name, ConfigServerHide.hidden ? "(H) " : "", me.info); - /* + /* * If we've been marked dead because a send failed, just exit * here now and save everyone the trouble of us ever existing. */