Loading include/my_sys.h +1 −1 Original line number Diff line number Diff line Loading @@ -620,7 +620,7 @@ extern my_string my_path(my_string to,const char *progname, const char *own_pathname_part); extern my_string my_load_path(my_string to, const char *path, const char *own_path_prefix); extern int wild_compare(const char *str,const char *wildstr); extern int wild_compare(const char *str,const char *wildstr,pbool str_is_pattern); extern my_string my_strcasestr(const char *src,const char *suffix); extern int my_strcasecmp(const char *s,const char *t); extern int my_strsortcmp(const char *s,const char *t); Loading mysys/mf_wcomp.c +45 −22 Original line number Diff line number Diff line Loading @@ -23,11 +23,12 @@ char wild_many='*'; char wild_one='?'; char wild_prefix=0; char wild_prefix=0; /* QQ this can potentially cause a SIGSEGV */ int wild_compare(register const char *str, register const char *wildstr) int wild_compare(register const char *str, register const char *wildstr, pbool str_is_pattern) { reg3 int flag; char cmp; DBUG_ENTER("wild_compare"); while (*wildstr) Loading @@ -35,33 +36,55 @@ int wild_compare(register const char *str, register const char *wildstr) while (*wildstr && *wildstr != wild_many && *wildstr != wild_one) { if (*wildstr == wild_prefix && wildstr[1]) { wildstr++; if (*wildstr++ != *str++) DBUG_RETURN(1); if (str_is_pattern && *str++ != wild_prefix) DBUG_RETURN(1); } if (*wildstr++ != *str++) DBUG_RETURN(1); } if (! *wildstr ) DBUG_RETURN (*str != 0); if (! *wildstr ) DBUG_RETURN(*str != 0); if (*wildstr++ == wild_one) { if (! *str++) DBUG_RETURN (1); /* One char; skipp */ if (! *str || (str_is_pattern && *str == wild_many)) DBUG_RETURN(1); /* One char; skip */ if (*str++ == wild_prefix && str_is_pattern && *str) str++; } else { /* Found '*' */ if (!*wildstr) DBUG_RETURN(0); /* '*' as last char: OK */ flag=(*wildstr != wild_many && *wildstr != wild_one); do while (str_is_pattern && *str == wild_many) str++; for (; *wildstr == wild_many || *wildstr == wild_one; wildstr++) if (*wildstr == wild_many) { if (flag) while (str_is_pattern && *str == wild_many) str++; } else { char cmp; if ((cmp= *wildstr) == wild_prefix && wildstr[1]) if (str_is_pattern && *str == wild_prefix && str[1]) str+=2; else if (! *str++) DBUG_RETURN (1); } if (!*wildstr) DBUG_RETURN(0); /* '*' as last char: OK */ if ((cmp= *wildstr) == wild_prefix && wildstr[1] && !str_is_pattern) cmp=wildstr[1]; for (;;str++) { while (*str && *str != cmp) str++; if (!*str) DBUG_RETURN (1); } if (wild_compare(str,wildstr) == 0) DBUG_RETURN (0); } while (*str++ && wildstr[0] != wild_many); if (!*str) DBUG_RETURN (1); if (wild_compare(str,wildstr,str_is_pattern) == 0) DBUG_RETURN (0); } /* We will never come here */ } } DBUG_RETURN (*str != '\0'); DBUG_RETURN (*str != 0); } /* wild_compare */ mysys/mf_wfile.c +2 −2 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ int wf_test(register WF_PACK *wf_pack, register const char *name) not_pos=wf_pack->not_pos; for (i=0 ; i < not_pos; i++) if (wild_compare(name,wf_pack->wild[i]) == 0) if (wild_compare(name,wf_pack->wild[i],0) == 0) goto found; if (i) DBUG_RETURN(1); /* No-match */ Loading @@ -115,7 +115,7 @@ int wf_test(register WF_PACK *wf_pack, register const char *name) /* Test that it isn't in not-list */ for (i=not_pos ; i < wf_pack->wilds; i++) if (wild_compare(name,wf_pack->wild[i]) == 0) if (wild_compare(name,wf_pack->wild[i],0) == 0) DBUG_RETURN(1); DBUG_RETURN(0); } /* wf_test */ Loading sql/sql_acl.cc +5 −5 Original line number Diff line number Diff line Loading @@ -834,7 +834,7 @@ static void acl_insert_db(const char *user, const char *host, const char *db, */ ulong acl_get(const char *host, const char *ip, const char *bin_ip, const char *user, const char *db) const char *user, const char *db, my_bool db_is_pattern) { ulong host_access,db_access; uint i,key_length; Loading Loading @@ -868,7 +868,7 @@ ulong acl_get(const char *host, const char *ip, const char *bin_ip, { if (compare_hostname(&acl_db->host,host,ip)) { if (!acl_db->db || !wild_compare(db,acl_db->db)) if (!acl_db->db || !wild_compare(db,acl_db->db,db_is_pattern)) { db_access=acl_db->access; if (acl_db->host.hostname) Loading @@ -890,7 +890,7 @@ ulong acl_get(const char *host, const char *ip, const char *bin_ip, ACL_HOST *acl_host=dynamic_element(&acl_hosts,i,ACL_HOST*); if (compare_hostname(&acl_host->host,host,ip)) { if (!acl_host->db || !wild_compare(db,acl_host->db)) if (!acl_host->db || !wild_compare(db,acl_host->db,0)) { host_access=acl_host->access; // Fully specified. Take it break; Loading Loading @@ -1222,7 +1222,7 @@ static bool compare_hostname(const acl_host_and_ip *host, const char *hostname, } return (!host->hostname || (hostname && !wild_case_compare(hostname,host->hostname)) || (ip && !wild_compare(ip,host->hostname))); (ip && !wild_compare(ip,host->hostname,0))); } Loading Loading @@ -1300,7 +1300,7 @@ static bool test_if_create_new_users(THD *thd) tl.db= (char*) "mysql"; tl.real_name= (char*) "user"; db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr, thd->priv_user, tl.db); thd->priv_user, tl.db, 0); if (!(db_access & INSERT_ACL)) { if (check_grant(thd,INSERT_ACL,&tl,0,1)) Loading sql/sql_acl.h +1 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ my_bool acl_init(THD *thd, bool dont_read_acl_tables); void acl_reload(THD *thd); void acl_free(bool end=0); ulong acl_get(const char *host, const char *ip, const char *bin_ip, const char *user, const char *db); const char *user, const char *db, my_bool db_is_pattern); ulong acl_getroot(THD *thd, const char *host, const char *ip, const char *user, const char *password,const char *scramble, char **priv_user, char *priv_host, Loading Loading
include/my_sys.h +1 −1 Original line number Diff line number Diff line Loading @@ -620,7 +620,7 @@ extern my_string my_path(my_string to,const char *progname, const char *own_pathname_part); extern my_string my_load_path(my_string to, const char *path, const char *own_path_prefix); extern int wild_compare(const char *str,const char *wildstr); extern int wild_compare(const char *str,const char *wildstr,pbool str_is_pattern); extern my_string my_strcasestr(const char *src,const char *suffix); extern int my_strcasecmp(const char *s,const char *t); extern int my_strsortcmp(const char *s,const char *t); Loading
mysys/mf_wcomp.c +45 −22 Original line number Diff line number Diff line Loading @@ -23,11 +23,12 @@ char wild_many='*'; char wild_one='?'; char wild_prefix=0; char wild_prefix=0; /* QQ this can potentially cause a SIGSEGV */ int wild_compare(register const char *str, register const char *wildstr) int wild_compare(register const char *str, register const char *wildstr, pbool str_is_pattern) { reg3 int flag; char cmp; DBUG_ENTER("wild_compare"); while (*wildstr) Loading @@ -35,33 +36,55 @@ int wild_compare(register const char *str, register const char *wildstr) while (*wildstr && *wildstr != wild_many && *wildstr != wild_one) { if (*wildstr == wild_prefix && wildstr[1]) { wildstr++; if (*wildstr++ != *str++) DBUG_RETURN(1); if (str_is_pattern && *str++ != wild_prefix) DBUG_RETURN(1); } if (*wildstr++ != *str++) DBUG_RETURN(1); } if (! *wildstr ) DBUG_RETURN (*str != 0); if (! *wildstr ) DBUG_RETURN(*str != 0); if (*wildstr++ == wild_one) { if (! *str++) DBUG_RETURN (1); /* One char; skipp */ if (! *str || (str_is_pattern && *str == wild_many)) DBUG_RETURN(1); /* One char; skip */ if (*str++ == wild_prefix && str_is_pattern && *str) str++; } else { /* Found '*' */ if (!*wildstr) DBUG_RETURN(0); /* '*' as last char: OK */ flag=(*wildstr != wild_many && *wildstr != wild_one); do while (str_is_pattern && *str == wild_many) str++; for (; *wildstr == wild_many || *wildstr == wild_one; wildstr++) if (*wildstr == wild_many) { if (flag) while (str_is_pattern && *str == wild_many) str++; } else { char cmp; if ((cmp= *wildstr) == wild_prefix && wildstr[1]) if (str_is_pattern && *str == wild_prefix && str[1]) str+=2; else if (! *str++) DBUG_RETURN (1); } if (!*wildstr) DBUG_RETURN(0); /* '*' as last char: OK */ if ((cmp= *wildstr) == wild_prefix && wildstr[1] && !str_is_pattern) cmp=wildstr[1]; for (;;str++) { while (*str && *str != cmp) str++; if (!*str) DBUG_RETURN (1); } if (wild_compare(str,wildstr) == 0) DBUG_RETURN (0); } while (*str++ && wildstr[0] != wild_many); if (!*str) DBUG_RETURN (1); if (wild_compare(str,wildstr,str_is_pattern) == 0) DBUG_RETURN (0); } /* We will never come here */ } } DBUG_RETURN (*str != '\0'); DBUG_RETURN (*str != 0); } /* wild_compare */
mysys/mf_wfile.c +2 −2 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ int wf_test(register WF_PACK *wf_pack, register const char *name) not_pos=wf_pack->not_pos; for (i=0 ; i < not_pos; i++) if (wild_compare(name,wf_pack->wild[i]) == 0) if (wild_compare(name,wf_pack->wild[i],0) == 0) goto found; if (i) DBUG_RETURN(1); /* No-match */ Loading @@ -115,7 +115,7 @@ int wf_test(register WF_PACK *wf_pack, register const char *name) /* Test that it isn't in not-list */ for (i=not_pos ; i < wf_pack->wilds; i++) if (wild_compare(name,wf_pack->wild[i]) == 0) if (wild_compare(name,wf_pack->wild[i],0) == 0) DBUG_RETURN(1); DBUG_RETURN(0); } /* wf_test */ Loading
sql/sql_acl.cc +5 −5 Original line number Diff line number Diff line Loading @@ -834,7 +834,7 @@ static void acl_insert_db(const char *user, const char *host, const char *db, */ ulong acl_get(const char *host, const char *ip, const char *bin_ip, const char *user, const char *db) const char *user, const char *db, my_bool db_is_pattern) { ulong host_access,db_access; uint i,key_length; Loading Loading @@ -868,7 +868,7 @@ ulong acl_get(const char *host, const char *ip, const char *bin_ip, { if (compare_hostname(&acl_db->host,host,ip)) { if (!acl_db->db || !wild_compare(db,acl_db->db)) if (!acl_db->db || !wild_compare(db,acl_db->db,db_is_pattern)) { db_access=acl_db->access; if (acl_db->host.hostname) Loading @@ -890,7 +890,7 @@ ulong acl_get(const char *host, const char *ip, const char *bin_ip, ACL_HOST *acl_host=dynamic_element(&acl_hosts,i,ACL_HOST*); if (compare_hostname(&acl_host->host,host,ip)) { if (!acl_host->db || !wild_compare(db,acl_host->db)) if (!acl_host->db || !wild_compare(db,acl_host->db,0)) { host_access=acl_host->access; // Fully specified. Take it break; Loading Loading @@ -1222,7 +1222,7 @@ static bool compare_hostname(const acl_host_and_ip *host, const char *hostname, } return (!host->hostname || (hostname && !wild_case_compare(hostname,host->hostname)) || (ip && !wild_compare(ip,host->hostname))); (ip && !wild_compare(ip,host->hostname,0))); } Loading Loading @@ -1300,7 +1300,7 @@ static bool test_if_create_new_users(THD *thd) tl.db= (char*) "mysql"; tl.real_name= (char*) "user"; db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr, thd->priv_user, tl.db); thd->priv_user, tl.db, 0); if (!(db_access & INSERT_ACL)) { if (check_grant(thd,INSERT_ACL,&tl,0,1)) Loading
sql/sql_acl.h +1 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ my_bool acl_init(THD *thd, bool dont_read_acl_tables); void acl_reload(THD *thd); void acl_free(bool end=0); ulong acl_get(const char *host, const char *ip, const char *bin_ip, const char *user, const char *db); const char *user, const char *db, my_bool db_is_pattern); ulong acl_getroot(THD *thd, const char *host, const char *ip, const char *user, const char *password,const char *scramble, char **priv_user, char *priv_host, Loading