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: [email protected]
For additional commands, e-mail: [email protected]