mturk 2005/09/15 22:52:26
Modified:jk/native/common jk_lb_worker.c jk_shm.c jk_shm.h
jk_status.c
Log:
Fix bug #36525 by properly aligning shared memory header struct.
This patch was provided and investigated by Rainer Jung. Thaks!
Also bring back 64 bit sizes, because the problem was not with them,
but rather they've cause different struct alignment.
Revision ChangesPath
1.94 +5 -5 jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c
Index: jk_lb_worker.c
===
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- jk_lb_worker.c14 Sep 2005 06:50:14 - 1.93
+++ jk_lb_worker.c16 Sep 2005 05:52:26 - 1.94
@@ -225,8 +225,8 @@
{
unsigned int i;
int total_factor = 0;
-size_t mytraffic = 0;
-size_t curmin = 0;
+jk_u64_t mytraffic = 0;
+jk_u64_t curmin = 0;
worker_record_t *candidate = NULL;
if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
@@ -328,8 +328,8 @@
jk_logger_t *l)
{
unsigned int i;
-size_t mytraffic = 0;
-size_t curmin = 0;
+jk_u64_t mytraffic = 0;
+jk_u64_t curmin = 0;
worker_record_t *candidate = NULL;
double diff;
time_t now = time(NULL);
1.20 +33 -22jakarta-tomcat-connectors/jk/native/common/jk_shm.c
Index: jk_shm.c
===
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- jk_shm.c 12 Sep 2005 12:53:05 - 1.19
+++ jk_shm.c 16 Sep 2005 05:52:26 - 1.20
@@ -26,8 +26,8 @@
#include "jk_mt.h"
#include "jk_shm.h"
-/** jk shm header record structure */
-struct jk_shm_header
+/** jk shm header core data structure */
+struct jk_shm_header_data
{
/* Shared memory magic JK_SHM_MAGIC */
char magic[8];
@@ -36,6 +36,17 @@
unsigned int childs;
unsigned int workers;
time_t modified;
+};
+
+typedef struct jk_shm_header_data jk_shm_header_data_t;
+
+/** jk shm header record structure */
+struct jk_shm_header
+{
+union {
+jk_shm_header_data_t data;
+char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))];
+};
char buf[1];
};
@@ -116,13 +127,13 @@
jk_shmem.filename = "memory";
jk_shmem.fd = 0;
jk_shmem.attached = 0;
-memcpy(jk_shmem.hdr->magic, shm_signature, 8);
-jk_shmem.hdr->size = sz;
+memcpy(jk_shmem.hdr->data.magic, shm_signature, 8);
+jk_shmem.hdr->data.size = sz;
JK_INIT_CS(&(jk_shmem.cs), rc);
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Initialized shared memory size=%u free=%u addr=%#lx",
- jk_shmem.size, jk_shmem.hdr->size, jk_shmem.hdr);
+ jk_shmem.size, jk_shmem.hdr->data.size, jk_shmem.hdr);
JK_TRACE_EXIT(l);
return 0;
}
@@ -132,12 +143,12 @@
JK_TRACE_ENTER(l);
if (!jk_shm_open(fname, sz, l)) {
jk_shmem.attached = 1;
-jk_shmem.hdr->childs++;
+jk_shmem.hdr->data.childs++;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Attached shared memory [%d] size=%u free=%u addr=%#lx",
- jk_shmem.hdr->childs, jk_shmem.hdr->size,
- jk_shmem.hdr->size - jk_shmem.hdr->pos,
+ jk_shmem.hdr->data.childs, jk_shmem.hdr->data.size,
+ jk_shmem.hdr->data.size - jk_shmem.hdr->data.pos,
jk_shmem.hdr);
JK_TRACE_EXIT(l);
return 0;
@@ -306,20 +317,20 @@
/* Clear shared memory */
if (!attached) {
memset(jk_shmem.hdr, 0, jk_shmem.size);
-memcpy(jk_shmem.hdr->magic, shm_signature, 8);
-jk_shmem.hdr->size = sz;
+memcpy(jk_shmem.hdr->data.magic, shm_signature, 8);
+jk_shmem.hdr->data.size = sz;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Initialized shared memory size=%u free=%u addr=%#lx",
- jk_shmem.size, jk_shmem.hdr->size, jk_shmem.hdr);
+ jk_shmem.size, jk_shmem.hdr->data.size, jk_shmem.hdr);
}
else {
-jk_shmem.hdr->childs++;
+jk_shmem.hdr->data.childs++;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_INFO,
"Attached shared memory [%d] size=%u free=%u addr=%#lx",
- jk_shmem.hdr->childs, jk_shmem.hdr->size,
- jk_shmem.hdr-