break;
                case I2C_SMBUS_BYTE_DATA:
                        buf[2] = data->byte;
-                       data->word = buf[2] ||
+                       data->word = buf[2] |
                                    (i2c_smbus_pec(3, buf, NULL) << 8);
                        size = I2C_SMBUS_WORD_DATA;
                        break;
          need to use only one message; when reading, we need two. We initialize
          most things with sane defaults, to keep the code below somewhat
          simpler. */
-       unsigned char msgbuf0[34];
-       unsigned char msgbuf1[34];
+       unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
+       unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
        int num = read_write == I2C_SMBUS_READ?2:1;
        struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, 
                                  { addr, flags | I2C_M_RD, 0, msgbuf1 }
                        }
                        if(size == I2C_SMBUS_BLOCK_DATA_PEC)
                                (msg[0].len)++;
-                       for (i = 1; i <= msg[0].len; i++)
+                       for (i = 1; i < msg[0].len; i++)
                                msgbuf0[i] = data->block[i-1];
                }
                break;