Re: [PATCH resend 3/5] libata-scsi: fix overflow in mode page copy

From: Tom Yan
Date: Thu Jul 21 2016 - 17:39:44 EST


Well, I mean this is happening when ata_mselect_*() calls ata_msense_*():

[tom@localhost ~]$ cat test.c
#include <stdio.h>
#include <string.h>

typedef unsigned char u8;

int main() {
u8 a[2] = { 0xff, 0xff };
char b[2];
memcpy(b, a, 2);

for (int i=0; i<2; i++) {
printf("%d\n", a[i]);
}

for (int i=0; i<2; i++) {
printf("%d\n", b[i]);
}
}

[tom@localhost ~]$ cc test.c

[tom@localhost ~]$ ./a.out
255
255
-1
-1

Let me know how I should polish the description for this.

On 22 July 2016 at 05:17, Tejun Heo <tj@xxxxxxxxxx> wrote:
> Hello,
>
> On Fri, Jul 22, 2016 at 02:41:52AM +0800, tom.ty89@xxxxxxxxx wrote:
>> From: Tom Yan <tom.ty89@xxxxxxxxx>
>>
>> ata_mselect_*() would initialize a char array for storing a copy of
>> the current mode page. However, if char was actually signed char,
>> overflow could occur.
>
> Do you mean sign extension?
>
>> For example, `0xff` from def_control_mpage[] would be "truncated"
>> to `-1`. This prevented ata_mselect_control() from working at all,
>> since when it did the read-only bits check, there would always be
>> a mismatch.
>
> Heh, the description doesn't really make sense. Are you talking about
> something like the following?
>
> char ar[N];
> int i;
>
> i = ar[x];
> if (i == 0xff)
> asdf;
>
> If so, the description isn't quite right.
>
> Thanks.
>
> --
> tejun