On Tue, Jun 7, 2016 at 7:14 PM, Zhangjian (Bamvor) <bamvor.zhangj...@huawei.com> wrote: > Hi, > > On 2016/6/8 9:33, Weidong Wang wrote: >> >> 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. >> >> 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.