]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Oops, this should have been committed to head first and the 2.4 branch
authorwessels <>
Wed, 30 May 2001 23:40:26 +0000 (23:40 +0000)
committerwessels <>
Wed, 30 May 2001 23:40:26 +0000 (23:40 +0000)
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.

src/fs/diskd/store_dir_diskd.cc
src/fs/diskd/store_diskd.h
src/fs/diskd/store_io_diskd.cc

index 944c3a89381b98ac1060ca66e1626037bce6f635..245e0ad6a13d75f38a4a284ad7b87ea45553bbb1 100644 (file)
@@ -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;
index 91b6985150483544d58a750184338d78dc9f01cc..d01b67299133ca76fb553c17ff60473d9f5d5e3e 100644 (file)
@@ -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 *);
 
index 0220aa324286e0c072f09d7734a0990b9362e406..e6710e9fb8f6ffa0590479e99d1695010aeafb24 100644 (file)
@@ -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)