diff options
Diffstat (limited to 'src/conf_parser.y')
-rw-r--r-- | src/conf_parser.y | 788 |
1 files changed, 327 insertions, 461 deletions
diff --git a/src/conf_parser.y b/src/conf_parser.y index e473bc6..5467dc4 100644 --- a/src/conf_parser.y +++ b/src/conf_parser.y @@ -76,32 +76,70 @@ static unsigned int lsize = 0; static char *resv_reason = NULL; static char *listener_address = NULL; -struct CollectItem -{ - dlink_node node; - char *name; - char *user; - char *host; - char *passwd; - int port; - int flags; -#ifdef HAVE_LIBCRYPTO - char *rsa_public_key_file; - RSA *rsa_public_key; -#endif -}; +static struct +{ + struct { + dlink_list list; + } mask, + leaf, + hub; + + struct { + char buf[IRCD_BUFSIZE]; + } name, + user, + host, + addr, + pass, + file, + class; + + struct { + unsigned int value; + } flags, + modes, + port, + ping_freq, + max_perip, + con_freq, + max_total, + max_global, + max_local, + max_ident, + max_sendq, + max_recvq, + cidr_bitlen_ipv4, + cidr_bitlen_ipv6, + number_per_cidr; +} block_state; static void -free_collect_item(struct CollectItem *item) +reset_block_state(void) { - MyFree(item->name); - MyFree(item->user); - MyFree(item->host); - MyFree(item->passwd); -#ifdef HAVE_LIBCRYPTO - MyFree(item->rsa_public_key_file); -#endif - MyFree(item); + dlink_node *ptr = NULL, *ptr_next = NULL; + + DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.mask.list.head) + { + MyFree(ptr->data); + dlinkDelete(ptr, &block_state.mask.list); + free_dlink_node(ptr); + } + + DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.leaf.list.head) + { + MyFree(ptr->data); + dlinkDelete(ptr, &block_state.leaf.list); + free_dlink_node(ptr); + } + + DLINK_FOREACH_SAFE(ptr, ptr_next, block_state.hub.list.head) + { + MyFree(ptr->data); + dlinkDelete(ptr, &block_state.hub.list); + free_dlink_node(ptr); + } + + memset(&block_state, 0, sizeof(block_state)); } %} @@ -516,7 +554,7 @@ serverinfo_rsa_private_key_file: RSA_PRIVATE_KEY_FILE '=' QSTRING ';' ServerInfo.rsa_private_key_file = NULL; } - DupString(ServerInfo.rsa_private_key_file, yylval.string); + ServerInfo.rsa_private_key_file = xstrdup(yylval.string); if ((file = BIO_new_file(yylval.string, "r")) == NULL) { @@ -598,7 +636,7 @@ serverinfo_name: NAME '=' QSTRING ';' if (conf_parser_ctx.pass == 2 && !ServerInfo.name) { if (valid_servname(yylval.string)) - DupString(ServerInfo.name, yylval.string); + ServerInfo.name = xstrdup(yylval.string); else { ilog(LOG_TYPE_IRCD, "Ignoring serverinfo::name -- invalid name. Aborting."); @@ -613,7 +651,7 @@ serverinfo_sid: IRCD_SID '=' QSTRING ';' if (conf_parser_ctx.pass == 2 && !ServerInfo.sid) { if (valid_sid(yylval.string)) - DupString(ServerInfo.sid, yylval.string); + ServerInfo.sid = xstrdup(yylval.string); else { ilog(LOG_TYPE_IRCD, "Ignoring serverinfo::sid -- invalid SID. Aborting."); @@ -627,7 +665,7 @@ serverinfo_description: DESCRIPTION '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(ServerInfo.description); - DupString(ServerInfo.description,yylval.string); + ServerInfo.description = xstrdup(yylval.string); } }; @@ -641,7 +679,7 @@ serverinfo_network_name: NETWORK_NAME '=' QSTRING ';' p = '\0'; MyFree(ServerInfo.network_name); - DupString(ServerInfo.network_name, yylval.string); + ServerInfo.network_name = xstrdup(yylval.string); } }; @@ -650,7 +688,7 @@ serverinfo_network_desc: NETWORK_DESC '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(ServerInfo.network_desc); - DupString(ServerInfo.network_desc, yylval.string); + ServerInfo.network_desc = xstrdup(yylval.string); } }; @@ -755,7 +793,7 @@ admin_name: NAME '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(AdminInfo.name); - DupString(AdminInfo.name, yylval.string); + AdminInfo.name = xstrdup(yylval.string); } }; @@ -764,7 +802,7 @@ admin_email: EMAIL '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(AdminInfo.email); - DupString(AdminInfo.email, yylval.string); + AdminInfo.email = xstrdup(yylval.string); } }; @@ -773,7 +811,7 @@ admin_description: DESCRIPTION '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(AdminInfo.description); - DupString(AdminInfo.description, yylval.string); + AdminInfo.description = xstrdup(yylval.string); } }; @@ -865,95 +903,82 @@ logging_file_type_item: USER ***************************************************************************/ oper_entry: OPERATOR { - if (conf_parser_ctx.pass == 2) - { - yy_conf = conf_make(CONF_OPER); - SetConfEncrypted(yy_conf); /* Yes, the default is encrypted */ - } - else - { - MyFree(class_name); - class_name = NULL; - } + if (conf_parser_ctx.pass != 2) + break; + + reset_block_state(); + block_state.flags.value |= CONF_FLAGS_ENCRYPTED; } '{' oper_items '}' ';' { - if (conf_parser_ctx.pass == 2) - { - struct CollectItem *yy_tmp; - dlink_node *ptr; - dlink_node *next_ptr; + dlink_node *ptr = NULL; - conf_add_class_to_conf(yy_conf, class_name); + if (conf_parser_ctx.pass != 2) + break; - /* Now, make sure there is a copy of the "base" given oper - * block in each of the collected copies - */ + if (!block_state.name.buf[0]) + break; +#ifdef HAVE_LIBCRYPTO + if (!(block_state.file.buf[0] || + block_state.pass.buf[0])) + break; +#else + if (!block_state.pass.buf[0]) + break; +#endif - DLINK_FOREACH_SAFE(ptr, next_ptr, col_conf_list.head) - { - struct MaskItem *new_conf; - yy_tmp = ptr->data; + DLINK_FOREACH(ptr, block_state.mask.list.head) + { + struct MaskItem *conf = NULL; + struct split_nuh_item nuh; - new_conf = conf_make(CONF_OPER); - new_conf->flags = yy_conf->flags; + nuh.nuhmask = ptr->data; + nuh.nickptr = NULL; + nuh.userptr = userbuf; + nuh.hostptr = hostbuf; + nuh.nicksize = 0; + nuh.usersize = sizeof(userbuf); + nuh.hostsize = sizeof(hostbuf); + split_nuh(&nuh); - if (yy_conf->name != NULL) - DupString(new_conf->name, yy_conf->name); - if (yy_tmp->user != NULL) - DupString(new_conf->user, yy_tmp->user); - else - DupString(new_conf->user, "*"); - if (yy_tmp->host != NULL) - DupString(new_conf->host, yy_tmp->host); - else - DupString(new_conf->host, "*"); + conf = conf_make(CONF_OPER); + conf->user = xstrdup(userbuf); + conf->host = xstrdup(hostbuf); - new_conf->htype = parse_netmask(new_conf->host, &new_conf->addr, - &new_conf->bits); + if (block_state.pass.buf[0]) + conf->passwd = xstrdup(block_state.pass.buf); - conf_add_class_to_conf(new_conf, class_name); - if (yy_conf->passwd != NULL) - DupString(new_conf->passwd, yy_conf->passwd); + conf->flags = block_state.flags.value; + conf->modes = block_state.modes.value; + conf->port = block_state.port.value; + conf->htype = parse_netmask(conf->host, &conf->addr, &conf->bits); - new_conf->port = yy_conf->port; -#ifdef HAVE_LIBCRYPTO - if (yy_conf->rsa_public_key_file != NULL) - { - BIO *file; + conf_add_class_to_conf(conf, block_state.class.buf); - DupString(new_conf->rsa_public_key_file, - yy_conf->rsa_public_key_file); +#ifdef HAVE_LIBCRYPTO + if (block_state.file.buf[0]) + { + BIO *file = NULL; + RSA *pkey = NULL; - file = BIO_new_file(yy_conf->rsa_public_key_file, "r"); - new_conf->rsa_public_key = PEM_read_bio_RSA_PUBKEY(file, - NULL, 0, NULL); - BIO_set_close(file, BIO_CLOSE); - BIO_free(file); + if ((file = BIO_new_file(block_state.file.buf, "r")) == NULL) + { + yyerror("Ignoring rsa_public_key_file -- file doesn't exist"); + break; } -#endif -#ifdef HAVE_LIBCRYPTO - if (yy_tmp->name && (yy_tmp->passwd || yy_conf->rsa_public_key) - && yy_tmp->host) -#else - if (yy_tmp->name && yy_tmp->passwd && yy_tmp->host) -#endif + if ((pkey = PEM_read_bio_RSA_PUBKEY(file, NULL, 0, NULL)) == NULL) { - conf_add_class_to_conf(new_conf, class_name); - if (yy_tmp->name != NULL) - DupString(new_conf->name, yy_tmp->name); + yyerror("Ignoring rsa_public_key_file -- Key invalid; check key syntax."); + break; } - dlinkDelete(&yy_tmp->node, &col_conf_list); - free_collect_item(yy_tmp); + conf->rsa_public_key = pkey; + BIO_set_close(file, BIO_CLOSE); + BIO_free(file); } - - yy_conf = NULL; - - MyFree(class_name); - class_name = NULL; +#endif /* HAVE_LIBCRYPTO */ } -}; +}; oper_items: oper_items oper_item | oper_item; oper_item: oper_name | oper_user | oper_password | @@ -963,59 +988,19 @@ oper_item: oper_name | oper_user | oper_password | oper_name: NAME '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - MyFree(yy_conf->name); - DupString(yy_conf->name, yylval.string); - } + strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); }; oper_user: USER '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - struct split_nuh_item nuh; - - nuh.nuhmask = yylval.string; - nuh.nickptr = NULL; - nuh.userptr = userbuf; - nuh.hostptr = hostbuf; - - nuh.nicksize = 0; - nuh.usersize = sizeof(userbuf); - nuh.hostsize = sizeof(hostbuf); - - split_nuh(&nuh); - - if (yy_conf->user == NULL) - { - DupString(yy_conf->user, userbuf); - DupString(yy_conf->host, hostbuf); - - yy_conf->htype = parse_netmask(yy_conf->host, &yy_conf->addr, - &yy_conf->bits); - } - else - { - struct CollectItem *yy_tmp = MyMalloc(sizeof(struct CollectItem)); - - DupString(yy_tmp->user, userbuf); - DupString(yy_tmp->host, hostbuf); - - dlinkAdd(yy_tmp, &yy_tmp->node, &col_conf_list); - } - } + dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list); }; oper_password: PASSWORD '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - if (yy_conf->passwd != NULL) - memset(yy_conf->passwd, 0, strlen(yy_conf->passwd)); - - MyFree(yy_conf->passwd); - DupString(yy_conf->passwd, yylval.string); - } + strlcpy(block_state.pass.buf, yylval.string, sizeof(block_state.pass.buf)); }; oper_encrypted: ENCRYPTED '=' TBOOL ';' @@ -1023,235 +1008,196 @@ oper_encrypted: ENCRYPTED '=' TBOOL ';' if (conf_parser_ctx.pass == 2) { if (yylval.number) - SetConfEncrypted(yy_conf); + block_state.flags.value |= CONF_FLAGS_ENCRYPTED; else - ClearConfEncrypted(yy_conf); + block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED; } }; oper_rsa_public_key_file: RSA_PUBLIC_KEY_FILE '=' QSTRING ';' { -#ifdef HAVE_LIBCRYPTO if (conf_parser_ctx.pass == 2) - { - BIO *file; - - if (yy_conf->rsa_public_key != NULL) - { - RSA_free(yy_conf->rsa_public_key); - yy_conf->rsa_public_key = NULL; - } - - if (yy_conf->rsa_public_key_file != NULL) - { - MyFree(yy_conf->rsa_public_key_file); - yy_conf->rsa_public_key_file = NULL; - } - - DupString(yy_conf->rsa_public_key_file, yylval.string); - file = BIO_new_file(yylval.string, "r"); - - if (file == NULL) - { - yyerror("Ignoring rsa_public_key_file -- file doesn't exist"); - break; - } - - yy_conf->rsa_public_key = PEM_read_bio_RSA_PUBKEY(file, NULL, 0, NULL); - - if (yy_conf->rsa_public_key == NULL) - { - yyerror("Ignoring rsa_public_key_file -- Key invalid; check key syntax."); - break; - } - - BIO_set_close(file, BIO_CLOSE); - BIO_free(file); - } -#endif /* HAVE_LIBCRYPTO */ + strlcpy(block_state.file.buf, yylval.string, sizeof(block_state.file.buf)); }; oper_class: CLASS '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - MyFree(class_name); - DupString(class_name, yylval.string); - } + strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf)); }; oper_umodes: T_UMODES { if (conf_parser_ctx.pass == 2) - yy_conf->modes = 0; + block_state.modes.value = 0; } '=' oper_umodes_items ';' ; oper_umodes_items: oper_umodes_items ',' oper_umodes_item | oper_umodes_item; oper_umodes_item: T_BOTS { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_BOTS; + block_state.modes.value |= UMODE_BOTS; } | T_CCONN { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_CCONN; + block_state.modes.value |= UMODE_CCONN; } | T_CCONN_FULL { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_CCONN_FULL; + block_state.modes.value |= UMODE_CCONN_FULL; } | T_DEAF { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_DEAF; + block_state.modes.value |= UMODE_DEAF; } | T_DEBUG { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_DEBUG; + block_state.modes.value |= UMODE_DEBUG; } | T_FULL { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_FULL; + block_state.modes.value |= UMODE_FULL; } | HIDDEN { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_HIDDEN; + block_state.modes.value |= UMODE_HIDDEN; } | T_SKILL { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_SKILL; + block_state.modes.value |= UMODE_SKILL; } | T_NCHANGE { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_NCHANGE; + block_state.modes.value |= UMODE_NCHANGE; } | T_REJ { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_REJ; + block_state.modes.value |= UMODE_REJ; } | T_UNAUTH { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_UNAUTH; + block_state.modes.value |= UMODE_UNAUTH; } | T_SPY { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_SPY; + block_state.modes.value |= UMODE_SPY; } | T_EXTERNAL { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_EXTERNAL; + block_state.modes.value |= UMODE_EXTERNAL; } | T_OPERWALL { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_OPERWALL; + block_state.modes.value |= UMODE_OPERWALL; } | T_SERVNOTICE { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_SERVNOTICE; + block_state.modes.value |= UMODE_SERVNOTICE; } | T_INVISIBLE { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_INVISIBLE; + block_state.modes.value |= UMODE_INVISIBLE; } | T_WALLOP { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_WALLOP; + block_state.modes.value |= UMODE_WALLOP; } | T_SOFTCALLERID { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_SOFTCALLERID; + block_state.modes.value |= UMODE_SOFTCALLERID; } | T_CALLERID { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_CALLERID; + block_state.modes.value |= UMODE_CALLERID; } | T_LOCOPS { if (conf_parser_ctx.pass == 2) - yy_conf->modes |= UMODE_LOCOPS; + block_state.modes.value |= UMODE_LOCOPS; }; oper_flags: IRCD_FLAGS { if (conf_parser_ctx.pass == 2) - yy_conf->port = 0; + block_state.port.value = 0; } '=' oper_flags_items ';'; oper_flags_items: oper_flags_items ',' oper_flags_item | oper_flags_item; oper_flags_item: GLOBAL_KILL { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_GLOBAL_KILL; + block_state.port.value |= OPER_FLAG_GLOBAL_KILL; } | REMOTE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_REMOTE; + block_state.port.value |= OPER_FLAG_REMOTE; } | KLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_K; + block_state.port.value |= OPER_FLAG_K; } | UNKLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_UNKLINE; + block_state.port.value |= OPER_FLAG_UNKLINE; } | T_DLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_DLINE; + block_state.port.value |= OPER_FLAG_DLINE; } | T_UNDLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_UNDLINE; + block_state.port.value |= OPER_FLAG_UNDLINE; } | XLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_X; + block_state.port.value |= OPER_FLAG_X; } | GLINE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_GLINE; + block_state.port.value |= OPER_FLAG_GLINE; } | DIE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_DIE; + block_state.port.value |= OPER_FLAG_DIE; } | T_RESTART { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_RESTART; + block_state.port.value |= OPER_FLAG_RESTART; } | REHASH { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_REHASH; + block_state.port.value |= OPER_FLAG_REHASH; } | ADMIN { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_ADMIN; + block_state.port.value |= OPER_FLAG_ADMIN; } | NICK_CHANGES { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_N; + block_state.port.value |= OPER_FLAG_N; } | T_OPERWALL { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_OPERWALL; + block_state.port.value |= OPER_FLAG_OPERWALL; } | T_GLOBOPS { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_GLOBOPS; + block_state.port.value |= OPER_FLAG_GLOBOPS; } | OPER_SPY_T { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_OPER_SPY; + block_state.port.value |= OPER_FLAG_OPER_SPY; } | REMOTEBAN { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_REMOTEBAN; + block_state.port.value |= OPER_FLAG_REMOTEBAN; } | T_SET { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_SET; + block_state.port.value |= OPER_FLAG_SET; } | MODULE { if (conf_parser_ctx.pass == 2) - yy_conf->port |= OPER_FLAG_MODULE; + block_state.port.value |= OPER_FLAG_MODULE; }; @@ -1323,7 +1269,7 @@ class_name: NAME '=' QSTRING ';' if (conf_parser_ctx.pass == 1) { MyFree(yy_class_name); - DupString(yy_class_name, yylval.string); + yy_class_name = xstrdup(yylval.string); } }; @@ -1406,45 +1352,33 @@ class_number_per_cidr: NUMBER_PER_CIDR '=' NUMBER ';' listen_entry: LISTEN { if (conf_parser_ctx.pass == 2) - { - listener_address = NULL; - listener_flags = 0; - } -} '{' listen_items '}' ';' -{ - if (conf_parser_ctx.pass == 2) - { - MyFree(listener_address); - listener_address = NULL; - } -}; + reset_block_state(); +} '{' listen_items '}' ';'; listen_flags: IRCD_FLAGS { - listener_flags = 0; + block_state.flags.value = 0; } '=' listen_flags_items ';'; listen_flags_items: listen_flags_items ',' listen_flags_item | listen_flags_item; listen_flags_item: T_SSL { if (conf_parser_ctx.pass == 2) - listener_flags |= LISTENER_SSL; + block_state.flags.value |= LISTENER_SSL; } | HIDDEN { if (conf_parser_ctx.pass == 2) - listener_flags |= LISTENER_HIDDEN; + block_state.flags.value |=LISTENER_HIDDEN; } | T_SERVER { if (conf_parser_ctx.pass == 2) - listener_flags |= LISTENER_SERVER; + block_state.flags.value |=LISTENER_SERVER; }; - - listen_items: listen_items listen_item | listen_item; listen_item: listen_port | listen_flags | listen_address | listen_host | error ';'; -listen_port: PORT '=' port_items { listener_flags = 0; } ';'; +listen_port: PORT '=' port_items { block_state.flags.value |= 0; } ';'; port_items: port_items ',' port_item | port_item; @@ -1452,7 +1386,7 @@ port_item: NUMBER { if (conf_parser_ctx.pass == 2) { - if ((listener_flags & LISTENER_SSL)) + if (block_state.flags.value & LISTENER_SSL) #ifdef HAVE_LIBCRYPTO if (!ServerInfo.server_ctx) #endif @@ -1460,7 +1394,7 @@ port_item: NUMBER yyerror("SSL not available - port closed"); break; } - add_listener($1, listener_address, listener_flags); + add_listener($1, block_state.addr.buf, block_state.flags.value); } } | NUMBER TWODOTS NUMBER { @@ -1468,7 +1402,7 @@ port_item: NUMBER { int i; - if ((listener_flags & LISTENER_SSL)) + if (block_state.flags.value & LISTENER_SSL) #ifdef HAVE_LIBCRYPTO if (!ServerInfo.server_ctx) #endif @@ -1478,26 +1412,20 @@ port_item: NUMBER } for (i = $1; i <= $3; ++i) - add_listener(i, listener_address, listener_flags); + add_listener(i, block_state.addr.buf, block_state.flags.value); } }; listen_address: IP '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - MyFree(listener_address); - DupString(listener_address, yylval.string); - } + strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf)); }; listen_host: HOST '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - MyFree(listener_address); - DupString(listener_address, yylval.string); - } + strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf)); }; /*************************************************************************** @@ -1506,63 +1434,42 @@ listen_host: HOST '=' QSTRING ';' auth_entry: IRCD_AUTH { if (conf_parser_ctx.pass == 2) - { - yy_conf = conf_make(CONF_CLIENT); - } - else - { - MyFree(class_name); - class_name = NULL; - } + reset_block_state(); } '{' auth_items '}' ';' { - if (conf_parser_ctx.pass == 2) - { - struct CollectItem *yy_tmp = NULL; - dlink_node *ptr = NULL, *next_ptr = NULL; + dlink_node *ptr = NULL; - if (yy_conf->user && yy_conf->host) - { - conf_add_class_to_conf(yy_conf, class_name); - add_conf_by_address(CONF_CLIENT, yy_conf); - } - else - conf_free(yy_conf); + if (conf_parser_ctx.pass != 2) + break; - /* copy over settings from first struct */ - DLINK_FOREACH_SAFE(ptr, next_ptr, col_conf_list.head) - { - struct MaskItem *new_conf = conf_make(CONF_CLIENT); - - yy_tmp = ptr->data; - - assert(yy_tmp->user && yy_tmp->host); + DLINK_FOREACH(ptr, block_state.mask.list.head) + { + struct MaskItem *conf = NULL; + struct split_nuh_item nuh; - if (yy_conf->passwd != NULL) - DupString(new_conf->passwd, yy_conf->passwd); - if (yy_conf->name != NULL) - DupString(new_conf->name, yy_conf->name); - if (yy_conf->passwd != NULL) - DupString(new_conf->passwd, yy_conf->passwd); + nuh.nuhmask = ptr->data; + nuh.nickptr = NULL; + nuh.userptr = userbuf; + nuh.hostptr = hostbuf; + nuh.nicksize = 0; + nuh.usersize = sizeof(userbuf); + nuh.hostsize = sizeof(hostbuf); + split_nuh(&nuh); - new_conf->flags = yy_conf->flags; - new_conf->port = yy_conf->port; + conf = conf_make(CONF_CLIENT); + conf->user = xstrdup(collapse(userbuf)); + conf->host = xstrdup(collapse(hostbuf)); - DupString(new_conf->user, yy_tmp->user); - collapse(new_conf->user); + if (block_state.pass.buf[0]) + conf->passwd = xstrdup(block_state.pass.buf); + if (block_state.name.buf[0]) + conf->passwd = xstrdup(block_state.name.buf); - DupString(new_conf->host, yy_tmp->host); - collapse(new_conf->host); + conf->flags = block_state.flags.value; + conf->port = block_state.port.value; - conf_add_class_to_conf(new_conf, class_name); - add_conf_by_address(CONF_CLIENT, new_conf); - dlinkDelete(&yy_tmp->node, &col_conf_list); - free_collect_item(yy_tmp); - } - - MyFree(class_name); - class_name = NULL; - yy_conf = NULL; + conf_add_class_to_conf(conf, block_state.class.buf); + add_conf_by_address(CONF_CLIENT, conf); } }; @@ -1574,58 +1481,19 @@ auth_item: auth_user | auth_passwd | auth_class | auth_flags | auth_user: USER '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - struct CollectItem *yy_tmp = NULL; - struct split_nuh_item nuh; - - nuh.nuhmask = yylval.string; - nuh.nickptr = NULL; - nuh.userptr = userbuf; - nuh.hostptr = hostbuf; - - nuh.nicksize = 0; - nuh.usersize = sizeof(userbuf); - nuh.hostsize = sizeof(hostbuf); - - split_nuh(&nuh); - - if (yy_conf->user == NULL) - { - DupString(yy_conf->user, userbuf); - DupString(yy_conf->host, hostbuf); - } - else - { - yy_tmp = MyMalloc(sizeof(struct CollectItem)); - - DupString(yy_tmp->user, userbuf); - DupString(yy_tmp->host, hostbuf); - - dlinkAdd(yy_tmp, &yy_tmp->node, &col_conf_list); - } - } + dlinkAdd(xstrdup(yylval.string), make_dlink_node(), &block_state.mask.list); }; auth_passwd: PASSWORD '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - /* be paranoid */ - if (yy_conf->passwd != NULL) - memset(yy_conf->passwd, 0, strlen(yy_conf->passwd)); - - MyFree(yy_conf->passwd); - DupString(yy_conf->passwd, yylval.string); - } + strlcpy(block_state.pass.buf, yylval.string, sizeof(block_state.pass.buf)); }; auth_class: CLASS '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - { - MyFree(class_name); - DupString(class_name, yylval.string); - } + strlcpy(block_state.class.buf, yylval.string, sizeof(block_state.class.buf)); }; auth_encrypted: ENCRYPTED '=' TBOOL ';' @@ -1633,91 +1501,86 @@ auth_encrypted: ENCRYPTED '=' TBOOL ';' if (conf_parser_ctx.pass == 2) { if (yylval.number) - SetConfEncrypted(yy_conf); + block_state.flags.value |= CONF_FLAGS_ENCRYPTED; else - ClearConfEncrypted(yy_conf); + block_state.flags.value &= ~CONF_FLAGS_ENCRYPTED; } }; auth_flags: IRCD_FLAGS { + if (conf_parser_ctx.pass == 2) + block_state.flags.value = 0; } '=' auth_flags_items ';'; auth_flags_items: auth_flags_items ',' auth_flags_item | auth_flags_item; auth_flags_item: SPOOF_NOTICE { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_SPOOF_NOTICE; + block_state.flags.value |= CONF_FLAGS_SPOOF_NOTICE; } | EXCEED_LIMIT { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_NOLIMIT; + block_state.flags.value |= CONF_FLAGS_NOLIMIT; } | KLINE_EXEMPT { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_EXEMPTKLINE; + block_state.flags.value |= CONF_FLAGS_EXEMPTKLINE; } | NEED_IDENT { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_NEED_IDENTD; + block_state.flags.value |= CONF_FLAGS_NEED_IDENTD; } | CAN_FLOOD { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_CAN_FLOOD; + block_state.flags.value |= CONF_FLAGS_CAN_FLOOD; } | NO_TILDE { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_NO_TILDE; + block_state.flags.value |= CONF_FLAGS_NO_TILDE; } | GLINE_EXEMPT { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_EXEMPTGLINE; + block_state.flags.value |= CONF_FLAGS_EXEMPTGLINE; } | RESV_EXEMPT { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_EXEMPTRESV; + block_state.flags.value |= CONF_FLAGS_EXEMPTRESV; } | NEED_PASSWORD { if (conf_parser_ctx.pass == 2) - yy_conf->flags |= CONF_FLAGS_NEED_PASSWORD; + block_state.flags.value |= CONF_FLAGS_NEED_PASSWORD; }; auth_spoof: SPOOF '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) - { - MyFree(yy_conf->name); + if (conf_parser_ctx.pass != 2) + break; - if (strlen(yylval.string) <= HOSTLEN && valid_hostname(yylval.string)) - { - DupString(yy_conf->name, yylval.string); - yy_conf->flags |= CONF_FLAGS_SPOOF_IP; - } - else - { - ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it."); - yy_conf->name = NULL; - } + if (strlen(yylval.string) <= HOSTLEN && valid_hostname(yylval.string)) + { + strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); + block_state.flags.value |= CONF_FLAGS_SPOOF_IP; } + else + ilog(LOG_TYPE_IRCD, "Spoof either is too long or contains invalid characters. Ignoring it."); }; auth_redir_serv: REDIRSERV '=' QSTRING ';' { - if (conf_parser_ctx.pass == 2) - { - yy_conf->flags |= CONF_FLAGS_REDIR; - MyFree(yy_conf->name); - DupString(yy_conf->name, yylval.string); - } + if (conf_parser_ctx.pass != 2) + break; + + strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); + block_state.flags.value |= CONF_FLAGS_REDIR; }; auth_redir_port: REDIRPORT '=' NUMBER ';' { - if (conf_parser_ctx.pass == 2) - { - yy_conf->flags |= CONF_FLAGS_REDIR; - yy_conf->port = $3; - } + if (conf_parser_ctx.pass != 2) + break; + block_state.flags.value |= CONF_FLAGS_REDIR; + block_state.port.value = $3; }; @@ -1748,7 +1611,7 @@ resv_creason: REASON '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(resv_reason); - DupString(resv_reason, yylval.string); + resv_reason = xstrdup(yylval.string); } }; @@ -1792,7 +1655,7 @@ service_name: NAME '=' QSTRING ';' if (valid_servname(yylval.string)) { yy_conf = conf_make(CONF_SERVICE); - DupString(yy_conf->name, yylval.string); + yy_conf->name = xstrdup(yylval.string); } } }; @@ -2163,9 +2026,8 @@ connect_hub_mask: HUB_MASK '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) { - char *mask; + char *mask = xstrdup(yylval.string); - DupString(mask, yylval.string); dlinkAdd(mask, make_dlink_node(), &yy_conf->hub_list); } }; @@ -2219,6 +2081,8 @@ kill_entry: KILL { if (conf_parser_ctx.pass == 2) { + struct MaskItem *conf = NULL; + if (userbuf[0] && hostbuf[0]) { if (regex_ban) @@ -2236,17 +2100,17 @@ kill_entry: KILL break; } - yy_conf = conf_make(CONF_RKLINE); - yy_conf->regexuser = exp_user; - yy_conf->regexhost = exp_host; + conf = conf_make(CONF_RKLINE); + conf->regexuser = exp_user; + conf->regexhost = exp_host; - DupString(yy_conf->user, userbuf); - DupString(yy_conf->host, hostbuf); + conf->user = xstrdup(userbuf); + conf->host = xstrdup(hostbuf); if (reasonbuf[0]) - DupString(yy_conf->reason, reasonbuf); + conf->reason = xstrdup(reasonbuf); else - DupString(yy_conf->reason, "No reason"); + conf->reason = xstrdup(CONF_NOREASON); #else ilog(LOG_TYPE_IRCD, "Failed to add regular expression based K-Line: no PCRE support"); break; @@ -2254,20 +2118,18 @@ kill_entry: KILL } else { - yy_conf = conf_make(CONF_KLINE); + conf = conf_make(CONF_KLINE); - DupString(yy_conf->user, userbuf); - DupString(yy_conf->host, hostbuf); + conf->user = xstrdup(userbuf); + conf->host = xstrdup(hostbuf); if (reasonbuf[0]) - DupString(yy_conf->reason, reasonbuf); + conf->reason = xstrdup(reasonbuf); else - DupString(yy_conf->reason, "No reason"); - add_conf_by_address(CONF_KLINE, yy_conf); + conf->reason = xstrdup(CONF_NOREASON); + add_conf_by_address(CONF_KLINE, conf); } } - - yy_conf = NULL; } }; @@ -2316,23 +2178,27 @@ kill_reason: REASON '=' QSTRING ';' deny_entry: DENY { if (conf_parser_ctx.pass == 2) - hostbuf[0] = reasonbuf[0] = '\0'; + reset_block_state(); } '{' deny_items '}' ';' { - if (conf_parser_ctx.pass == 2) + struct MaskItem *conf = NULL; + + if (conf_parser_ctx.pass != 2) + break; + + if (!block_state.addr.buf[0]) + break; + + if (parse_netmask(block_state.addr.buf, NULL, NULL) != HM_HOST) { - if (hostbuf[0] && parse_netmask(hostbuf, NULL, NULL) != HM_HOST) - { - yy_conf = conf_make(CONF_DLINE); - DupString(yy_conf->host, hostbuf); + conf = conf_make(CONF_DLINE); + conf->host = xstrdup(block_state.addr.buf); - if (reasonbuf[0]) - DupString(yy_conf->reason, reasonbuf); - else - DupString(yy_conf->reason, "No reason"); - add_conf_by_address(CONF_DLINE, yy_conf); - yy_conf = NULL; - } + if (block_state.pass.buf[0]) + conf->reason = xstrdup(block_state.pass.buf); + else + conf->reason = xstrdup(CONF_NOREASON); + add_conf_by_address(CONF_DLINE, conf); } }; @@ -2342,13 +2208,13 @@ deny_item: deny_ip | deny_reason | error; deny_ip: IP '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - strlcpy(hostbuf, yylval.string, sizeof(hostbuf)); + strlcpy(block_state.addr.buf, yylval.string, sizeof(block_state.addr.buf)); }; deny_reason: REASON '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - strlcpy(reasonbuf, yylval.string, sizeof(reasonbuf)); + strlcpy(block_state.pass.buf, yylval.string, sizeof(block_state.pass.buf)); }; /*************************************************************************** @@ -2365,11 +2231,10 @@ exempt_ip: IP '=' QSTRING ';' { if (yylval.string[0] && parse_netmask(yylval.string, NULL, NULL) != HM_HOST) { - yy_conf = conf_make(CONF_EXEMPT); - DupString(yy_conf->host, yylval.string); + struct MaskItem *conf = conf_make(CONF_EXEMPT); + conf->host = xstrdup(yylval.string); - add_conf_by_address(CONF_EXEMPT, yy_conf); - yy_conf = NULL; + add_conf_by_address(CONF_EXEMPT, conf); } } }; @@ -2380,58 +2245,59 @@ exempt_ip: IP '=' QSTRING ';' gecos_entry: GECOS { if (conf_parser_ctx.pass == 2) - { - regex_ban = 0; - reasonbuf[0] = gecos_name[0] = '\0'; - } + reset_block_state(); } '{' gecos_items '}' ';' { - if (conf_parser_ctx.pass == 2) + struct MaskItem *conf = NULL; + + if (conf_parser_ctx.pass != 2) + break; + + if (!block_state.name.buf[0]) + break; + + if (block_state.port.value == 1) { - if (gecos_name[0]) - { - if (regex_ban) - { #ifdef HAVE_LIBPCRE - void *exp_p = NULL; - const char *errptr = NULL; + void *exp_p = NULL; + const char *errptr = NULL; - if (!(exp_p = ircd_pcre_compile(gecos_name, &errptr))) - { - ilog(LOG_TYPE_IRCD, "Failed to add regular expression based X-Line: %s", - errptr); - break; - } + if (!(exp_p = ircd_pcre_compile(block_state.name.buf, &errptr))) + { + ilog(LOG_TYPE_IRCD, "Failed to add regular expression based X-Line: %s", + errptr); + break; + } - yy_conf = conf_make(CONF_RXLINE); - yy_conf->regexuser = exp_p; + conf = conf_make(CONF_RXLINE); + conf->regexuser = exp_p; #else - ilog(LOG_TYPE_IRCD, "Failed to add regular expression based X-Line: no PCRE support"); - break; + ilog(LOG_TYPE_IRCD, "Failed to add regular expression based X-Line: no PCRE support"); + break; #endif - } - else - yy_conf = conf_make(CONF_XLINE); + } + else + conf = conf_make(CONF_XLINE); - DupString(yy_conf->name, gecos_name); + conf->name = xstrdup(block_state.name.buf); - if (reasonbuf[0]) - DupString(yy_conf->reason, reasonbuf); - else - DupString(yy_conf->reason, "No reason"); - } - } + if (block_state.pass.buf[0]) + conf->reason = xstrdup(block_state.pass.buf); + else + conf->reason = xstrdup(CONF_NOREASON); }; gecos_flags: TYPE { + if (conf_parser_ctx.pass == 2) + block_state.port.value = 0; } '=' gecos_flags_items ';'; gecos_flags_items: gecos_flags_items ',' gecos_flags_item | gecos_flags_item; gecos_flags_item: REGEX_T { if (conf_parser_ctx.pass == 2) - regex_ban = 1; + block_state.port.value = 1; }; gecos_items: gecos_items gecos_item | gecos_item; @@ -2440,13 +2306,13 @@ gecos_item: gecos_name | gecos_reason | gecos_flags | error; gecos_name: NAME '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - strlcpy(gecos_name, yylval.string, sizeof(gecos_name)); + strlcpy(block_state.name.buf, yylval.string, sizeof(block_state.name.buf)); }; gecos_reason: REASON '=' QSTRING ';' { if (conf_parser_ctx.pass == 2) - strlcpy(reasonbuf, yylval.string, sizeof(reasonbuf)); + strlcpy(block_state.pass.buf, yylval.string, sizeof(block_state.pass.buf)); }; /*************************************************************************** @@ -2710,7 +2576,7 @@ general_egdpool_path: EGDPOOL_PATH '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(ConfigFileEntry.egdpool_path); - DupString(ConfigFileEntry.egdpool_path, yylval.string); + ConfigFileEntry.egdpool_path = xstrdup(yylval.string); } }; @@ -2719,7 +2585,7 @@ general_services_name: T_SERVICES_NAME '=' QSTRING ';' if (conf_parser_ctx.pass == 2 && valid_servname(yylval.string)) { MyFree(ConfigFileEntry.service_name); - DupString(ConfigFileEntry.service_name, yylval.string); + ConfigFileEntry.service_name = xstrdup(yylval.string); } }; @@ -3007,7 +2873,7 @@ serverhide_hidden_name: HIDDEN_NAME '=' QSTRING ';' if (conf_parser_ctx.pass == 2) { MyFree(ConfigServerHide.hidden_name); - DupString(ConfigServerHide.hidden_name, yylval.string); + ConfigServerHide.hidden_name = xstrdup(yylval.string); } }; |