When compiling Samba 2_2 CVS under AIX 4.3.3 using gcc or xlc_r, I get the following 
warnings:

smbd/trans2.c: In function `get_lanman2_dir_entry':
smbd/trans2.c:759: warning: right shift count >= width of type
smbd/trans2.c:759: warning: right shift count >= width of type
smbd/trans2.c:759: warning: right shift count >= width of type
smbd/trans2.c:759: warning: right shift count >= width of type
smbd/trans2.c: In function `call_trans2qfilepathinfo':
smbd/trans2.c:2025: warning: right shift count >= width of type
smbd/trans2.c:2025: warning: right shift count >= width of type
smbd/trans2.c:2025: warning: right shift count >= width of type
smbd/trans2.c:2025: warning: right shift count >= width of type

The first offending line in smbd/trans2.c is:
        SOFF_T(p,0,sbuf.st_blocks*STAT_ST_BLOCKSIZE); /* Number of bytes used on disk 
- 64 Bit */

sbuf.st_blocks is of type blksize_t which is defined as int with only 32 bits and 
STAT_ST_BLOCKSIZE=512.

The SOFF_T macro is defined as:
#define SOFF_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32))

The value passed to SOFF_T needs to be a 64 bit value, attached is a patch I use to 
silence the compiler.

...Juergen

--- smbd/trans2.c.orig	Thu May 30 23:16:44 2002
+++ smbd/trans2.c	Thu May 30 23:16:59 2002
@@ -756,7 +756,7 @@
 			p+= 8;
 
 #if defined(HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
-			SOFF_T(p,0,sbuf.st_blocks*STAT_ST_BLOCKSIZE); /* Number of bytes used on disk - 64 Bit */
+			SOFF_T(p,0,((long long)sbuf.st_blocks)*STAT_ST_BLOCKSIZE); /* Number of bytes used on disk - 64 Bit */
 #else
 			/* Can't get the value - fake it using size. */
 			SOFF_T(p,0,sbuf.st_size);             /* Number of bytes used on disk - 64 Bit */
@@ -2022,7 +2022,7 @@
 		pdata += 8;
 
 #if defined(HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
-		SOFF_T(pdata,0,sbuf.st_blocks*STAT_ST_BLOCKSIZE); /* Number of bytes used on disk - 64 Bit */
+		SOFF_T(pdata,0,(long long)sbuf.st_blocks*STAT_ST_BLOCKSIZE); /* Number of bytes used on disk - 64 Bit */
 #else
 		/* Can't get the value - fake it using size. */
 		SOFF_T(pdata,0,sbuf.st_size);             /* Number of bytes used on disk - 64 Bit */

Reply via email to