Paul Burton b9b6e80ad3 scsi: sg: Avoid overflow when USER_HZ > HZ
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: Paul Burton <paul.burton@imgtec.com>
Acked-by: Douglas Gilbert <dgilbert@interlog.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2016-08-30 22:18:10 -04:00
..
2016-08-05 23:29:05 -04:00
2016-07-27 14:03:52 -07:00
2016-08-07 14:41:02 -06:00
2016-08-01 18:36:01 -04:00
2016-08-05 09:48:22 -04:00
2016-07-30 21:01:36 -07:00
2016-07-28 15:45:17 -07:00
2016-08-01 16:49:13 -04:00
2016-07-30 21:01:36 -07:00
2016-07-30 21:01:36 -07:00
2016-07-30 21:01:36 -07:00
2016-08-07 14:41:02 -06:00
2016-08-04 09:59:37 -04:00
2016-08-02 17:05:11 -04:00
2016-08-01 18:36:01 -04:00
2016-08-06 09:20:13 -04:00
2016-07-31 21:36:58 -04:00
2016-08-06 09:20:13 -04:00
2016-07-20 23:39:36 -07:00
2016-08-07 14:41:02 -06:00
2016-07-31 21:36:58 -04:00
2016-08-06 00:01:33 -04:00
2016-08-01 18:36:01 -04:00
2016-08-06 00:01:33 -04:00
2016-08-06 00:01:33 -04:00
2016-08-05 09:48:22 -04:00
2016-08-01 18:36:01 -04:00
2016-08-01 18:37:45 -04:00
2016-08-05 23:07:43 -04:00
2016-08-06 09:20:13 -04:00
2016-08-06 09:20:13 -04:00
2016-08-02 19:35:40 -04:00
2016-08-06 09:20:13 -04:00