You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gs...@locus.apache.org on 2000/04/24 10:35:57 UTC

cvs commit: apache-2.0/src/main http_config.c http_core.c

gstein      00/04/24 01:35:56

  Modified:    src/include http_config.h
               src/main http_config.c http_core.c
  Log:
  handle error messages during building and processing of the configuration.
  add missing return statements, wrap some lines, remove unused vars.
  move syntax error reporting and exit(1) back to the right place (to be
      fixed in a future pass; the exit() is inappropriate for parsing
      .htaccess files).
  
  Revision  Changes    Path
  1.15      +3 -2      apache-2.0/src/include/http_config.h
  
  Index: http_config.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/http_config.h,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- http_config.h	2000/04/22 22:54:29	1.14
  +++ http_config.h	2000/04/24 08:35:56	1.15
  @@ -305,8 +305,9 @@
   API_EXPORT(module *) ap_find_linked_module(const char *name);
   
   /* for implementing subconfigs and customized config files */
  -API_EXPORT(ap_directive_t *) ap_build_config(cmd_parms *parms, ap_directive_t *current);
  -API_EXPORT(const char *)ap_walk_config(ap_directive_t *conftree, cmd_parms *parms, void *config, int container);
  +API_EXPORT(const char *) ap_build_config(cmd_parms *parms,
  +					 ap_directive_t **conftree);
  +API_EXPORT(const char *) ap_walk_config(ap_directive_t *conftree, cmd_parms *parms, void *config, int container);
   
   /* ap_check_cmd_context() definitions: */
   API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden);
  
  
  
  1.41      +71 -40    apache-2.0/src/main/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_config.c,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- http_config.c	2000/04/22 22:54:29	1.40
  +++ http_config.c	2000/04/24 08:35:56	1.41
  @@ -831,13 +831,15 @@
       return mconfig;
   }
   
  -CORE_EXPORT(void) ap_build_config_sub(cmd_parms *parms, const char *l, ap_directive_t **current, ap_directive_t **curr_parent)
  +static const char * ap_build_config_sub(cmd_parms *parms, const char *l,
  +					ap_directive_t **current,
  +					ap_directive_t **curr_parent)
   {
       const char *args, *cmd_name;
       ap_directive_t *newdir;
   
       if ((l[0] == '#') || (!l[0]))
  -	return;
  +	return NULL;
   
   #if RESOLVE_ENV_PER_TOKEN
       args = l;
  @@ -846,7 +848,7 @@
   #endif
       cmd_name = ap_getword_conf(parms->temp_pool, &args);
       if (*cmd_name == '\0')
  -	return;
  +	return NULL;
   
       newdir = ap_pcalloc(parms->pool, sizeof(ap_directive_t));
       newdir->line_num = parms->config_file->line_number;
  @@ -872,9 +874,12 @@
       else {
           *current = ap_add_node(curr_parent, *current, newdir, 0);
       }
  +
  +    return NULL;
   }
   
  -API_EXPORT(const char *)ap_walk_config_sub(ap_directive_t *current, cmd_parms *parms, void *config)
  +static const char *ap_walk_config_sub(ap_directive_t *current,
  +				      cmd_parms *parms, void *config)
   {
       void *oldconfig;
       const command_rec *cmd;
  @@ -899,17 +904,12 @@
       } while (retval && !strcmp(retval, DECLINE_CMD));
       parms->context = oldconfig;
   
  -    if (retval) {
  -	ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  -                     "Syntax error on line %d of %s:",
  -		     parms->config_file->line_number, parms->config_file->name);
  -	ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  -                     "%s", retval);
  -	exit(1);
  -    }
  +    return retval;
   }
   
  -API_EXPORT(const char *)ap_walk_config(ap_directive_t *conftree, cmd_parms *parms, void *config, int container)
  +API_EXPORT(const char *) ap_walk_config(ap_directive_t *conftree,
  +					cmd_parms *parms, void *config,
  +					int container)
   {
       static ap_directive_t *current;
   
  @@ -921,8 +921,12 @@
       }
   
       while (current != NULL) {
  +	const char *errmsg;
  +
           /* actually parse the command and execute the correct function */
  -        ap_walk_config_sub(current, parms, config);
  +        errmsg = ap_walk_config_sub(current, parms, config);
  +	if (errmsg != NULL)
  +	    return errmsg;
   
           if (current->next == NULL) {
               current = current->parent;
  @@ -932,23 +936,33 @@
               continue;
           }
       }
  +
  +    return NULL;
   }
   
   
  -API_EXPORT(ap_directive_t *) ap_build_config(cmd_parms *parms, ap_directive_t *current)
  +API_EXPORT(const char *) ap_build_config(cmd_parms *parms,
  +					 ap_directive_t **conftree)
   {
  +    ap_directive_t *current = NULL;
       ap_directive_t *curr_parent = NULL;
  -    ap_directive_t *cfg_root = NULL;
       char l[MAX_STRING_LEN];
   
  +    *conftree = NULL;
  +
       while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
  -	ap_build_config_sub(parms, l, &current, &curr_parent);
  -        if (cfg_root == NULL && current != NULL) {
  -            cfg_root = current;
  +	const char *errmsg;
  +
  +	errmsg = ap_build_config_sub(parms, l, &current, &curr_parent);
  +	if (errmsg != NULL)
  +	    return errmsg;
  +
  +        if (*conftree == NULL && current != NULL) {
  +            *conftree = current;
           }
       }
   
  -    return cfg_root;
  +    return NULL;
   }
   
   /*
  @@ -1063,6 +1077,7 @@
       const char *errmsg;
       cmd_parms parms;
       arr_elts_param_t arr_parms;
  +    ap_directive_t *conftree;
   
       arr_parms.curr_idx = 0;
       arr_parms.array = arr;
  @@ -1075,9 +1090,10 @@
       parms.config_file = ap_pcfg_open_custom(p, "-c/-C directives",
                                            &arr_parms, NULL,
                                            arr_elts_getstr, arr_elts_close);
  -/*
  -    errmsg = ap_build_config(&parms, s->lookup_defaults);
   
  +    errmsg = ap_build_config(&parms, &conftree);
  +    if (errmsg == NULL)
  +	errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults, 0);
       if (errmsg) {
           ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
                        "Syntax error in -C/-c directive:\n%s", errmsg);
  @@ -1085,14 +1101,14 @@
       }
   
       ap_cfg_closefile(parms.config_file);
  -*/
   }
   
   void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, ap_pool_t *ptemp)
   {
       cmd_parms parms;
       ap_finfo_t finfo;
  -    ap_directive_t *current = NULL;
  +    ap_directive_t *conftree;
  +    const char *errmsg;
   
       fname = ap_server_root_relative(p, fname);
   
  @@ -1118,9 +1134,20 @@
   	exit(1);
       }
   
  -    current = ap_build_config(&parms, NULL);
  -    ap_walk_config(current, &parms, s->lookup_defaults, 0);
  +    errmsg = ap_build_config(&parms, &conftree);
  +    if (errmsg == NULL)
  +	errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults, 0);
   
  +    if (errmsg != NULL) {
  +	/* ### wrong line number. need to pull from ap_directive_t */
  +	ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
  +                     "Syntax error on line %d of %s:",
  +		     parms.config_file->line_number, parms.config_file->name);
  +	ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
  +                     "%s", errmsg);
  +	exit(1);
  +    }
  +
       ap_cfg_closefile(parms.config_file);
   }
   
  @@ -1130,13 +1157,11 @@
   {
       configfile_t *f = NULL;
       cmd_parms parms;
  -    const char *errmsg = NULL;
       char *filename = NULL;
       const struct htaccess_result *cache;
       struct htaccess_result *new;
       void *dc = NULL;
       ap_status_t status;
  -    ap_directive_t *htaccess_tree = NULL;
   
   /* firstly, search cache */
       for (cache = r->htaccess; cache != NULL; cache = cache->next)
  @@ -1161,13 +1186,16 @@
           status = ap_pcfg_openfile(&f, r->pool, filename);
   
           if (status == APR_SUCCESS) {
  +	    const char *errmsg;
  +	    ap_directive_t *conftree;
   
               dc = ap_create_per_dir_config(r->pool);
   
               parms.config_file = f;
   
  -            htaccess_tree = ap_build_config(&parms, NULL);
  -            ap_walk_config(htaccess_tree, &parms, dc, 0);
  +            errmsg = ap_build_config(&parms, &conftree);
  +	    if (errmsg == NULL)
  +		errmsg = ap_walk_config(conftree, &parms, dc, 0);
   
               ap_cfg_closefile(f);
   
  @@ -1178,16 +1206,19 @@
               }
               *result = dc;
               break;
  -        }
  -        else if (status != APR_ENOENT && status != APR_ENOTDIR) {
  -            ap_log_rerror(APLOG_MARK, APLOG_CRIT, errno, r,
  -                          "%s pcfg_openfile: unable to check htaccess file, "
  -                          "ensure it is readable",
  -                          filename);
  -            ap_table_setn(r->notes, "error-notes",
  -                          "Server unable to read htaccess file, denying "
  -                          "access to be safe");
  -            return HTTP_FORBIDDEN;
  +        } else {
  +	    ap_status_t cerr = ap_canonical_error(status);
  +
  +	    if (cerr != APR_ENOENT && cerr != APR_ENOTDIR) {
  +		ap_log_rerror(APLOG_MARK, APLOG_CRIT, status, r,
  +			      "%s pcfg_openfile: unable to check htaccess file, "
  +			      "ensure it is readable",
  +			      filename);
  +		ap_table_setn(r->notes, "error-notes",
  +			      "Server unable to read htaccess file, denying "
  +			      "access to be safe");
  +		return HTTP_FORBIDDEN;
  +	    }
           }
       }
   
  
  
  
  1.51      +17 -16    apache-2.0/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_core.c,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- http_core.c	2000/04/23 02:32:58	1.50
  +++ http_core.c	2000/04/24 08:35:56	1.51
  @@ -1437,8 +1437,10 @@
       old_end_token = cmd->end_token;
       cmd->end_token = thiscmd->cmd_data ? end_directorymatch_section : end_directory_section;
   
  -    ap_walk_config(NULL, cmd, new_dir_conf, 1);
  +    errmsg = ap_walk_config(NULL, cmd, new_dir_conf, 1);
       cmd->end_token = old_end_token;
  +    if (errmsg != NULL)
  +	return errmsg;
   
       conf = (core_dir_config *)ap_get_module_config(new_dir_conf, &core_module);
       conf->r = r;
  @@ -1496,8 +1498,10 @@
       cmd->end_token = thiscmd->cmd_data ? end_locationmatch_section
                                          : end_location_section;
   
  -    ap_walk_config(NULL, cmd, new_url_conf, 1);
  -    cmd->end_token = old_end_token; 
  +    errmsg = ap_walk_config(NULL, cmd, new_url_conf, 1);
  +    cmd->end_token = old_end_token;
  +    if (errmsg != NULL)
  +	return errmsg;
   
       conf = (core_dir_config *)ap_get_module_config(new_url_conf, &core_module);
       conf->d = ap_pstrdup(cmd->pool, cmd->path);	/* No mangling, please */
  @@ -1563,8 +1567,10 @@
       old_end_token = cmd->end_token;
       cmd->end_token = thiscmd->cmd_data ? end_filesmatch_section : end_files_section;
   
  -    ap_walk_config(NULL, cmd, new_file_conf, 1);
  +    errmsg = ap_walk_config(NULL, cmd, new_file_conf, 1);
       cmd->end_token = old_end_token;
  +    if (errmsg != NULL)
  +	return errmsg;
   
       conf = (core_dir_config *)ap_get_module_config(new_file_conf,
   						   &core_module);
  @@ -1598,10 +1604,8 @@
   static const char *start_ifmod(cmd_parms *cmd, void *dummy, char *arg)
   {
       char *endp = strrchr(arg, '>');
  -    char l[MAX_STRING_LEN];
       int not = (arg[0] == '!');
       module *found;
  -    int nest = 1;
   
       if (endp == NULL) {
   	return unclosed_directive(cmd);
  @@ -1616,9 +1620,10 @@
       found = ap_find_linked_module(arg);
   
       if ((!not && found) || (not && !found)) {
  -        ap_walk_config(NULL, cmd, cmd->server->lookup_defaults, 1);
  -        return NULL;
  +        return ap_walk_config(NULL, cmd, cmd->server->lookup_defaults, 1);
       }
  +
  +    return NULL;
   }
   
   API_EXPORT(int) ap_exists_config_define(char *name)
  @@ -1643,10 +1648,8 @@
   static const char *start_ifdefine(cmd_parms *cmd, void *dummy, char *arg)
   {
       char *endp;
  -    char l[MAX_STRING_LEN];
       int defined;
       int not = 0;
  -    int nest = 1;
   
       endp = strrchr(arg, '>');
       if (endp == NULL) {
  @@ -1663,9 +1666,10 @@
       defined = ap_exists_config_define(arg);
   
       if ((!not && defined) || (not && !defined)) {
  -        ap_walk_config(NULL, cmd, dummy, 1);
  -        return NULL;
  +        return ap_walk_config(NULL, cmd, dummy, 1);
       }
  +
  +    return NULL;
   }
   
   /* httpd.conf commands... beginning with the <VirtualHost> business */
  @@ -1713,13 +1717,10 @@
       cmd->end_token = end_virtualhost_section;
       cmd->server = s;
   
  -    ap_walk_config(NULL, cmd, s->lookup_defaults, 1);
  +    errmsg = ap_walk_config(NULL, cmd, s->lookup_defaults, 1);
       cmd->end_token = old_end_token;
       cmd->server = main_server;
   
  -    if (errmsg == end_virtualhost_section) {
  -	return NULL;
  -    }
       return errmsg;
   }