Le 18/04/2014 10:30, Maxime Villard a écrit :
Hi all,
I think there's an inconsistency with COMPAT_10 in the open() syscall:
- kern/vfs_syscalls.c - l.1631 --
#ifdef COMPAT_10 /* XXX: and perhaps later */
if (path == NULL) {
pb = pathbuf_create(.);
if (pb == NULL)
return ENOMEM;
} else
#endif
{
error = pathbuf_copyin(path, pb);
if (error)
return error;
}
-
compat/netbsd32/netbsd32_netbsd.c - l.240 --
if (SCARG(ua, path) != NULL) {
error = pathbuf_copyin(SCARG(ua, path), pb);
if (error)
return error;
} else {
pb = pathbuf_create(.);
if (pb == NULL)
return ENOMEM;
}
-
COMPAT_10 should be added in netbsd32, or removed from the native
syscall. But I'm not sure which fix should be applied.
I guess there's someone around here who knows how to fix that.
Thanks!
Maxime
I've kept this issue in my TODO list until now - I told myself I would fix it
after
investigating a bit. But now I figure out that I don't have to:
Index: netbsd32_netbsd.c
===
RCS file: /cvsroot/src/sys/compat/netbsd32/netbsd32_netbsd.c,v
retrieving revision 1.192
diff -u -r1.192 netbsd32_netbsd.c
--- netbsd32_netbsd.c 28 Jun 2014 22:27:50 - 1.192
+++ netbsd32_netbsd.c 18 Jul 2014 18:01:38 -
@@ -230,28 +230,12 @@
syscallarg(mode_t) mode;
} */
struct sys_open_args ua;
- struct pathbuf *pb;
- int error, fd;
NETBSD32TOP_UAP(path, const char);
NETBSD32TO64_UAP(flags);
NETBSD32TO64_UAP(mode);
-
- if (SCARG(ua, path) != NULL) {
- error = pathbuf_copyin(SCARG(ua, path), pb);
- if (error)
- return error;
- } else {
- pb = pathbuf_create(.);
- if (pb == NULL)
- return ENOMEM;
- }
-
-error = do_open(l, NULL, pb, SCARG(ua, flags), SCARG(ua, mode), fd);
-pathbuf_destroy(pb);
- if (error == 0)
- *retval = fd;
-return error;
+
+ return sys_open(l, ua, retval);
}
int
Just redirect to sys_open(), which will handle the rest. Copied from
linux_file.c.
Ok?