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.