From 9aed69e50327af9ab976e26cad6cf73865350d07 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 7 Jan 2013 21:01:35 +0100 Subject: [PATCH] small fixes to last commit --- src/mod-hostserv.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index 5c23a85..89bcdf4 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -165,7 +165,8 @@ struct hs_user { /* temporary structs */ struct hs_fakehost_info { - int parse_state; + unsigned int parse_state : 4; + unsigned int have_secondlevel : 1; char *tlfh_name; char *slfh_name; struct hs_toplevel *tlfh; @@ -569,8 +570,9 @@ static int check_management_access(struct handle_info *hi, struct hs_toplevel *t struct hs_fakehost_info parse_fakehost_info(char *fakehost, int fix_name_case) { struct hs_fakehost_info fhinfo; int i; + memset(&fhinfo, 0, sizeof(fhinfo)); for(i = strlen(fakehost)-1; i >= 0; i--) { - if(!isalnum(fakehost[i]) && !strchr(HS_FAKEHOST_SPECIAL_CHARS, fakehost[i])) { + if(!isalnum(fakehost[i]) && fakehost[i] != '.' && !(fakehost[i] == '*' && i == 0) && !strchr(HS_FAKEHOST_SPECIAL_CHARS, fakehost[i])) { fhinfo.parse_state = HS_FHPARSE_INVALID; return fhinfo; } @@ -589,8 +591,8 @@ struct hs_fakehost_info parse_fakehost_info(char *fakehost, int fix_name_case) { fhinfo.tlfh_name[0] = '\0'; return fhinfo; } - if(!irccasecmp(fhinfo.slfh_name, "*")) - fhinfo.slfh_name = NULL; + if(irccasecmp(fhinfo.slfh_name, "*")) + fhinfo.have_secondlevel = 1; struct hs_toplevel *tlfh; struct hs_secondlevel *slfh; for(tlfh = toplevels; tlfh; tlfh = tlfh->next) { @@ -602,7 +604,7 @@ struct hs_fakehost_info parse_fakehost_info(char *fakehost, int fix_name_case) { fhinfo.parse_state = HS_FHPARSE_UNKNOWN; return fhinfo; } - if(fhinfo.slfh_name) { + if(fhinfo.have_secondlevel) { for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) { if(!irccasecmp(slfh->fakehost, fhinfo.slfh_name)) break; } @@ -616,7 +618,8 @@ struct hs_fakehost_info parse_fakehost_info(char *fakehost, int fix_name_case) { if(fix_name_case) { //simply copy the stored fakehosts over the given ones strcpy(fhinfo.tlfh_name, fhinfo.tlfh->fakehost); - strcpy(fhinfo.slfh_name, fhinfo.slfh->fakehost); + if(fhinfo.slfh) + strcpy(fhinfo.slfh_name, fhinfo.slfh->fakehost); } fhinfo.parse_state = HS_FHPARSE_SUCCESS; return fhinfo; @@ -801,7 +804,7 @@ static MODCMD_FUNC(cmd_addhost) { reply("HSMSG_TOPLEVEL_INVALID", argv[1]); return 0; } - if(!fhinfo.slfh_name) { + if(!fhinfo.have_secondlevel) { if(!check_management_access(hi, NULL, NULL)) { reply("HSMSG_ACCESS_DENIED"); return 0; @@ -883,7 +886,7 @@ static MODCMD_FUNC(cmd_renamehost) { if(new_fhinfo.parse_state == HS_FHPARSE_INVALID) { reply("HSMSG_TOPLEVEL_INVALID", argv[1]); return 0; - } else if(new_fhinfo.parse_state != HS_FHPARSE_UNKNOWN && (irccasecmp(fhinfo.tlfh_name, new_fhinfo.tlfh_name) || (new_fhinfo.slfh && new_fhinfo.slfh_name && irccasecmp(fhinfo.slfh_name, new_fhinfo.slfh_name)))) { + } else if(new_fhinfo.parse_state != HS_FHPARSE_UNKNOWN && (irccasecmp(fhinfo.tlfh_name, new_fhinfo.tlfh_name) || (new_fhinfo.slfh && irccasecmp(fhinfo.slfh_name, new_fhinfo.slfh_name)))) { reply("HSMSG_FAKEHOST_TOPLEVEL_ALREADY_EXISTS", new_fhinfo.slfh_name, new_fhinfo.tlfh_name); return 0; } @@ -893,7 +896,7 @@ static MODCMD_FUNC(cmd_renamehost) { reply("HSMSG_ACCESS_DENIED"); return 0; } - if(new_fhinfo.slfh_name) { + if(fhinfo.have_secondlevel) { //can't rename toplevel into secondlevel fakehost! new_fhinfo.tlfh_name--; new_fhinfo.tlfh_name[0] = '.'; -- 2.20.1