[OpenAFS-devel] (PATCH) error report with hardly any useful information, an assert in file server code

Nathan Neulinger nneul@umr.edu
12 Mar 2003 19:44:38 -0600


--=-EUaTjNKbMVefzvv8tn/c
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Figured something out, that I think is the problem...

Looks like the code in dumpstuff does this:

#ifdef AFS_LARGEFILE_ENV
   treat offsets at 64bit
#else
   treat offsets as 32bit
#endif

problem is that it's building where LARGEFILE_ENV is not true, and 
64BIT_ENV is true. 

It needs to be

#ifdef AFS_64BIT_ENV
   treat offsets as 64bit
   #ifdef AFS_LARGEFILE_ENV
      support use of >32bit offset values
   #endif
#else
   treat offsets as 32bit
#endif

Basically, the code is currently written with the assumption that if
your client is 64 bit capable, it will ALWAYS be built with largefile
support. That assumption is not currently correct. 

The attached patch appears to fix the problem with WriteFile in
dumpstuff.c, but there are likely other fixes needed elsewhere.

-- Nathan

--=-EUaTjNKbMVefzvv8tn/c
Content-Disposition: attachment; filename=dump.diff
Content-Type: text/plain; name=dump.diff; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Index: dumpstuff.c
===================================================================
RCS file: /cvs/openafs/src/volser/dumpstuff.c,v
retrieving revision 1.12
diff -u -r1.12 dumpstuff.c
--- dumpstuff.c	13 Feb 2003 18:06:10 -0000	1.12
+++ dumpstuff.c	13 Mar 2003 01:41:27 -0000
@@ -1118,29 +1118,29 @@
 
 
     *status = 0;
-#ifdef AFS_LARGEFILE_ENV
+#ifdef AFS_64BIT_ENV
     {
-	afs_uint32 filesize_high, filesize_low;
+	afs_uint32 filesize_high = 0L, filesize_low = 0L;
+#ifdef AFS_LARGEFILE_ENV
 	if (tag == 'h') {
 	    if (!ReadInt32(iodp, &filesize_high) ) {
 		*status = 1;
 		return(0);
 	    }
-	} else {
-	    filesize_high = 0L;
 	}
+#endif
 	if (!ReadInt32(iodp, &filesize_low)) {
 	    *status = 1;
 	    return(0);
 	}
 	FillInt64(filesize, filesize_high, filesize_low);
     }
-#else /* !AFS_LARGEFILE_ENV */
+#else /* !AFS_64BIT_ENV */
     if (!ReadInt32(iodp, &filesize)) {
         *status = 1;
 	return(0);
     }
-#endif /* !AFS_LARGEFILE_ENV */
+#endif /* !AFS_64BIT_ENV */
     p = (unsigned char *) malloc(size);
     if (p == NULL) {
         *status = 2;
@@ -1151,7 +1151,7 @@
 	    size = nbytes;
 	
 	if ((code = iod_Read(iodp, p, size)) != size) {
-#ifdef AFS_LARGEFILE_ENV
+#ifdef AFS_64BIT_ENV
 	    Log("1 Volser: WriteFile: Error reading dump file %d size=(0X%x,0X%x) nbytes=%d (%d of %d); restore aborted\n", vn,
 		(unsigned) (filesize >> 32),
 		(unsigned) (filesize & 0xffffffff),

--=-EUaTjNKbMVefzvv8tn/c--