Sat, 21 Jan 2017 12:46:31 +0100
fixes socket fd leak when SSL_accept fails
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2013 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <ucx/string.h> #include "../public/nsapi.h" #include "object.h" #include "pool.h" #include "../daemon/func.h" httpd_object* object_new(pool_handle_t *pool, char *name) { // TODO: Speicherverwaltung httpd_object *obj = pool_malloc(pool, sizeof(httpd_object)); obj->pool = pool; obj->name = name; obj->path = NULL; // create directive table obj->dt = pool_calloc(pool, NUM_NSAPI_TYPES - 1, sizeof(struct dtable)); obj->nd = NUM_NSAPI_TYPES - 1; return obj; } void object_free(httpd_object *obj) { //free(obj->name); //free(obj->dt); } void object_add_directive(httpd_object *obj, directive *dir, int dt) { dtable *l = object_get_dtable(obj, dt); // allocate space for the new directive //l->dirs = realloc(l->dirs, (l->ndir+1)*sizeof(void*)); // TODO: use realloc directive **drs = pool_malloc(obj->pool, (l->ndir+1)*sizeof(void*)); for(int i=0;i<l->ndir;i++) { drs[i] = l->dirs[i]; } if(l->dirs != NULL) { pool_free(obj->pool, l->dirs); } l->dirs = drs; // add directive l->dirs[l->ndir] = dir; l->ndir++; } /* objset functions */ httpd_objset* objset_create(pool_handle_t *pool) { httpd_objset *os = pool_malloc(pool, sizeof(httpd_objset)); os->obj = pool_calloc(pool, 2, sizeof(void*)); os->pos = 0; return os; } void objset_add_object(pool_handle_t *p, httpd_objset *os, httpd_object *obj) { if(os->pos != 0 && os->pos % 2 == 0) { os->obj = pool_realloc(p, os->obj, (os->pos + 2) * sizeof(void*)); } os->obj[os->pos] = obj; os->pos++; } void httpobjconf_add_object(HTTPObjectConfig *conf, httpd_object *obj) { conf->nobj++; conf->objects = realloc(conf->objects, conf->nobj * sizeof(void*)); conf->objects[conf->nobj - 1] = obj; } void nsapi_context_next_stage(NSAPIContext *context) { context->dtable_index = 0; context->objset_index = -1; context->last_req_code = REQ_NOACTION; } Condition* condition_from_str(pool_handle_t *pool, char *expr, size_t len) { Condition *cond = pool_malloc(pool, sizeof(Condition)); cond->expression = NULL; cond->parent = NULL; cond->index = 0; printf("Expression: {"); fwrite(expr, len, 1, stdout); printf("}\n"); cond->expression = expression_from_str(pool, expr, len); return cond; } Expression* expression_from_str(pool_handle_t *pool, char *expr, size_t len) { return NULL; } int condition_evaluate(Condition *condition, Session *sn, Request *rq) { return 1; }