Commit 256bada7 authored by unknown's avatar unknown
Browse files

Merge bk-internal:/home/bk/mysql-4.0/

into serg.mylan:/usr/home/serg/Abk/mysql-4.0

parents 64e98031 f1ffa139
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+45 −22
Original line number Diff line number Diff line
@@ -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)
@@ -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 */
+2 −2
Original line number Diff line number Diff line
@@ -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 */
@@ -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 */
+5 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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;
@@ -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)));
}


@@ -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))
+1 −1
Original line number Diff line number Diff line
@@ -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