Author: rjung Date: Sun Dec 21 15:01:13 2014 New Revision: 1647149 URL: http://svn.apache.org/r1647149 Log: Add more checks for shared memory allocation.
Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c tomcat/jk/trunk/native/common/jk_lb_worker.c tomcat/jk/trunk/native/common/jk_shm.c tomcat/jk/trunk/native/common/jk_shm.h tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1647149&r1=1647148&r2=1647149&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_ajp_common.c (original) +++ tomcat/jk/trunk/native/common/jk_ajp_common.c Sun Dec 21 15:01:13 2014 @@ -3070,7 +3070,7 @@ int JK_METHOD ajp_worker_factory(jk_work *w = &aw->worker; - aw->s = jk_shm_alloc_ajp_worker(&aw->p, name); + aw->s = jk_shm_alloc_ajp_worker(&aw->p, name, l); if (!aw->s) { jk_close_pool(&aw->p); free(aw); Modified: tomcat/jk/trunk/native/common/jk_lb_worker.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_lb_worker.c?rev=1647149&r1=1647148&r2=1647149&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_lb_worker.c (original) +++ tomcat/jk/trunk/native/common/jk_lb_worker.c Sun Dec 21 15:01:13 2014 @@ -1686,7 +1686,7 @@ static int JK_METHOD validate(jk_worker_ } memset(p->lb_workers, 0, num_of_workers * sizeof(lb_sub_worker_t)); for (i = 0; i < num_of_workers; i++) { - p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p, p->s->h.id, worker_names[i]); + p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p, p->s->h.id, worker_names[i], l); if (p->lb_workers[i].s == NULL) { jk_log(l, JK_LOG_ERROR, "allocating lb sub worker record from shared memory"); @@ -1954,7 +1954,7 @@ int JK_METHOD lb_worker_factory(jk_worke private_data->buf, sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); - private_data->s = jk_shm_alloc_lb_worker(&private_data->p, name); + private_data->s = jk_shm_alloc_lb_worker(&private_data->p, name, l); if (!private_data->s) { free(private_data); JK_TRACE_EXIT(l); Modified: tomcat/jk/trunk/native/common/jk_shm.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.c?rev=1647149&r1=1647148&r2=1647149&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_shm.c (original) +++ tomcat/jk/trunk/native/common/jk_shm.c Sun Dec 21 15:01:13 2014 @@ -89,10 +89,41 @@ static HANDLE jk_shm_hlock = NULL; #endif static int jk_shm_inited_cs = 0; +static size_t jk_shm_calculate_slot_size() +{ + int align = 64; + size_t slot_size = 0; + size_t this_size = 0; + + this_size = sizeof(jk_shm_header_data_t); + if (this_size > slot_size) + slot_size = this_size; + + this_size = sizeof(jk_shm_worker_header_t); + if (this_size > slot_size) + slot_size = this_size; + + this_size = sizeof(jk_shm_ajp_worker_t); + if (this_size > slot_size) + slot_size = this_size; + + this_size = sizeof(jk_shm_lb_sub_worker_t); + if (this_size > slot_size) + slot_size = this_size; + + this_size = sizeof(jk_shm_lb_worker_t); + if (this_size > slot_size) + slot_size = this_size; + + slot_size = JK_ALIGN(slot_size, align); + return slot_size; +} + /* Calculate needed shm size */ int jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l) { char **worker_list; + size_t needed_slot_size = 0; unsigned int i; unsigned int num_of_workers; int num_of_ajp_workers = 0; @@ -108,6 +139,17 @@ int jk_shm_calculate_size(jk_map_t *init JK_TRACE_EXIT(l); return 0; } + needed_slot_size = jk_shm_calculate_slot_size(); + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, "JK_SHM_SLOT_SIZE defined as %d, need at least %d", + JK_SHM_SLOT_SIZE , needed_slot_size); + if (needed_slot_size > JK_SHM_SLOT_SIZE) { + jk_log(l, JK_LOG_ERROR, + "JK_SHM_SLOT_SIZE %d is to small, need at least %d", + JK_SHM_SLOT_SIZE, needed_slot_size); + JK_TRACE_EXIT(l); + return 0; + } for (i = 0; i < num_of_workers; i++) { const char *type = jk_get_worker_type(init_data, worker_list[i]); @@ -763,7 +805,8 @@ void jk_shm_close(jk_logger_t *l) #endif jk_shm_worker_header_t *jk_shm_alloc_worker(jk_pool_t *p, int type, - int parent_id, const char *name) + int parent_id, const char *name, + jk_logger_t *l) { unsigned int i; jk_shm_worker_header_t *w = 0; @@ -793,6 +836,9 @@ jk_shm_worker_header_t *jk_shm_alloc_wor else { /* No more free memory left. */ + jk_log(l, JK_LOG_ERROR, + "Could not allocate shared memory for worker %s", + name); w = NULL; } jk_shm_unlock(); @@ -889,20 +935,23 @@ int jk_shm_unlock() return rc; } -jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p, const char *name) +jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p, const char *name, + jk_logger_t *l) { return (jk_shm_ajp_worker_t *)jk_shm_alloc_worker(p, - JK_AJP13_WORKER_TYPE, 0, name); + JK_AJP13_WORKER_TYPE, 0, name, l); } -jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p, int lb_id, const char *name) +jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p, int lb_id, const char *name, + jk_logger_t *l) { return (jk_shm_lb_sub_worker_t *)jk_shm_alloc_worker(p, - JK_LB_SUB_WORKER_TYPE, lb_id, name); + JK_LB_SUB_WORKER_TYPE, lb_id, name, l); } -jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p, const char *name) +jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p, const char *name, + jk_logger_t *l) { return (jk_shm_lb_worker_t *)jk_shm_alloc_worker(p, - JK_LB_WORKER_TYPE, 0, name); + JK_LB_WORKER_TYPE, 0, name, l); } Modified: tomcat/jk/trunk/native/common/jk_shm.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.h?rev=1647149&r1=1647148&r2=1647149&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_shm.h (original) +++ tomcat/jk/trunk/native/common/jk_shm.h Sun Dec 21 15:01:13 2014 @@ -202,27 +202,24 @@ void jk_shm_close(jk_logger_t *l); */ int jk_shm_attach(const char *fname, int sz, jk_logger_t *l); -/* allocate shm memory - * If there is no shm present the pool will be used instead - */ -jk_shm_worker_header_t *jk_shm_alloc_worker(jk_pool_t *p, int type, - int parent_id, const char *name); - /* allocate shm ajp worker record * If there is no shm present the pool will be used instead */ -jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p, const char *name); +jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p, const char *name, + jk_logger_t *l); /* allocate shm lb sub worker record * If there is no shm present the pool will be used instead */ jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p, - int lb_id, const char *name); + int lb_id, const char *name, + jk_logger_t *l); /* allocate shm lb worker record * If there is no shm present the pool will be used instead */ -jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p, const char *name); +jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p, const char *name, + jk_logger_t *l); /* Return workers.properties last modified time */ Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1647149&r1=1647148&r2=1647149&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Sun Dec 21 15:01:13 2014 @@ -86,6 +86,9 @@ "CollapseSlashesUnmount") and via property "collapse_slashes" for IIS (values "all", "none", "unmount"). (rjung) </add> + <add> + Add more checks for shared memory allocation. (rjung) + </add> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org