summaryrefslogtreecommitdiff
path: root/modules/http/mod_mime.c
diff options
context:
space:
mode:
authorWilliam A. Rowe Jr <wrowe@apache.org>2001-08-16 20:04:32 +0000
committerWilliam A. Rowe Jr <wrowe@apache.org>2001-08-16 20:04:32 +0000
commit80d01c58612d7a754a34c67ef7c7a6b674177945 (patch)
treeb605cdc7dffc75952546b830ac980e7384e566ec /modules/http/mod_mime.c
parent7f6f1a2cdcffd978d8c49c50c57c7c77019eaf39 (diff)
downloadhttpd-80d01c58612d7a754a34c67ef7c7a6b674177945.tar.gz
Push back CHANGES to document the complete mod_mime segfault solution.
Rounded out the mod_mime Add/Remove pairs by adding RemoveLanguage and RemoveCharset directives, and rolled in the remove_items handling. This is (effectively) my complete patch, sans pool optimizations. [William Rowe] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@90239 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/http/mod_mime.c')
-rw-r--r--modules/http/mod_mime.c190
1 files changed, 98 insertions, 92 deletions
diff --git a/modules/http/mod_mime.c b/modules/http/mod_mime.c
index 55a0eab549..7d121ad76c 100644
--- a/modules/http/mod_mime.c
+++ b/modules/http/mod_mime.c
@@ -111,9 +111,11 @@ typedef struct {
apr_hash_t *extension_mappings; /* Map from extension name to
* extension_info structure */
+ apr_array_header_t *charsets_remove; /* List of charsets to remove */
+ apr_array_header_t *encodings_remove; /* List of encodings to remove */
apr_array_header_t *handlers_remove; /* List of handlers to remove */
+ apr_array_header_t *languages_remove; /* List of languages to remove */
apr_array_header_t *types_remove; /* List of MIME types to remove */
- apr_array_header_t *encodings_remove; /* List of encodings to remove */
char *type; /* Type forced with ForceType */
char *handler; /* Handler forced with SetHandler */
@@ -149,9 +151,11 @@ static void *create_mime_dir_config(apr_pool_t *p, char *dummy)
new->extension_mappings = NULL;
+ new->charsets_remove = NULL;
+ new->encodings_remove = NULL;
new->handlers_remove = NULL;
+ new->languages_remove = NULL;
new->types_remove = NULL;
- new->encodings_remove = NULL;
new->type = NULL;
new->handler = NULL;
@@ -204,15 +208,35 @@ static void overlay_extension_mappings(apr_pool_t *p,
}
}
+/* Member is the offset within an extension_info of the pointer to reset
+ */
+static void remove_items(apr_pool_t *p, apr_array_header_t *remove,
+ apr_hash_t *mappings, void *member)
+{
+ attrib_info *suffix = (attrib_info *) remove->elts;
+ int i;
+ for (i = 0; i < remove->nelts; i++) {
+ extension_info *exinfo =
+ (extension_info*)apr_hash_get(mappings,
+ suffix[i].name,
+ APR_HASH_KEY_STRING);
+ if (exinfo && *((void **)((char*)&exinfo + (apr_size_t)member))) {
+ extension_info *copyinfo = exinfo;
+ exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo));
+ apr_hash_set(mappings, suffix[i].name,
+ APR_HASH_KEY_STRING, exinfo);
+ memcpy(exinfo, copyinfo, sizeof(*exinfo));
+ *(void **)((char*)exinfo + (apr_size_t)member) = NULL;
+ }
+ }
+}
+
static void *merge_mime_dir_configs(apr_pool_t *p, void *basev, void *addv)
{
mime_dir_config *base = (mime_dir_config *) basev;
mime_dir_config *add = (mime_dir_config *) addv;
mime_dir_config *new = apr_palloc(p, sizeof(mime_dir_config));
- int i;
- attrib_info *suffix;
-
if (base->extension_mappings && add->extension_mappings) {
new->extension_mappings = apr_hash_make(p);
overlay_extension_mappings(p, base->extension_mappings,
@@ -236,62 +260,34 @@ static void *merge_mime_dir_configs(apr_pool_t *p, void *basev, void *addv)
}
}
- if (new->extension_mappings && add->handlers_remove) {
- suffix = (attrib_info *) add->handlers_remove->elts;
- for (i = 0; i < add->handlers_remove->nelts; i++) {
- extension_info *exinfo =
- (extension_info*)apr_hash_get(new->extension_mappings,
- suffix[i].name,
- APR_HASH_KEY_STRING);
- if (exinfo && exinfo->handler) {
- extension_info *copyinfo = exinfo;
- exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo));
- apr_hash_set(new->extension_mappings, suffix[i].name,
- APR_HASH_KEY_STRING, exinfo);
- memcpy(exinfo, copyinfo, sizeof(*exinfo));
- exinfo->handler = NULL;
- }
- }
- }
- new->handlers_remove = NULL;
+ if (new->extension_mappings) {
+ if (add->charsets_remove)
+ remove_items(p, add->charsets_remove, new->extension_mappings,
+ &(*(extension_info*)NULL).charset_type);
- if (new->extension_mappings && add->types_remove) {
- suffix = (attrib_info *) add->types_remove->elts;
- for (i = 0; i < add->types_remove->nelts; i++) {
- extension_info *exinfo =
- (extension_info*)apr_hash_get(new->extension_mappings,
- suffix[i].name,
- APR_HASH_KEY_STRING);
- if (exinfo && exinfo->forced_type) {
- extension_info *copyinfo = exinfo;
- exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo));
- apr_hash_set(new->extension_mappings, suffix[i].name,
- APR_HASH_KEY_STRING, exinfo);
- memcpy(exinfo, copyinfo, sizeof(*exinfo));
- exinfo->forced_type = NULL;
- }
- }
- }
- new->types_remove = NULL;
+ if (add->encodings_remove)
+ remove_items(p, add->encodings_remove, new->extension_mappings,
+ &(*(extension_info*)NULL).encoding_type);
+
+ if (add->languages_remove)
+ remove_items(p, add->languages_remove, new->extension_mappings,
+ &(*(extension_info*)NULL).language_type);
+
+ if (add->handlers_remove)
+ remove_items(p, add->handlers_remove, new->extension_mappings,
+ &(*(extension_info*)NULL).handler);
+
+ if (add->types_remove)
+ remove_items(p, add->types_remove, new->extension_mappings,
+ &(*(extension_info*)NULL).forced_type);
- if (new->extension_mappings && add->encodings_remove) {
- suffix = (attrib_info *) add->encodings_remove->elts;
- for (i = 0; i < add->encodings_remove->nelts; i++) {
- extension_info *exinfo =
- (extension_info*)apr_hash_get(new->extension_mappings,
- suffix[i].name,
- APR_HASH_KEY_STRING);
- if (exinfo && exinfo->encoding_type) {
- extension_info *copyinfo = exinfo;
- exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo));
- apr_hash_set(new->extension_mappings, suffix[i].name,
- APR_HASH_KEY_STRING, exinfo);
- memcpy(exinfo, copyinfo, sizeof(*exinfo));
- exinfo->encoding_type = NULL;
- }
- }
}
+
+ new->charsets_remove = NULL;
new->encodings_remove = NULL;
+ new->handlers_remove = NULL;
+ new->languages_remove = NULL;
+ new->types_remove = NULL;
new->type = add->type ? add->type : base->type;
new->handler = add->handler ? add->handler : base->handler;
@@ -329,13 +325,13 @@ static extension_info *add_extension_info(cmd_parms *cmd, void *m_,
return exinfo;
}
-static const char *add_type(cmd_parms *cmd, void *m, const char *value,
- const char *ext)
+static const char *add_charset(cmd_parms *cmd, void *m, const char *value,
+ const char *ext)
{
extension_info* exinfo = add_extension_info(cmd, m, ext);
- char *ct = apr_pstrdup(cmd->pool, value);
- ap_str_tolower(ct);
- exinfo->forced_type = ct;
+ char *charset = apr_pstrdup(cmd->pool, value);
+ ap_str_tolower(charset);
+ exinfo->charset_type = charset;
return NULL;
}
@@ -349,13 +345,13 @@ static const char *add_encoding(cmd_parms *cmd, void *m, const char *value,
return NULL;
}
-static const char *add_charset(cmd_parms *cmd, void *m, const char *value,
- const char *ext)
+static const char *add_handler(cmd_parms *cmd, void *m, const char *value,
+ const char *ext)
{
extension_info* exinfo = add_extension_info(cmd, m, ext);
- char *charset = apr_pstrdup(cmd->pool, value);
- ap_str_tolower(charset);
- exinfo->charset_type = charset;
+ char *hdlr = apr_pstrdup(cmd->pool, value);
+ ap_str_tolower(hdlr);
+ exinfo->handler = hdlr;
return NULL;
}
@@ -369,13 +365,13 @@ static const char *add_language(cmd_parms *cmd, void *m, const char *value,
return NULL;
}
-static const char *add_handler(cmd_parms *cmd, void *m, const char *value,
- const char *ext)
+static const char *add_type(cmd_parms *cmd, void *m, const char *value,
+ const char *ext)
{
extension_info* exinfo = add_extension_info(cmd, m, ext);
- char *hdlr = apr_pstrdup(cmd->pool, value);
- ap_str_tolower(hdlr);
- exinfo->handler = hdlr;
+ char *ct = apr_pstrdup(cmd->pool, value);
+ ap_str_tolower(ct);
+ exinfo->forced_type = ct;
return NULL;
}
@@ -402,17 +398,13 @@ static void remove_extension_info(cmd_parms *cmd,
#endif
}
-static const char *remove_handler(cmd_parms *cmd, void *m_, const char *ext)
+static const char *remove_charset(cmd_parms *cmd, void *m_, const char *ext)
{
mime_dir_config *m = (mime_dir_config *) m_;
- remove_extension_info(cmd, &m->handlers_remove, ext);
+ remove_extension_info(cmd, &m->charsets_remove, ext);
return NULL;
}
-/*
- * Just like the previous function, except that it records encoding
- * associations to be undone.
- */
static const char *remove_encoding(cmd_parms *cmd, void *m_, const char *ext)
{
mime_dir_config *m = (mime_dir_config *) m_;
@@ -420,10 +412,20 @@ static const char *remove_encoding(cmd_parms *cmd, void *m_, const char *ext)
return NULL;
}
-/*
- * Similar to the previous functions, except that it deals with filename
- * suffix/MIME-type associations.
- */
+static const char *remove_handler(cmd_parms *cmd, void *m_, const char *ext)
+{
+ mime_dir_config *m = (mime_dir_config *) m_;
+ remove_extension_info(cmd, &m->handlers_remove, ext);
+ return NULL;
+}
+
+static const char *remove_language(cmd_parms *cmd, void *m_, const char *ext)
+{
+ mime_dir_config *m = (mime_dir_config *) m_;
+ remove_extension_info(cmd, &m->languages_remove, ext);
+ return NULL;
+}
+
static const char *remove_type(cmd_parms *cmd, void *m_, const char *ext)
{
mime_dir_config *m = (mime_dir_config *) m_;
@@ -445,23 +447,30 @@ static const char *set_types_config(cmd_parms *cmd, void *dummy,
static const command_rec mime_cmds[] =
{
-AP_INIT_ITERATE2("AddType", add_type, NULL, OR_FILEINFO,
- "a mime type followed by one or more file extensions"),
-AP_INIT_ITERATE2("AddEncoding", add_encoding, NULL, OR_FILEINFO,
- "an encoding (e.g., gzip), followed by one or more file extensions"),
AP_INIT_ITERATE2("AddCharset", add_charset, NULL, OR_FILEINFO,
"a charset (e.g., iso-2022-jp), followed by one or more file extensions"),
-AP_INIT_ITERATE2("AddLanguage", add_language, NULL, OR_FILEINFO,
- "a language (e.g., fr), followed by one or more file extensions"),
+AP_INIT_ITERATE2("AddEncoding", add_encoding, NULL, OR_FILEINFO,
+ "an encoding (e.g., gzip), followed by one or more file extensions"),
AP_INIT_ITERATE2("AddHandler", add_handler, NULL, OR_FILEINFO,
"a handler name followed by one or more file extensions"),
+AP_INIT_ITERATE2("AddLanguage", add_language, NULL, OR_FILEINFO,
+ "a language (e.g., fr), followed by one or more file extensions"),
+AP_INIT_ITERATE2("AddType", add_type, NULL, OR_FILEINFO,
+ "a mime type followed by one or more file extensions"),
+AP_INIT_TAKE1("DefaultLanguage", ap_set_string_slot,
+ (void*)XtOffsetOf(mime_dir_config, default_language), OR_FILEINFO,
+ "language to use for documents with no other language file extension"),
AP_INIT_TAKE1("ForceType", ap_set_string_slot_lower,
(void *)XtOffsetOf(mime_dir_config, type), OR_FILEINFO,
"a media type"),
-AP_INIT_ITERATE("RemoveHandler", remove_handler, NULL, OR_FILEINFO,
+AP_INIT_ITERATE("RemoveCharset", remove_charset, NULL, OR_FILEINFO,
"one or more file extensions"),
AP_INIT_ITERATE("RemoveEncoding", remove_encoding, NULL, OR_FILEINFO,
"one or more file extensions"),
+AP_INIT_ITERATE("RemoveHandler", remove_handler, NULL, OR_FILEINFO,
+ "one or more file extensions"),
+AP_INIT_ITERATE("RemoveLanguage", remove_language, NULL, OR_FILEINFO,
+ "one or more file extensions"),
AP_INIT_ITERATE("RemoveType", remove_type, NULL, OR_FILEINFO,
"one or more file extensions"),
AP_INIT_TAKE1("SetHandler", ap_set_string_slot_lower,
@@ -469,9 +478,6 @@ AP_INIT_TAKE1("SetHandler", ap_set_string_slot_lower,
"a handler name"),
AP_INIT_TAKE1("TypesConfig", set_types_config, NULL, RSRC_CONF,
"the MIME types config file"),
-AP_INIT_TAKE1("DefaultLanguage", ap_set_string_slot,
- (void*)XtOffsetOf(mime_dir_config, default_language), OR_FILEINFO,
- "language to use for documents with no other language file extension"),
{NULL}
};