1. 31 Aug, 2016 1 commit
    • Paul Burton's avatar
      scsi: sg: Avoid overflow when USER_HZ > HZ · b9b6e80a
      Paul Burton authored
      Calculating the maximum timeout that a user can set via the
      SG_SET_TIMEOUT ioctl involves multiplying INT_MAX by USER_HZ/HZ. If
      USER_HZ is larger than HZ then this results in an overflow when
      performed as a 32 bit integer calculation, resulting in compiler
      warnings such as the following:
      
        drivers/scsi/sg.c: In function 'sg_ioctl':
        drivers/scsi/sg.c:91:67: warning: integer overflow in expression [-Woverflow]
         #define MULDIV(X,MUL,DIV) ((((X % DIV) * MUL) / DIV) + ((X / DIV) * MUL))
                                                                           ^
        drivers/scsi/sg.c:887:14: note: in expansion of macro 'MULDIV'
           if (val >= MULDIV (INT_MAX, USER_HZ, HZ))
                      ^
        drivers/scsi/sg.c:91:67: warning: integer overflow in expression [-Woverflow]
         #define MULDIV(X,MUL,DIV) ((((X % DIV) * MUL) / DIV) + ((X / DIV) * MUL))
                                                                           ^
        drivers/scsi/sg.c:888:13: note: in expansion of macro 'MULDIV'
               val = MULDIV (INT_MAX, USER_HZ, HZ);
                     ^
      
      Avoid this overflow by performing the (constant) arithmetic on 64 bit
      integers, which ensures that overflow from multiplying the 32 bit values
      cannot occur. When converting the result back to a 32 bit integer use
      min_t to ensure that we don't simply truncate a value beyond INT_MAX to
      a 32 bit integer, but instead use INT_MAX where the result was larger
      than it. As the values are all compile time constant the 64 bit
      arithmetic should have no runtime cost.
      Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
      Acked-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      b9b6e80a
  2. 26 Aug, 2016 15 commits
  3. 24 Aug, 2016 24 commits