Re: [RFC PATCH] sys_read: add a compat_sys_read for 64bit system
From: Weidong Wang <hidden>
Date: 2016-06-14 03:06:33
Also in:
lkml
On 2016/6/10 1:08, Andy Lutomirski wrote:
On Tue, Jun 7, 2016 at 7:14 PM, Zhangjian (Bamvor) [off-list ref] wrote:quoted
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
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.
Yep. In the progress open the '/tmp' is a directory. If we do open a file '/tmp/files' (exist file), the result would be different on x86-64bit machine. On 64-bit, we get -14 == -EFAULT. On 32-bit, we get the length of the file, the errno is 0. Regards, Weidong
.