Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Apr 2007 20:10:13 +0100
From:      David Taylor <davidt@yadt.co.uk>
To:        freebsd-emulation@freebsd.org
Cc:        freebsd-current@freebsd.org
Subject:   linux_statfs64() missing an argument??
Message-ID:  <20070408191012.GA95373@outcold.yadt.co.uk>

next in thread | raw e-mail | index | archive | help

--azLHFNyN32YCQGCU
Content-Type: text/plain; charset=iso-8859-15
Content-Disposition: inline

I've recently been trying to compile gentoo under FreeBSD
(in order, eventually, to compile OpenWRT), and ran in to a rather
confusing problem when trying to diagnose the reason "coreutils"
failed to build properly.

Eventually I tracked down the problem:

glibc calls the statfs64 syscall with (path, sizeof(struct statfs64), buf)

The linux_statfs64 emulated syscall in FreeBSD expects only (path, buf),
and returns EFAULT every time, as buf is always 0x54.

The attached patch adds the missing argument, and ensures it matches
sizeof(struct l_statfs64), returning EINVAL otherwise (is that the right
error).

I'm currently recompiling my kernel to test this, but thought I'd see
if anyone had any comments on the patch as is, since I've probably done
something wrong, as I'm not too sure how the whole syscalls.master setup
works.

-- 
David Taylor

--azLHFNyN32YCQGCU
Content-Type: text/x-diff; charset=iso-8859-15
Content-Disposition: attachment; filename="linux_statfs64.patch"

Index: sys/amd64/linux32/linux32_proto.h
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_proto.h,v
retrieving revision 1.31
diff -u -r1.31 linux32_proto.h
--- sys/amd64/linux32/linux32_proto.h	30 Mar 2007 00:08:21 -0000	1.31
+++ sys/amd64/linux32/linux32_proto.h	8 Apr 2007 19:00:27 -0000
@@ -2,7 +2,7 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
@@ -796,6 +796,7 @@
 };
 struct linux_statfs64_args {
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char bufsize_l_[PADL_(size_t)]; size_t bufsize; char bufsize_r_[PADR_(size_t)];
 	char buf_l_[PADL_(struct l_statfs64_buf *)]; struct l_statfs64_buf * buf; char buf_r_[PADR_(struct l_statfs64_buf *)];
 };
 struct linux_fstatfs64_args {
Index: sys/amd64/linux32/linux32_syscall.h
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_syscall.h,v
retrieving revision 1.31
diff -u -r1.31 linux32_syscall.h
--- sys/amd64/linux32/linux32_syscall.h	30 Mar 2007 00:08:21 -0000	1.31
+++ sys/amd64/linux32/linux32_syscall.h	8 Apr 2007 19:00:27 -0000
@@ -2,7 +2,7 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
Index: sys/amd64/linux32/linux32_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_sysent.c,v
retrieving revision 1.31
diff -u -r1.31 linux32_sysent.c
--- sys/amd64/linux32/linux32_sysent.c	30 Mar 2007 00:08:21 -0000	1.31
+++ sys/amd64/linux32/linux32_sysent.c	8 Apr 2007 19:00:27 -0000
@@ -2,7 +2,7 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.31 2007/03/30 00:08:21 jkim Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.28 2007/03/30 00:06:21 jkim Exp 
  */
 
Index: sys/amd64/linux32/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/syscalls.master,v
retrieving revision 1.28
diff -u -r1.28 syscalls.master
--- sys/amd64/linux32/syscalls.master	30 Mar 2007 00:06:21 -0000	1.28
+++ sys/amd64/linux32/syscalls.master	8 Apr 2007 19:00:11 -0000
@@ -435,7 +435,7 @@
 266	AUE_NULL	STD	{ int linux_clock_getres(clockid_t which, struct l_timespec *tp); }
 267	AUE_NULL	STD	{ int linux_clock_nanosleep(clockid_t which, int flags, \
 					struct l_timespec *rqtp, struct l_timespec *rmtp); }
-268	AUE_STATFS	STD	{ int linux_statfs64(char *path, struct l_statfs64_buf *buf); }
+268	AUE_STATFS	STD	{ int linux_statfs64(char *path, size_t bufsize, struct l_statfs64_buf *buf); }
 269	AUE_FSTATFS	STD	{ int linux_fstatfs64(void); }
 270	AUE_NULL	STD	{ int linux_tgkill(int tgid, int pid, int sig); }
 271	AUE_UTIMES	STD	{ int linux_utimes(char *fname, \
Index: sys/i386/linux/linux_proto.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_proto.h,v
retrieving revision 1.92
diff -u -r1.92 linux_proto.h
--- sys/i386/linux/linux_proto.h	29 Mar 2007 02:11:46 -0000	1.92
+++ sys/i386/linux/linux_proto.h	8 Apr 2007 18:56:56 -0000
@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_proto.h,v 1.92 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp 
+ * $FreeBSD$
+ * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.87 2007/03/29 02:11:46 julian Exp 
  */
 
 #ifndef _LINUX_SYSPROTO_H_
@@ -801,6 +801,7 @@
 };
 struct linux_statfs64_args {
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+	char bufsize_l_[PADL_(size_t)]; size_t bufsize; char bufsize_r_[PADR_(size_t)];
 	char buf_l_[PADL_(struct l_statfs64_buf *)]; struct l_statfs64_buf * buf; char buf_r_[PADR_(struct l_statfs64_buf *)];
 };
 struct linux_fstatfs64_args {
Index: sys/i386/linux/linux_syscall.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_syscall.h,v
retrieving revision 1.85
diff -u -r1.85 linux_syscall.h
--- sys/i386/linux/linux_syscall.h	29 Mar 2007 02:11:46 -0000	1.85
+++ sys/i386/linux/linux_syscall.h	8 Apr 2007 18:56:56 -0000
@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_syscall.h,v 1.85 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp 
+ * $FreeBSD$
+ * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.87 2007/03/29 02:11:46 julian Exp 
  */
 
 #define	LINUX_SYS_exit	1
Index: sys/i386/linux/linux_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_sysent.c,v
retrieving revision 1.92
diff -u -r1.92 linux_sysent.c
--- sys/i386/linux/linux_sysent.c	29 Mar 2007 02:11:46 -0000	1.92
+++ sys/i386/linux/linux_sysent.c	8 Apr 2007 18:56:56 -0000
@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/i386/linux/linux_sysent.c,v 1.92 2007/03/29 02:11:46 julian Exp $
- * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.86 2007/02/15 00:54:40 jkim Exp 
+ * $FreeBSD$
+ * created from FreeBSD: src/sys/i386/linux/syscalls.master,v 1.87 2007/03/29 02:11:46 julian Exp 
  */
 
 #include <bsm/audit_kevents.h>
Index: sys/i386/linux/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/syscalls.master,v
retrieving revision 1.87
diff -u -r1.87 syscalls.master
--- sys/i386/linux/syscalls.master	29 Mar 2007 02:11:46 -0000	1.87
+++ sys/i386/linux/syscalls.master	8 Apr 2007 18:56:50 -0000
@@ -439,7 +439,7 @@
 266	AUE_NULL	STD	{ int linux_clock_getres(clockid_t which, struct l_timespec *tp); }
 267	AUE_NULL	STD	{ int linux_clock_nanosleep(clockid_t which, int flags, \
 					struct l_timespec *rqtp, struct l_timespec *rmtp); }
-268	AUE_STATFS	STD	{ int linux_statfs64(char *path, struct l_statfs64_buf *buf); }
+268	AUE_STATFS	STD	{ int linux_statfs64(char *path, size_t bufsize, struct l_statfs64_buf *buf); }
 269	AUE_FSTATFS	STD	{ int linux_fstatfs64(void); }
 270	AUE_NULL	STD	{ int linux_tgkill(int tgid, int pid, int sig); }
 271	AUE_UTIMES	STD	{ int linux_utimes(char *fname, \
Index: sys/compat/linux/linux_stats.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/linux/linux_stats.c,v
retrieving revision 1.87
diff -u -r1.87 linux_stats.c
--- sys/compat/linux/linux_stats.c	6 Mar 2007 07:39:12 -0000	1.87
+++ sys/compat/linux/linux_stats.c	8 Apr 2007 18:59:47 -0000
@@ -418,6 +418,9 @@
 	char *path;
 	int error;
 
+	if (args->bufsize != sizeof(struct l_statfs64))
+		return EINVAL;
+
 	LCONVPATHEXIST(td, args->path, &path);
 
 #ifdef DEBUG

--azLHFNyN32YCQGCU--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070408191012.GA95373>