Author: rjung Date: Sun Jun 24 03:33:27 2007 New Revision: 550203 URL: http://svn.apache.org/viewvc?view=rev&rev=550203 Log: Common: Refactored and unified jk_map_read_prop* and jk_map_load_prop* for all use cases.
Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c tomcat/connectors/trunk/jk/native/common/jk_map.c tomcat/connectors/trunk/jk/native/common/jk_map.h tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c tomcat/connectors/trunk/jk/native/netscape/jk_nsapi_plugin.c tomcat/connectors/trunk/jk/native/nt_service/jk_nt_service.c tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Jun 24 03:33:27 2007 @@ -1822,7 +1822,8 @@ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module); - if (jk_map_read_property(conf->worker_properties, line, 1, conf->log) == JK_FALSE) + if (jk_map_read_property(conf->worker_properties, line, + JK_MAP_HANDLE_DUPLICATES, conf->log) == JK_FALSE) return ap_pstrcat(cmd->temp_pool, "Invalid JkWorkerProperty ", line, NULL); return NULL; @@ -2628,7 +2629,8 @@ */ if ((conf->worker_file != NULL) && - !jk_map_read_properties(init_map, conf->worker_file, NULL, 1, conf->log)) { + !jk_map_read_properties(init_map, conf->worker_file, NULL, + JK_MAP_HANDLE_DUPLICATES, conf->log)) { jk_error_exit(APLOG_MARK, APLOG_EMERG | APLOG_NOERRNO, s, p, "Error in reading worker properties from '%s'", conf->worker_file); Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Jun 24 03:33:27 2007 @@ -1859,7 +1859,8 @@ return err_string; } - if (jk_map_read_property(conf->worker_properties, line, 1, conf->log) == JK_FALSE) + if (jk_map_read_property(conf->worker_properties, line, + JK_MAP_HANDLE_DUPLICATES, conf->log) == JK_FALSE) return apr_pstrcat(cmd->temp_pool, "Invalid JkWorkerProperty ", line, NULL); return NULL; @@ -2746,7 +2747,8 @@ jk_set_worker_def_cache_size(mpm_threads); if ((conf->worker_file != NULL) && - !jk_map_read_properties(init_map, conf->worker_file, NULL, 1, conf->log)) { + !jk_map_read_properties(init_map, conf->worker_file, NULL, + JK_MAP_HANDLE_DUPLICATES, conf->log)) { ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, "Error in reading worker properties from '%s'", conf->worker_file); Modified: tomcat/connectors/trunk/jk/native/common/jk_map.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_map.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_map.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_map.c Sun Jun 24 03:33:27 2007 @@ -395,7 +395,66 @@ return rc; } -int jk_map_read_property(jk_map_t *m, const char *str, int allow_duplicates, jk_logger_t *l) + +static int jk_map_validate_property(char *prp, jk_logger_t *l) +{ + int off = (int)strlen(prp) - (int)JK_MAP_REFERENCE_SZ; + /* check the worker properties */ + if (off <= 0 || strncmp(&prp[off], JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ) ) { + if (!jk_is_valid_property(prp)) { + jk_log(l, JK_LOG_ERROR, + "The attribute '%s' is not supported - please check" + " the documentation for the supported attributes.", + prp); + return JK_FALSE; + } + if (jk_is_deprecated_property(prp)) { + jk_log(l, JK_LOG_WARNING, + "The attribute '%s' is deprecated - please check" + " the documentation for the correct replacement.", + prp); + } + } + return JK_TRUE; +} + +static int jk_map_handle_duplicates(jk_map_t *m, const char *prp, char *v, + int treatment, jk_logger_t *l) +{ + const char *oldv = jk_map_get_string(m, prp, NULL); + if (oldv) { + if ((treatment == JK_MAP_HANDLE_DUPLICATES) + && jk_is_unique_property(prp) == JK_FALSE) { + char *tmpv = jk_pool_alloc(&m->p, + strlen(v) + strlen(oldv) + 3); + if (tmpv) { + char sep = '*'; + if (jk_is_path_property(prp)) + sep = PATH_SEPERATOR; + else if (jk_is_cmd_line_property(prp)) + sep = ' '; + else if (jk_is_list_property(prp)) + sep = ','; + sprintf(tmpv, "%s%c%s", oldv, sep, v); + } + v = tmpv; + return JK_FALSE; + } + else { + jk_log(l, JK_LOG_WARNING, + "Duplicate key '%s' detected - previous value '%s'" + " will be overwritten with '%s'.", + prp, oldv ? oldv : "(null)", v ? v : "(null)"); + return JK_TRUE; + } + } + else { + return JK_TRUE; + } +} + +int jk_map_read_property(jk_map_t *m, const char *str, + int treatment, jk_logger_t *l) { int rc = JK_TRUE; char buf[LENGTH_OF_LINE + 1]; @@ -417,52 +476,15 @@ trim(prp); trim(v); if (strlen(v) && strlen(prp)) { - const char *oldv; - int off = (int)strlen(prp) - (int)JK_MAP_REFERENCE_SZ; - /* check the worker properties */ - if (off <= 0 || strncmp(&prp[off], JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ) ) { - if (!jk_is_valid_property(prp)) { - jk_log(l, JK_LOG_ERROR, - "The attribute '%s' is not supported - please check" - " the documentation for the supported attributes.", - prp); - return JK_FALSE; - } - if (jk_is_deprecated_property(prp)) { - jk_log(l, JK_LOG_WARNING, - "The attribute '%s' is deprecated - please check" - " the documentation for the correct replacement.", - prp); - } - } - oldv = jk_map_get_string(m, prp, NULL); - v = jk_map_replace_properties(m, v); - if (oldv) { - if (allow_duplicates && jk_is_unique_property(prp) == JK_FALSE) { - char *tmpv = jk_pool_alloc(&m->p, - strlen(v) + strlen(oldv) + 3); - if (tmpv) { - char sep = '*'; - if (jk_is_path_property(prp)) - sep = PATH_SEPERATOR; - else if (jk_is_cmd_line_property(prp)) - sep = ' '; - else if (jk_is_list_property(prp)) - sep = ','; - sprintf(tmpv, "%s%c%s", oldv, sep, v); - } - v = tmpv; - } - else { - jk_log(l, JK_LOG_WARNING, - "Duplicate key '%s' detected - previous value '%s'" - " will be overwritten with '%s'.", - prp, oldv ? oldv : "(null)", v ? v : "(null)"); - v = jk_pool_strdup(&m->p, v); - } + if (treatment == JK_MAP_HANDLE_RAW) { + v = jk_pool_strdup(&m->p, v); } else { - v = jk_pool_strdup(&m->p, v); + if (jk_map_validate_property(prp, l) == JK_FALSE) + return JK_FALSE; + v = jk_map_replace_properties(m, v); + if (jk_map_handle_duplicates(m, prp, v, treatment, l) == JK_TRUE) + v = jk_pool_strdup(&m->p, v); } if (v) { jk_map_put(m, prp, v, NULL); @@ -478,7 +500,8 @@ } -int jk_map_read_properties(jk_map_t *m, const char *f, time_t *modified, int allow_duplicates, jk_logger_t *l) +int jk_map_read_properties(jk_map_t *m, const char *f, time_t *modified, + int treatment, jk_logger_t *l) { int rc = JK_FALSE; @@ -502,7 +525,7 @@ while (NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) { trim_prp_comment(prp); if (*prp) { - if ((rc = jk_map_read_property(m, prp, allow_duplicates, l)) == JK_FALSE) + if ((rc = jk_map_read_property(m, prp, treatment, l)) == JK_FALSE) break; } } @@ -806,78 +829,3 @@ } return rc; } - -int jk_map_load_property(jk_map_t *m, const char *str, jk_logger_t *l) -{ - int rc = JK_TRUE; - char buf[LENGTH_OF_LINE + 1]; - char *prp = &buf[0]; - - if (strlen(str) > LENGTH_OF_LINE) { - jk_log(l, JK_LOG_WARNING, - "Line to long (%d > %d), ignoring entry", - strlen(str), LENGTH_OF_LINE); - return JK_FALSE; - } - - strcpy(prp, str); - if (trim(prp)) { - char *v = strchr(prp, '='); - if (v) { - *v = '\0'; - v++; - trim(prp); - trim(v); - if (strlen(v) && strlen(prp)) { - v = jk_pool_strdup(&m->p, v); - if (v) { - jk_map_put(m, prp, v, NULL); - } - else { - JK_LOG_NULL_PARAMS(l); - rc = JK_FALSE; - } - } - } - } - return rc; -} - - -int jk_map_load_properties(jk_map_t *m, const char *f, time_t *modified, jk_logger_t *l) -{ - int rc = JK_FALSE; - - if (m && f) { - FILE *fp; - struct stat statbuf; - if (jk_stat(f, &statbuf) == -1) - return JK_FALSE; -#if defined(AS400) && !defined(AS400_UTF8) - fp = fopen(f, "r, o_ccsid=0"); -#else - fp = fopen(f, "r"); -#endif - - if (fp) { - char buf[LENGTH_OF_LINE + 1]; - char *prp; - - rc = JK_TRUE; - - while (NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) { - trim_prp_comment(prp); - if (*prp) { - if ((rc = jk_map_load_property(m, prp, l)) == JK_FALSE) - break; - } - } - fclose(fp); - if (modified) - *modified = statbuf.st_mtime; - } - } - - return rc; -} - Modified: tomcat/connectors/trunk/jk/native/common/jk_map.h URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_map.h?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_map.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_map.h Sun Jun 24 03:33:27 2007 @@ -30,6 +30,9 @@ { #endif /* __cplusplus */ +#define JK_MAP_HANDLE_NORMAL 0 +#define JK_MAP_HANDLE_DUPLICATES 1 +#define JK_MAP_HANDLE_RAW 2 struct jk_map; typedef struct jk_map jk_map_t; @@ -67,19 +70,15 @@ int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old); -int jk_map_read_property(jk_map_t *m, const char *str, int allow_duplicates, jk_logger_t *l); +int jk_map_read_property(jk_map_t *m, const char *str, int treatment, jk_logger_t *l); -int jk_map_read_properties(jk_map_t *m, const char *f, time_t *modified, int allow_duplicates, jk_logger_t *l); +int jk_map_read_properties(jk_map_t *m, const char *f, time_t *modified, int treatment, jk_logger_t *l); int jk_map_size(jk_map_t *m); const char *jk_map_name_at(jk_map_t *m, int idex); void *jk_map_value_at(jk_map_t *m, int idex); - -int jk_map_load_property(jk_map_t *m, const char *str, jk_logger_t *l); - -int jk_map_load_properties(jk_map_t *m, const char *f, time_t *modified, jk_logger_t *l); /** * Replace $(property) in value. Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Sun Jun 24 03:33:27 2007 @@ -664,8 +664,8 @@ jk_map_t *map; jk_map_alloc(&map); - if (jk_map_read_properties(map, uw_map->fname, - &uw_map->modified, 0, l)) { + if (jk_map_read_properties(map, uw_map->fname, &uw_map->modified, + JK_MAP_HANDLE_NORMAL, l)) { int i; if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Sun Jun 24 03:33:27 2007 @@ -1691,7 +1691,8 @@ } if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) { - if (jk_map_load_properties(rewrite_map, rewrite_rule_file, NULL, logger)) { + if (jk_map_read_properties(rewrite_map, rewrite_rule_file, + NULL, JK_MAP_HANDLE_RAW, logger)) { int i; if (JK_IS_DEBUG_LEVEL(logger)) { jk_log(logger, JK_LOG_DEBUG, "Loaded rewrite rule file %s.", @@ -1744,7 +1745,8 @@ if (rc) { rc = JK_FALSE; if (jk_map_alloc(&workers_map)) { - if (jk_map_read_properties(workers_map, worker_file, NULL, 1, logger)) { + if (jk_map_read_properties(workers_map, worker_file, NULL, + JK_MAP_HANDLE_DUPLICATES, logger)) { /* we add the URI->WORKER MAP since workers using AJP14 will feed it */ if (jk_map_resolve_references(workers_map, "worker.", 1, 1, logger) == JK_FALSE) { @@ -1816,7 +1818,8 @@ jk_map_t *map = NULL; if (jk_map_alloc(&map)) { - if (jk_map_read_properties(map, ini_file_name, NULL, 1, logger)) { + if (jk_map_read_properties(map, ini_file_name, NULL, + JK_MAP_HANDLE_DUPLICATES, logger)) { using_ini_file = JK_TRUE; src = map; } Modified: tomcat/connectors/trunk/jk/native/netscape/jk_nsapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/netscape/jk_nsapi_plugin.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/netscape/jk_nsapi_plugin.c (original) +++ tomcat/connectors/trunk/jk/native/netscape/jk_nsapi_plugin.c Sun Jun 24 03:33:27 2007 @@ -265,7 +265,8 @@ jk_shm_open(shm_file, JK_SHM_DEF_SIZE, logger); if (jk_map_alloc(&init_map)) { - if (jk_map_read_properties(init_map, worker_prp_file, NULL, 1, logger)) { + if (jk_map_read_properties(init_map, worker_prp_file, NULL, + JK_MAP_HANDLE_DUPLICATES, logger)) { int sleep_cnt; SYS_THREAD s; Modified: tomcat/connectors/trunk/jk/native/nt_service/jk_nt_service.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/nt_service/jk_nt_service.c?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/native/nt_service/jk_nt_service.c (original) +++ tomcat/connectors/trunk/jk/native/nt_service/jk_nt_service.c Sun Jun 24 03:33:27 2007 @@ -956,7 +956,8 @@ jk_map_t *init_map; if(jk_map_alloc(&init_map)) { - if(jk_map_read_properties(init_map, prp_file, NULL, 1, NULL)) { + if(jk_map_read_properties(init_map, prp_file, NULL, + JK_MAP_HANDLE_DUPLICATES, NULL)) { jk_tomcat_startup_data_t data; jk_pool_t p; jk_pool_atom_t buf[HUGE_POOL_SIZE]; Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?view=diff&rev=550203&r1=550202&r2=550203 ============================================================================== --- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Sun Jun 24 03:33:27 2007 @@ -28,6 +28,10 @@ <subsection name="Native"> <changelog> <update> + Common: Refactored and unified jk_map_read_prop* and jk_map_load_prop* + for all use cases. (rjung) + </update> + <update> Common/Apache/IIS/Netscape: Add an option to check decoded URLs for potentially malicious constructions. (rjung) </update> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]