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

Reply via email to