fielding 96/12/01 05:48:23
Modified: src mod_access.c Log: Fix bug reported by Dean Gaudet regarding hostnames which begin with a digit being improperly treated as IP addresses in find_allowdeny. Reviewed by: Randy Terbush, Chuck Murcko Revision Changes Path 1.11 +21 -9 apache/src/mod_access.c Index: mod_access.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_access.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C3 -r1.10 -r1.11 *** mod_access.c 1996/11/18 19:40:49 1.10 --- mod_access.c 1996/12/01 13:48:23 1.11 *************** *** 167,178 **** return (what[l] == '\0' || what[l] == '.'); } int find_allowdeny (request_rec *r, array_header *a, int method) { allowdeny *ap = (allowdeny *)a->elts; int mmask = (1 << method); ! int i, gothost=0; ! const char *remotehost=NULL; for (i = 0; i < a->nelts; ++i) { if (!(mmask & ap[i].limited)) --- 167,185 ---- return (what[l] == '\0' || what[l] == '.'); } + static int is_ip(const char *host) + { + while (*host && ((*host == '.') || isdigit(*host))) host++; + return (*host == '\0'); + } + int find_allowdeny (request_rec *r, array_header *a, int method) { allowdeny *ap = (allowdeny *)a->elts; int mmask = (1 << method); ! int i; ! int gothost = 0; ! const char *remotehost = NULL; for (i = 0; i < a->nelts; ++i) { if (!(mmask & ap[i].limited)) *************** *** 191,205 **** if (!strcmp (ap[i].from, "all")) return 1; ! if (!gothost) ! { remotehost = get_remote_host(r->connection, r->per_dir_config, ! REMOTE_HOST); ! gothost = 1; } ! if (remotehost != NULL && isalpha(remotehost[0])) ! if (in_domain(ap[i].from, remotehost)) ! return 1; if (in_ip (ap[i].from, r->connection->remote_ip)) return 1; } --- 198,217 ---- if (!strcmp (ap[i].from, "all")) return 1; ! ! if (!gothost) { remotehost = get_remote_host(r->connection, r->per_dir_config, ! REMOTE_HOST); ! ! if ((remotehost == NULL) || is_ip(remotehost)) ! gothost = 1; ! else ! gothost = 2; } ! ! if ((gothost == 2) && in_domain(ap[i].from, remotehost)) ! return 1; ! if (in_ip (ap[i].from, r->connection->remote_ip)) return 1; }