jfs: avoid undefined behavior from left-shifting by 32 bits
authorNickolai Zeldovich <nickolai@csail.mit.edu>
Sat, 5 Jan 2013 19:19:21 +0000 (14:19 -0500)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Mon, 7 Jan 2013 14:21:36 +0000 (08:21 -0600)
Shifting a 32-bit int by 32 bits is undefined behavior in C, and
results in different behavior on different architectures (e.g., x86
and PowerPC).  diAlloc() in fs/jfs/jfs_imap.c computes a mask using
0xffffffffu<<(32-bitno), which can left-shift by 32 bits.  To avoid
unexpected behavior, explicitly check for bitno==0 and use a 0 mask.

Signed-off-by: Nickolai Zeldovich <nickolai@csail.mit.edu>
Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
fs/jfs/jfs_imap.c

index 6ba4006e011b84eedb3e42de213e20d6ae34ce0b..f7e042b63ddb255011c81e02ead0ed944e24c540 100644 (file)
@@ -1493,7 +1493,7 @@ int diAlloc(struct inode *pip, bool dir, struct inode *ip)
                /* mask any prior bits for the starting words of the
                 * summary map.
                 */
-               mask = ONES << (EXTSPERSUM - bitno);
+               mask = (bitno == 0) ? 0 : (ONES << (EXTSPERSUM - bitno));
                inosmap = le32_to_cpu(iagp->inosmap[sword]) | mask;
                extsmap = le32_to_cpu(iagp->extsmap[sword]) | mask;