Thread (5 messages) flat view 5 messages, 4 authors, 2016-06-14

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
.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help