From: wessels <> Date: Wed, 30 May 2001 23:40:26 +0000 (+0000) Subject: Oops, this should have been committed to head first and the 2.4 branch X-Git-Tag: SQUID_3_0_PRE1~1501 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cc4c4f67735c21891db2a1222b6e8db0502a819a;p=thirdparty%2Fsquid.git Oops, this should have been committed to head first and the 2.4 branch second. I am having some infrequent coredumps on DEC Alphas. Somehow, shared memory pointers are gaining a high bit set, almost as though due to an addition/subtraction overflow. One potential problem is that I was storing the value of long pointer subtraction into a 32-bit integer. I changed those integer offsets to off_t. However, the offset value in the inter-process messages remains 32-bits to keep the message size small and predictable. --- diff --git a/src/fs/diskd/store_dir_diskd.cc b/src/fs/diskd/store_dir_diskd.cc index 944c3a8938..245e0ad6a1 100644 --- a/src/fs/diskd/store_dir_diskd.cc +++ b/src/fs/diskd/store_dir_diskd.cc @@ -1,6 +1,6 @@ /* - * $Id: store_dir_diskd.cc,v 1.49 2001/05/08 15:24:36 hno Exp $ + * $Id: store_dir_diskd.cc,v 1.50 2001/05/30 17:40:26 wessels Exp $ * * DEBUG: section 47 Store Directory Routines * AUTHOR: Duane Wessels @@ -531,7 +531,7 @@ storeDiskdDirCallback(SwapDir * SD) storeDiskdHandle(&M); retval = 1; /* Return that we've actually done some work */ if (M.shm_offset > -1) - storeDiskdShmPut(SD, M.shm_offset); + storeDiskdShmPut(SD, (off_t) M.shm_offset); } return retval; } @@ -1636,20 +1636,21 @@ storeDiskdDirReplRemove(StoreEntry * e) */ void * -storeDiskdShmGet(SwapDir * sd, int *shm_offset) +storeDiskdShmGet(SwapDir * sd, off_t * shm_offset) { char *buf; diskdinfo_t *diskdinfo = sd->fsdata; buf = linklistShift(&diskdinfo->shm.stack); assert(buf); + assert(buf >= diskdinfo->shm.buf); + assert(buf < diskdinfo->shm.buf + (SHMBUFS * SHMBUF_BLKSZ)); *shm_offset = buf - diskdinfo->shm.buf; - assert(0 <= *shm_offset && *shm_offset < SHMBUFS * SHMBUF_BLKSZ); diskd_stats.shmbuf_count++; return buf; } void -storeDiskdShmPut(SwapDir * sd, int offset) +storeDiskdShmPut(SwapDir * sd, off_t offset) { char *buf; diskdinfo_t *diskdinfo = sd->fsdata; diff --git a/src/fs/diskd/store_diskd.h b/src/fs/diskd/store_diskd.h index 91b6985150..d01b672991 100644 --- a/src/fs/diskd/store_diskd.h +++ b/src/fs/diskd/store_diskd.h @@ -95,8 +95,8 @@ extern char *storeDiskdDirFullPath(SwapDir * SD, sfileno filn, char *fullpath); extern void storeDiskdDirUnlinkFile(SwapDir *, sfileno); extern void storeDiskdDirReplAdd(SwapDir *, StoreEntry *); extern void storeDiskdDirReplRemove(StoreEntry *); -extern void storeDiskdShmPut(SwapDir *, int); -extern void *storeDiskdShmGet(SwapDir *, int *); +extern void storeDiskdShmPut(SwapDir *, off_t); +extern void *storeDiskdShmGet(SwapDir *, off_t *); extern void storeDiskdHandle(diomsg * M); extern int storeDiskdDirCallback(SwapDir *); diff --git a/src/fs/diskd/store_io_diskd.cc b/src/fs/diskd/store_io_diskd.cc index 0220aa3242..e6710e9fb8 100644 --- a/src/fs/diskd/store_io_diskd.cc +++ b/src/fs/diskd/store_io_diskd.cc @@ -1,6 +1,6 @@ /* - * $Id: store_io_diskd.cc,v 1.21 2001/03/03 10:39:38 hno Exp $ + * $Id: store_io_diskd.cc,v 1.22 2001/05/30 17:40:26 wessels Exp $ * * DEBUG: section 81 Squid-side DISKD I/O functions. * AUTHOR: Duane Wessels @@ -42,7 +42,7 @@ #include "store_diskd.h" -static int storeDiskdSend(int, SwapDir *, int, storeIOState *, int, int, int); +static int storeDiskdSend(int, SwapDir *, int, storeIOState *, int, int, off_t); static void storeDiskdIOCallback(storeIOState * sio, int errflag); static CBDUNL storeDiskdIOFreeEntry; @@ -59,7 +59,7 @@ storeDiskdOpen(SwapDir * SD, StoreEntry * e, STFNCB * file_callback, storeIOState *sio; char *buf; diskdstate_t *diskdstate; - int shm_offset; + off_t shm_offset; diskdinfo_t *diskdinfo = SD->fsdata; debug(81, 3) ("storeDiskdOpen: fileno %08X\n", f); /* @@ -115,7 +115,7 @@ storeDiskdCreate(SwapDir * SD, StoreEntry * e, STFNCB * file_callback, int x; storeIOState *sio; char *buf; - int shm_offset; + off_t shm_offset; diskdinfo_t *diskdinfo = SD->fsdata; diskdstate_t *diskdstate; /* @@ -194,7 +194,7 @@ void storeDiskdRead(SwapDir * SD, storeIOState * sio, char *buf, size_t size, off_t offset, STRCB * callback, void *callback_data) { int x; - int shm_offset; + off_t shm_offset; char *rbuf; diskdstate_t *diskdstate = sio->fsstate; debug(81, 3) ("storeDiskdRead: dirno %d, fileno %08X\n", sio->swap_dirn, sio->swap_filen); @@ -235,7 +235,7 @@ storeDiskdWrite(SwapDir * SD, storeIOState * sio, char *buf, size_t size, off_t { int x; char *sbuf; - int shm_offset; + off_t shm_offset; diskdstate_t *diskdstate = sio->fsstate; debug(81, 3) ("storeDiskdWrite: dirno %d, fileno %08X\n", SD->index, sio->swap_filen); assert(!diskdstate->flags.close_request); @@ -267,7 +267,7 @@ void storeDiskdUnlink(SwapDir * SD, StoreEntry * e) { int x; - int shm_offset; + off_t shm_offset; char *buf; diskdinfo_t *diskdinfo = SD->fsdata; @@ -462,7 +462,7 @@ storeDiskdIOCallback(storeIOState * sio, int errflag) } static int -storeDiskdSend(int mtype, SwapDir * sd, int id, storeIOState * sio, int size, int offset, int shm_offset) +storeDiskdSend(int mtype, SwapDir * sd, int id, storeIOState * sio, int size, int offset, off_t shm_offset) { int x; diomsg M; @@ -475,7 +475,7 @@ storeDiskdSend(int mtype, SwapDir * sd, int id, storeIOState * sio, int size, in M.size = size; M.offset = offset; M.status = -1; - M.shm_offset = shm_offset; + M.shm_offset = (int) shm_offset; M.id = id; M.seq_no = ++seq_no; if (M.callback_data)