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