On 2016/6/10 1:08, Andy Lutomirski wrote: > On Tue, Jun 7, 2016 at 7:14 PM, Zhangjian (Bamvor) > <bamvor.zhangjian@xxxxxxxxxx> 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. > 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 > . > -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html