APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p) { apr_allocator_t *allocator = apr_pool_allocator_get(p); apr_bucket_alloc_t *list; #if APR_POOL_DEBUG /* may be NULL for debug mode. */ if (allocator == NULL) { if (apr_allocator_create(&allocator) != APR_SUCCESS) { apr_abortfunc_t fn = apr_pool_abort_get(p); if (fn) (fn)(APR_ENOMEM); abort(); } } #endif list = apr_bucket_alloc_create_ex(allocator); if (list == NULL) { apr_abortfunc_t fn = apr_pool_abort_get(p); if (fn) (fn)(APR_ENOMEM); abort(); } list->pool = p; apr_pool_cleanup_register(list->pool, list, alloc_cleanup, apr_pool_cleanup_null); return list; }
static const char *mag_name_attrs(cmd_parms *parms, void *mconfig, const char *w) { struct mag_config *cfg = (struct mag_config *)mconfig; void *tmp_na; size_t size = 0; char *p; int c; if (!cfg->name_attributes) { size = sizeof(struct mag_name_attributes) + (sizeof(struct mag_na_map) * 16); } else if (cfg->name_attributes->map_count % 16 == 0) { size = sizeof(struct mag_name_attributes) + (sizeof(struct mag_na_map) * (cfg->name_attributes->map_count + 16)); } if (size) { tmp_na = realloc(cfg->name_attributes, size); if (!tmp_na) apr_pool_abort_get(cfg->pool)(ENOMEM); if (cfg->name_attributes) { size_t empty = (sizeof(struct mag_na_map) * 16); memset(tmp_na + size - empty, 0, empty); } else { memset(tmp_na, 0, size); } cfg->name_attributes = (struct mag_name_attributes *)tmp_na; apr_pool_userdata_setn(cfg, GSS_NAME_ATTR_USERDATA, mag_name_attrs_cleanup, cfg->pool); } p = strchr(w, ' '); if (p == NULL) { if (strcmp(w, "json") == 0) { cfg->name_attributes->output_json = true; } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server, "Invalid Name Attributes value [%s].", w); } return NULL; } c = cfg->name_attributes->map_count; cfg->name_attributes->map[c].env_name = apr_pstrndup(cfg->pool, w, p-w); p++; cfg->name_attributes->map[c].attr_name = apr_pstrdup(cfg->pool, p); cfg->name_attributes->map_count += 1; return NULL; }
APR_DECLARE(apr_xml_parser *) apr_xml_parser_create_ex(apr_pool_t *pool, void *start_func, void *end_func, void *cdata_func) { apr_xml_parser *parser = apr_pcalloc(pool, sizeof(*parser)); parser->impl = apr_xml_get_parser_impl(); parser->p = pool; parser->doc = apr_pcalloc(pool, sizeof(*parser->doc)); parser->doc->namespaces = apr_array_make(pool, 5, sizeof(const char *)); /* ### is there a way to avoid hard-coding this? */ apr_xml_insert_uri(parser->doc->namespaces, APR_KW_DAV); parser->xp = XML_ParserCreate(NULL); if (parser->xp == NULL) { (*apr_pool_abort_get(pool))(APR_ENOMEM); return NULL; } apr_pool_cleanup_register(pool, parser, cleanup_parser, apr_pool_cleanup_null); XML_SetUserData(parser->xp, parser); XML_SetElementHandler(parser->xp, start_func, end_func); XML_SetCharacterDataHandler(parser->xp, cdata_func); /* Prevent the "billion laughs" attack against expat by disabling * internal entity expansion. With 2.x, forcibly stop the parser * if an entity is declared - this is safer and a more obvious * failure mode. With older versions, installing a noop * DefaultHandler means that internal entities will be expanded as * the empty string, which is also sufficient to prevent the * attack. */ #if XML_MAJOR_VERSION > 1 XML_SetEntityDeclHandler(parser->xp, entity_declaration); #else XML_SetDefaultHandler(parser->xp, default_handler); #endif return parser; }