svn commit: r359605 - in stable/12/sys: amd64/linux32 compat/linux i386/linux
Mark Johnston
markj at FreeBSD.org
Fri Apr 3 16:31:58 UTC 2020
Author: markj
Date: Fri Apr 3 16:31:45 2020
New Revision: 359605
URL: https://svnweb.freebsd.org/changeset/base/359605
Log:
MFC r356945, r356946:
Fix 64-bit syscall argument fetching in 32-bit Linux syscall handlers.
PR: 243155
Modified:
stable/12/sys/amd64/linux32/linux32_machdep.c
stable/12/sys/amd64/linux32/linux32_proto.h
stable/12/sys/amd64/linux32/linux32_systrace_args.c
stable/12/sys/amd64/linux32/syscalls.master
stable/12/sys/compat/linux/linux_file.c
stable/12/sys/i386/linux/linux_machdep.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/amd64/linux32/linux32_machdep.c
==============================================================================
--- stable/12/sys/amd64/linux32/linux32_machdep.c Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/amd64/linux32/linux32_machdep.c Fri Apr 3 16:31:45 2020 (r359605)
@@ -654,19 +654,6 @@ linux_sigaltstack(struct thread *td, struct linux_siga
}
int
-linux_ftruncate64(struct thread *td, struct linux_ftruncate64_args *args)
-{
-
-#ifdef DEBUG
- if (ldebug(ftruncate64))
- printf(ARGS(ftruncate64, "%u, %jd"), args->fd,
- (intmax_t)args->length);
-#endif
-
- return (kern_ftruncate(td, args->fd, args->length));
-}
-
-int
linux_gettimeofday(struct thread *td, struct linux_gettimeofday_args *uap)
{
struct timeval atv;
Modified: stable/12/sys/amd64/linux32/linux32_proto.h
==============================================================================
--- stable/12/sys/amd64/linux32/linux32_proto.h Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/amd64/linux32/linux32_proto.h Fri Apr 3 16:31:45 2020 (r359605)
@@ -574,13 +574,15 @@ struct linux_pread_args {
char fd_l_[PADL_(l_uint)]; l_uint fd; char fd_r_[PADR_(l_uint)];
char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
char nbyte_l_[PADL_(l_size_t)]; l_size_t nbyte; char nbyte_r_[PADR_(l_size_t)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
};
struct linux_pwrite_args {
char fd_l_[PADL_(l_uint)]; l_uint fd; char fd_r_[PADR_(l_uint)];
char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
char nbyte_l_[PADL_(l_size_t)]; l_size_t nbyte; char nbyte_r_[PADR_(l_size_t)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
};
struct linux_chown16_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
@@ -623,11 +625,13 @@ struct linux_mmap2_args {
};
struct linux_truncate64_args {
char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
- char length_l_[PADL_(l_loff_t)]; l_loff_t length; char length_r_[PADR_(l_loff_t)];
+ char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)];
+ char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)];
};
struct linux_ftruncate64_args {
char fd_l_[PADL_(l_uint)]; l_uint fd; char fd_r_[PADR_(l_uint)];
- char length_l_[PADL_(l_loff_t)]; l_loff_t length; char length_r_[PADR_(l_loff_t)];
+ char length1_l_[PADL_(uint32_t)]; uint32_t length1; char length1_r_[PADR_(uint32_t)];
+ char length2_l_[PADL_(uint32_t)]; uint32_t length2; char length2_r_[PADR_(uint32_t)];
};
struct linux_stat64_args {
char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
@@ -756,7 +760,8 @@ struct linux_set_thread_area_args {
};
struct linux_fadvise64_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
char len_l_[PADL_(l_size_t)]; l_size_t len; char len_r_[PADR_(l_size_t)];
char advice_l_[PADL_(int)]; int advice; char advice_r_[PADR_(int)];
};
@@ -847,8 +852,10 @@ struct linux_utimes_args {
};
struct linux_fadvise64_64_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
- char len_l_[PADL_(l_loff_t)]; l_loff_t len; char len_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
+ char len1_l_[PADL_(uint32_t)]; uint32_t len1; char len1_r_[PADR_(uint32_t)];
+ char len2_l_[PADL_(uint32_t)]; uint32_t len2; char len2_r_[PADR_(uint32_t)];
char advice_l_[PADL_(int)]; int advice; char advice_r_[PADR_(int)];
};
struct linux_mbind_args {
@@ -1021,8 +1028,10 @@ struct linux_splice_args {
};
struct linux_sync_file_range_args {
char fd_l_[PADL_(l_int)]; l_int fd; char fd_r_[PADR_(l_int)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
- char nbytes_l_[PADL_(l_loff_t)]; l_loff_t nbytes; char nbytes_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
+ char nbytes1_l_[PADL_(uint32_t)]; uint32_t nbytes1; char nbytes1_r_[PADR_(uint32_t)];
+ char nbytes2_l_[PADL_(uint32_t)]; uint32_t nbytes2; char nbytes2_r_[PADR_(uint32_t)];
char flags_l_[PADL_(unsigned int)]; unsigned int flags; char flags_r_[PADR_(unsigned int)];
};
struct linux_tee_args {
@@ -1064,8 +1073,10 @@ struct linux_eventfd_args {
struct linux_fallocate_args {
char fd_l_[PADL_(l_int)]; l_int fd; char fd_r_[PADR_(l_int)];
char mode_l_[PADL_(l_int)]; l_int mode; char mode_r_[PADR_(l_int)];
- char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char offset_r_[PADR_(l_loff_t)];
- char len_l_[PADL_(l_loff_t)]; l_loff_t len; char len_r_[PADR_(l_loff_t)];
+ char offset1_l_[PADL_(uint32_t)]; uint32_t offset1; char offset1_r_[PADR_(uint32_t)];
+ char offset2_l_[PADL_(uint32_t)]; uint32_t offset2; char offset2_r_[PADR_(uint32_t)];
+ char len1_l_[PADL_(uint32_t)]; uint32_t len1; char len1_r_[PADR_(uint32_t)];
+ char len2_l_[PADL_(uint32_t)]; uint32_t len2; char len2_r_[PADR_(uint32_t)];
};
struct linux_timerfd_settime_args {
char fd_l_[PADL_(l_int)]; l_int fd; char fd_r_[PADR_(l_int)];
Modified: stable/12/sys/amd64/linux32/linux32_systrace_args.c
==============================================================================
--- stable/12/sys/amd64/linux32/linux32_systrace_args.c Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/amd64/linux32/linux32_systrace_args.c Fri Apr 3 16:31:45 2020 (r359605)
@@ -1235,8 +1235,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
iarg[0] = p->fd; /* l_uint */
uarg[1] = (intptr_t) p->buf; /* char * */
iarg[2] = p->nbyte; /* l_size_t */
- iarg[3] = p->offset; /* l_loff_t */
- *n_args = 4;
+ uarg[3] = p->offset1; /* uint32_t */
+ uarg[4] = p->offset2; /* uint32_t */
+ *n_args = 5;
break;
}
/* linux_pwrite */
@@ -1245,8 +1246,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
iarg[0] = p->fd; /* l_uint */
uarg[1] = (intptr_t) p->buf; /* char * */
iarg[2] = p->nbyte; /* l_size_t */
- iarg[3] = p->offset; /* l_loff_t */
- *n_args = 4;
+ uarg[3] = p->offset1; /* uint32_t */
+ uarg[4] = p->offset2; /* uint32_t */
+ *n_args = 5;
break;
}
/* linux_chown16 */
@@ -1324,16 +1326,18 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
case 193: {
struct linux_truncate64_args *p = params;
uarg[0] = (intptr_t) p->path; /* char * */
- iarg[1] = p->length; /* l_loff_t */
- *n_args = 2;
+ uarg[1] = p->length1; /* uint32_t */
+ uarg[2] = p->length2; /* uint32_t */
+ *n_args = 3;
break;
}
/* linux_ftruncate64 */
case 194: {
struct linux_ftruncate64_args *p = params;
iarg[0] = p->fd; /* l_uint */
- iarg[1] = p->length; /* l_loff_t */
- *n_args = 2;
+ uarg[1] = p->length1; /* uint32_t */
+ uarg[2] = p->length2; /* uint32_t */
+ *n_args = 3;
break;
}
/* linux_stat64 */
@@ -1657,10 +1661,11 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
case 250: {
struct linux_fadvise64_args *p = params;
iarg[0] = p->fd; /* int */
- iarg[1] = p->offset; /* l_loff_t */
- iarg[2] = p->len; /* l_size_t */
- iarg[3] = p->advice; /* int */
- *n_args = 4;
+ uarg[1] = p->offset1; /* uint32_t */
+ uarg[2] = p->offset2; /* uint32_t */
+ iarg[3] = p->len; /* l_size_t */
+ iarg[4] = p->advice; /* int */
+ *n_args = 5;
break;
}
/* linux_exit_group */
@@ -1828,10 +1833,12 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
case 272: {
struct linux_fadvise64_64_args *p = params;
iarg[0] = p->fd; /* int */
- iarg[1] = p->offset; /* l_loff_t */
- iarg[2] = p->len; /* l_loff_t */
- iarg[3] = p->advice; /* int */
- *n_args = 4;
+ uarg[1] = p->offset1; /* uint32_t */
+ uarg[2] = p->offset2; /* uint32_t */
+ uarg[3] = p->len1; /* uint32_t */
+ uarg[4] = p->len2; /* uint32_t */
+ iarg[5] = p->advice; /* int */
+ *n_args = 6;
break;
}
/* linux_mbind */
@@ -2120,10 +2127,12 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
case 314: {
struct linux_sync_file_range_args *p = params;
iarg[0] = p->fd; /* l_int */
- iarg[1] = p->offset; /* l_loff_t */
- iarg[2] = p->nbytes; /* l_loff_t */
- uarg[3] = p->flags; /* unsigned int */
- *n_args = 4;
+ uarg[1] = p->offset1; /* uint32_t */
+ uarg[2] = p->offset2; /* uint32_t */
+ uarg[3] = p->nbytes1; /* uint32_t */
+ uarg[4] = p->nbytes2; /* uint32_t */
+ uarg[5] = p->flags; /* unsigned int */
+ *n_args = 6;
break;
}
/* linux_tee */
@@ -2193,9 +2202,11 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
struct linux_fallocate_args *p = params;
iarg[0] = p->fd; /* l_int */
iarg[1] = p->mode; /* l_int */
- iarg[2] = p->offset; /* l_loff_t */
- iarg[3] = p->len; /* l_loff_t */
- *n_args = 4;
+ uarg[2] = p->offset1; /* uint32_t */
+ uarg[3] = p->offset2; /* uint32_t */
+ uarg[4] = p->len1; /* uint32_t */
+ uarg[5] = p->len2; /* uint32_t */
+ *n_args = 6;
break;
}
/* linux_timerfd_settime */
@@ -4871,8 +4882,11 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "l_size_t";
break;
case 3:
- p = "l_loff_t";
+ p = "uint32_t";
break;
+ case 4:
+ p = "uint32_t";
+ break;
default:
break;
};
@@ -4890,8 +4904,11 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "l_size_t";
break;
case 3:
- p = "l_loff_t";
+ p = "uint32_t";
break;
+ case 4:
+ p = "uint32_t";
+ break;
default:
break;
};
@@ -5015,8 +5032,11 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "userland char *";
break;
case 1:
- p = "l_loff_t";
+ p = "uint32_t";
break;
+ case 2:
+ p = "uint32_t";
+ break;
default:
break;
};
@@ -5028,8 +5048,11 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "l_uint";
break;
case 1:
- p = "l_loff_t";
+ p = "uint32_t";
break;
+ case 2:
+ p = "uint32_t";
+ break;
default:
break;
};
@@ -5479,12 +5502,15 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "int";
break;
case 1:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 2:
- p = "l_size_t";
+ p = "uint32_t";
break;
case 3:
+ p = "l_size_t";
+ break;
+ case 4:
p = "int";
break;
default:
@@ -5759,12 +5785,18 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "int";
break;
case 1:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 2:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 3:
+ p = "uint32_t";
+ break;
+ case 4:
+ p = "uint32_t";
+ break;
+ case 5:
p = "int";
break;
default:
@@ -6174,12 +6206,18 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "l_int";
break;
case 1:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 2:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 3:
+ p = "uint32_t";
+ break;
+ case 4:
+ p = "uint32_t";
+ break;
+ case 5:
p = "unsigned int";
break;
default:
@@ -6278,10 +6316,16 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
p = "l_int";
break;
case 2:
- p = "l_loff_t";
+ p = "uint32_t";
break;
case 3:
- p = "l_loff_t";
+ p = "uint32_t";
+ break;
+ case 4:
+ p = "uint32_t";
+ break;
+ case 5:
+ p = "uint32_t";
break;
default:
break;
Modified: stable/12/sys/amd64/linux32/syscalls.master
==============================================================================
--- stable/12/sys/amd64/linux32/syscalls.master Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/amd64/linux32/syscalls.master Fri Apr 3 16:31:45 2020 (r359605)
@@ -325,9 +325,9 @@
l_sigset_t *newset, \
l_size_t sigsetsize); }
180 AUE_PREAD STD { int linux_pread(l_uint fd, char *buf, \
- l_size_t nbyte, l_loff_t offset); }
+ l_size_t nbyte, uint32_t offset1, uint32_t offset2); }
181 AUE_PWRITE STD { int linux_pwrite(l_uint fd, char *buf, \
- l_size_t nbyte, l_loff_t offset); }
+ l_size_t nbyte, uint32_t offset1, uint32_t offset2); }
182 AUE_CHOWN STD { int linux_chown16(char *path, \
l_uid16_t uid, l_gid16_t gid); }
183 AUE_GETCWD STD { int linux_getcwd(char *buf, \
@@ -349,9 +349,9 @@
l_ulong prot, l_ulong flags, l_ulong fd, \
l_ulong pgoff); }
193 AUE_TRUNCATE STD { int linux_truncate64(char *path, \
- l_loff_t length); }
+ uint32_t length1, uint32_t length2); }
194 AUE_FTRUNCATE STD { int linux_ftruncate64(l_uint fd, \
- l_loff_t length); }
+ uint32_t length1, uint32_t length2); }
195 AUE_STAT STD { int linux_stat64(const char *filename, \
struct l_stat64 *statbuf); }
196 AUE_LSTAT STD { int linux_lstat64(const char *filename, \
@@ -426,7 +426,7 @@
247 AUE_NULL UNIMPL linux_io_getevents
248 AUE_NULL UNIMPL linux_io_submit
249 AUE_NULL UNIMPL linux_io_cancel
-250 AUE_NULL STD { int linux_fadvise64(int fd, l_loff_t offset, \
+250 AUE_NULL STD { int linux_fadvise64(int fd, uint32_t offset1, uint32_t offset2, \
l_size_t len, int advice); }
251 AUE_NULL UNIMPL
252 AUE_EXIT STD { int linux_exit_group(int error_code); }
@@ -456,7 +456,8 @@
271 AUE_UTIMES STD { int linux_utimes(char *fname, \
struct l_timeval *tptr); }
272 AUE_NULL STD { int linux_fadvise64_64(int fd, \
- l_loff_t offset, l_loff_t len, \
+ uint32_t offset1, uint32_t offset2, \
+ uint32_t len1, uint32_t len2, \
int advice); }
273 AUE_NULL UNIMPL vserver
274 AUE_NULL STD { int linux_mbind(void); }
@@ -524,8 +525,9 @@
312 AUE_NULL STD { int linux_get_robust_list(l_int pid, \
struct linux_robust_list_head **head, l_size_t *len); }
313 AUE_NULL STD { int linux_splice(void); }
-314 AUE_NULL STD { int linux_sync_file_range(l_int fd, l_loff_t offset,
- l_loff_t nbytes, unsigned int flags); }
+314 AUE_NULL STD { int linux_sync_file_range(l_int fd, uint32_t offset1,
+ uint32_t offset2, uint32_t nbytes1, uint32_t nbytes2,
+ unsigned int flags); }
315 AUE_NULL STD { int linux_tee(void); }
316 AUE_NULL STD { int linux_vmsplice(void); }
; Linux 2.6.18:
@@ -543,7 +545,8 @@
323 AUE_NULL STD { int linux_eventfd(l_uint initval); }
; Linux 2.6.23:
324 AUE_NULL STD { int linux_fallocate(l_int fd, l_int mode, \
- l_loff_t offset, l_loff_t len); }
+ uint32_t offset1, uint32_t offset2, uint32_t len1,
+ uint32_t len2); }
; Linux 2.6.25:
325 AUE_NULL STD { int linux_timerfd_settime(l_int fd, l_int flags, \
const struct l_itimerspec *new_value, \
Modified: stable/12/sys/compat/linux/linux_file.c
==============================================================================
--- stable/12/sys/compat/linux/linux_file.c Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/compat/linux/linux_file.c Fri Apr 3 16:31:45 2020 (r359605)
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
#include <sys/vnode.h>
#ifdef COMPAT_LINUX32
+#include <compat/freebsd32/freebsd32_misc.h>
#include <machine/../linux32/linux.h>
#include <machine/../linux32/linux32_proto.h>
#else
@@ -67,7 +68,6 @@ __FBSDID("$FreeBSD$");
static int linux_common_open(struct thread *, int, char *, int, int);
static int linux_getdents_error(struct thread *, int, int);
-
#ifdef LINUX_LEGACY_SYSCALLS
int
linux_creat(struct thread *td, struct linux_creat_args *args)
@@ -898,7 +898,6 @@ linux_truncate(struct thread *td, struct linux_truncat
int error;
LCONVPATHEXIST(td, args->path, &path);
-
#ifdef DEBUG
if (ldebug(truncate))
printf(ARGS(truncate, "%s, %ld"), path, (long)args->length);
@@ -914,8 +913,15 @@ int
linux_truncate64(struct thread *td, struct linux_truncate64_args *args)
{
char *path;
+ off_t length;
int error;
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ length = PAIR32TO64(off_t, args->length);
+#else
+ length = args->length;
+#endif
+
LCONVPATHEXIST(td, args->path, &path);
#ifdef DEBUG
@@ -923,7 +929,7 @@ linux_truncate64(struct thread *td, struct linux_trunc
printf(ARGS(truncate64, "%s, %jd"), path, args->length);
#endif
- error = kern_truncate(td, path, UIO_SYSSPACE, args->length);
+ error = kern_truncate(td, path, UIO_SYSSPACE, length);
LFREEPATH(path);
return (error);
}
@@ -936,6 +942,22 @@ linux_ftruncate(struct thread *td, struct linux_ftrunc
return (kern_ftruncate(td, args->fd, args->length));
}
+#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
+int
+linux_ftruncate64(struct thread *td, struct linux_ftruncate64_args *args)
+{
+ off_t length;
+
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ length = PAIR32TO64(off_t, args->length);
+#else
+ length = args->length;
+#endif
+
+ return (kern_ftruncate(td, args->fd, length));
+}
+#endif
+
#ifdef LINUX_LEGACY_SYSCALLS
int
linux_link(struct thread *td, struct linux_link_args *args)
@@ -1006,8 +1028,17 @@ linux_fdatasync(struct thread *td, struct linux_fdatas
int
linux_sync_file_range(struct thread *td, struct linux_sync_file_range_args *uap)
{
+ off_t nbytes, offset;
- if (uap->offset < 0 || uap->nbytes < 0 ||
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ nbytes = PAIR32TO64(off_t, uap->nbytes);
+ offset = PAIR32TO64(off_t, uap->offset);
+#else
+ nbytes = uap->nbytes;
+ offset = uap->offset;
+#endif
+
+ if (offset < 0 || nbytes < 0 ||
(uap->flags & ~(LINUX_SYNC_FILE_RANGE_WAIT_BEFORE |
LINUX_SYNC_FILE_RANGE_WRITE |
LINUX_SYNC_FILE_RANGE_WAIT_AFTER)) != 0) {
@@ -1021,18 +1052,23 @@ int
linux_pread(struct thread *td, struct linux_pread_args *uap)
{
struct vnode *vp;
+ off_t offset;
int error;
- error = kern_pread(td, uap->fd, uap->buf, uap->nbyte, uap->offset);
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ offset = PAIR32TO64(off_t, uap->offset);
+#else
+ offset = uap->offset;
+#endif
+
+ error = kern_pread(td, uap->fd, uap->buf, uap->nbyte, offset);
if (error == 0) {
/* This seems to violate POSIX but Linux does it. */
error = fgetvp(td, uap->fd, &cap_pread_rights, &vp);
if (error != 0)
return (error);
- if (vp->v_type == VDIR) {
- vrele(vp);
- return (EISDIR);
- }
+ if (vp->v_type == VDIR)
+ error = EISDIR;
vrele(vp);
}
return (error);
@@ -1041,8 +1077,15 @@ linux_pread(struct thread *td, struct linux_pread_args
int
linux_pwrite(struct thread *td, struct linux_pwrite_args *uap)
{
+ off_t offset;
- return (kern_pwrite(td, uap->fd, uap->buf, uap->nbyte, uap->offset));
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ offset = PAIR32TO64(off_t, uap->offset);
+#else
+ offset = uap->offset;
+#endif
+
+ return (kern_pwrite(td, uap->fd, uap->buf, uap->nbyte, offset));
}
int
@@ -1586,26 +1629,40 @@ convert_fadvice(int advice)
int
linux_fadvise64(struct thread *td, struct linux_fadvise64_args *args)
{
+ off_t offset;
int advice;
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ offset = PAIR32TO64(off_t, args->offset);
+#else
+ offset = args->offset;
+#endif
+
advice = convert_fadvice(args->advice);
if (advice == -1)
return (EINVAL);
- return (kern_posix_fadvise(td, args->fd, args->offset, args->len,
- advice));
+ return (kern_posix_fadvise(td, args->fd, offset, args->len, advice));
}
#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
int
linux_fadvise64_64(struct thread *td, struct linux_fadvise64_64_args *args)
{
+ off_t len, offset;
int advice;
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ len = PAIR32TO64(off_t, args->len);
+ offset = PAIR32TO64(off_t, args->offset);
+#else
+ len = args->len;
+ offset = args->offset;
+#endif
+
advice = convert_fadvice(args->advice);
if (advice == -1)
return (EINVAL);
- return (kern_posix_fadvise(td, args->fd, args->offset, args->len,
- advice));
+ return (kern_posix_fadvise(td, args->fd, offset, len, advice));
}
#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
@@ -1689,6 +1746,7 @@ linux_dup3(struct thread *td, struct linux_dup3_args *
int
linux_fallocate(struct thread *td, struct linux_fallocate_args *args)
{
+ off_t len, offset;
/*
* We emulate only posix_fallocate system call for which
@@ -1697,6 +1755,13 @@ linux_fallocate(struct thread *td, struct linux_falloc
if (args->mode != 0)
return (ENOSYS);
- return (kern_posix_fallocate(td, args->fd, args->offset,
- args->len));
+#if defined(__amd64__) && defined(COMPAT_LINUX32)
+ len = PAIR32TO64(off_t, args->len);
+ offset = PAIR32TO64(off_t, args->offset);
+#else
+ len = args->len;
+ offset = args->offset;
+#endif
+
+ return (kern_posix_fallocate(td, args->fd, offset, len));
}
Modified: stable/12/sys/i386/linux/linux_machdep.c
==============================================================================
--- stable/12/sys/i386/linux/linux_machdep.c Fri Apr 3 16:28:39 2020 (r359604)
+++ stable/12/sys/i386/linux/linux_machdep.c Fri Apr 3 16:31:45 2020 (r359605)
@@ -616,19 +616,6 @@ linux_sigaltstack(struct thread *td, struct linux_siga
}
int
-linux_ftruncate64(struct thread *td, struct linux_ftruncate64_args *args)
-{
-
-#ifdef DEBUG
- if (ldebug(ftruncate64))
- printf(ARGS(ftruncate64, "%u, %jd"), args->fd,
- (intmax_t)args->length);
-#endif
-
- return (kern_ftruncate(td, args->fd, args->length));
-}
-
-int
linux_set_thread_area(struct thread *td, struct linux_set_thread_area_args *args)
{
struct l_user_desc info;
More information about the svn-src-all
mailing list