Re: [RFC PATCH] sys_read: add a compat_sys_read for 64bit system

From: Andy Lutomirski
Date: Thu Jun 09 2016 - 13:09:16 EST


On Tue, Jun 7, 2016 at 7:14 PM, Zhangjian (Bamvor)
<bamvor.zhangjian@xxxxxxxxxx> wrote:
> Hi,
>
> On 2016/6/8 9:33, Weidong Wang wrote:
>>
>> Test 32 progress and 64 progress on the 64bit system with
>> this progress:
>>
>> int main(int argc, char **argv)
>> {
>> int fd = 0;
>> int i, ret = 0;
>> char buf[512];
>> unsigned long count = -1;
>>
>> fd = open("/tmp", O_RDONLY);
>> if (fd < -1) {
>> printf("Pls check the directory is exist?\n");
>> return -1;
>> }
>> errno = 0;
>> ret = read(fd, NULL, count);
>> printf("Ret is %d errno %d\n", ret, errno);
>> close(fd);
>>
>> return 0;
>> }
>>
>> we get the different errno. The 64 progress we get errno is -14 while
>> the 32 progress is -21.

On 64-bit, you get -14 == -EFAULT. Seems reasonable: you passed a bad pointer.

On 32-bit, you get -21 == -EISDIR. Also seems reasonable: fd is a directory.

>>
>> The reason is that, the user progress would use a 32bit count, while
>> the sys_read size_t in kernel is 64bit. When the uesrspace count is
>> -1(0xffffffff), it goes to the sys_read, it would be change to a positive
>> number.

That parameter is size_t, which is unsigned. It's a positive number
in both cases.

I don't think there's a bug here.