Re: [RFC PATCH] sys_read: add a compat_sys_read for 64bit system
From: Andy Lutomirski <hidden>
Date: 2016-06-09 17:09:14
Also in:
lkml
On Tue, Jun 7, 2016 at 7:14 PM, Zhangjian (Bamvor) [off-list ref] wrote:
Hi, On 2016/6/8 9:33, Weidong Wang wrote:quoted
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.
quoted
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.