Page MenuHomeFreeBSD

D60394.id188788.diff
No OneTemporary

D60394.id188788.diff

diff --git a/sys/amd64/linux/linux_proto.h b/sys/amd64/linux/linux_proto.h
--- a/sys/amd64/linux/linux_proto.h
+++ b/sys/amd64/linux/linux_proto.h
@@ -1436,7 +1436,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
struct linux_map_shadow_stack_args {
syscallarg_t dummy;
@@ -2059,7 +2062,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#define LINUX_SYS_AUE_linux_map_shadow_stack AUE_NULL
#undef PAD_
diff --git a/sys/amd64/linux/linux_sysent.c b/sys/amd64/linux/linux_sysent.c
--- a/sys/amd64/linux/linux_sysent.c
+++ b/sys/amd64/linux/linux_sysent.c
@@ -466,6 +466,6 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_map_shadow_stack, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 453 = linux_map_shadow_stack */
};
diff --git a/sys/amd64/linux/linux_systrace_args.c b/sys/amd64/linux/linux_systrace_args.c
--- a/sys/amd64/linux/linux_systrace_args.c
+++ b/sys/amd64/linux/linux_systrace_args.c
@@ -2806,7 +2806,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
/* linux_map_shadow_stack */
@@ -7298,6 +7303,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
/* linux_map_shadow_stack */
case 453:
@@ -8827,6 +8848,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
/* linux_map_shadow_stack */
case 453:
default:
diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master
--- a/sys/amd64/linux/syscalls.master
+++ b/sys/amd64/linux/syscalls.master
@@ -2188,8 +2188,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
453 AUE_NULL STD {
int linux_map_shadow_stack(void);
diff --git a/sys/amd64/linux32/linux32_proto.h b/sys/amd64/linux32/linux32_proto.h
--- a/sys/amd64/linux32/linux32_proto.h
+++ b/sys/amd64/linux32/linux32_proto.h
@@ -1737,7 +1737,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_exit(struct thread *, struct linux_exit_args *);
int linux_fork(struct thread *, struct linux_fork_args *);
@@ -2486,7 +2489,7 @@
#define LINUX32_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX32_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX32_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/amd64/linux32/linux32_sysent.c b/sys/amd64/linux32/linux32_sysent.c
--- a/sys/amd64/linux32/linux32_sysent.c
+++ b/sys/amd64/linux32/linux32_sysent.c
@@ -467,5 +467,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/amd64/linux32/linux32_systrace_args.c b/sys/amd64/linux32/linux32_systrace_args.c
--- a/sys/amd64/linux32/linux32_systrace_args.c
+++ b/sys/amd64/linux32/linux32_systrace_args.c
@@ -3322,7 +3322,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -8681,6 +8686,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -10497,6 +10518,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master
--- a/sys/amd64/linux32/syscalls.master
+++ b/sys/amd64/linux32/syscalls.master
@@ -2618,8 +2618,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off
diff --git a/sys/arm64/linux/linux_proto.h b/sys/arm64/linux/linux_proto.h
--- a/sys/arm64/linux/linux_proto.h
+++ b/sys/arm64/linux/linux_proto.h
@@ -1246,7 +1246,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_setxattr(struct thread *, struct linux_setxattr_args *);
int linux_lsetxattr(struct thread *, struct linux_lsetxattr_args *);
@@ -1767,7 +1770,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/arm64/linux/linux_sysent.c b/sys/arm64/linux/linux_sysent.c
--- a/sys/arm64/linux/linux_sysent.c
+++ b/sys/arm64/linux/linux_sysent.c
@@ -466,5 +466,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/arm64/linux/linux_systrace_args.c b/sys/arm64/linux/linux_systrace_args.c
--- a/sys/arm64/linux/linux_systrace_args.c
+++ b/sys/arm64/linux/linux_systrace_args.c
@@ -2428,7 +2428,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -6368,6 +6373,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -7679,6 +7700,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/arm64/linux/syscalls.master b/sys/arm64/linux/syscalls.master
--- a/sys/arm64/linux/syscalls.master
+++ b/sys/arm64/linux/syscalls.master
@@ -1866,8 +1866,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off
diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c
--- a/sys/compat/linux/linux_dummy.c
+++ b/sys/compat/linux/linux_dummy.c
@@ -145,5 +145,3 @@
DUMMY(set_mempolicy_home_node);
/* Linux 6.5: */
DUMMY(cachestat);
-/* Linux 6.6: */
-DUMMY(fchmodat2);
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -779,6 +779,28 @@
args->mode, 0));
}
+int
+linux_fchmodat2(struct thread *td, struct linux_fchmodat2_args *args)
+{
+ int bsdflags, dfd, lflags;
+
+ bsdflags = 0;
+ lflags = args->flags;
+
+ if ((lflags & ~(LINUX_AT_EMPTY_PATH | LINUX_AT_SYMLINK_NOFOLLOW)) != 0)
+ return (EINVAL);
+
+ if ((lflags & LINUX_AT_EMPTY_PATH) != 0)
+ bsdflags |= AT_EMPTY_PATH;
+
+ if ((lflags & LINUX_AT_SYMLINK_NOFOLLOW) != 0)
+ bsdflags |= AT_SYMLINK_NOFOLLOW;
+
+ dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd;
+ return (kern_fchmodat(td, dfd, args->filename, UIO_USERSPACE,
+ args->mode, bsdflags));
+}
+
#ifdef LINUX_LEGACY_SYSCALLS
int
linux_mkdir(struct thread *td, struct linux_mkdir_args *args)
diff --git a/sys/i386/linux/linux_proto.h b/sys/i386/linux/linux_proto.h
--- a/sys/i386/linux/linux_proto.h
+++ b/sys/i386/linux/linux_proto.h
@@ -1731,7 +1731,10 @@
syscallarg_t dummy;
};
struct linux_fchmodat2_args {
- syscallarg_t dummy;
+ char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];
+ char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)];
+ char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)];
+ char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];
};
int linux_exit(struct thread *, struct linux_exit_args *);
int linux_fork(struct thread *, struct linux_fork_args *);
@@ -2484,7 +2487,7 @@
#define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL
#define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL
#define LINUX_SYS_AUE_linux_cachestat AUE_NULL
-#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL
+#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT
#undef PAD_
#undef PADL_
diff --git a/sys/i386/linux/linux_sysent.c b/sys/i386/linux/linux_sysent.c
--- a/sys/i386/linux/linux_sysent.c
+++ b/sys/i386/linux/linux_sysent.c
@@ -466,5 +466,5 @@
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */
{ .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */
- { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
+ { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */
};
diff --git a/sys/i386/linux/linux_systrace_args.c b/sys/i386/linux/linux_systrace_args.c
--- a/sys/i386/linux/linux_systrace_args.c
+++ b/sys/i386/linux/linux_systrace_args.c
@@ -3353,7 +3353,12 @@
}
/* linux_fchmodat2 */
case 452: {
- *n_args = 0;
+ struct linux_fchmodat2_args *p = params;
+ iarg[a++] = p->dfd; /* l_int */
+ uarg[a++] = (intptr_t)p->filename; /* const char * */
+ iarg[a++] = p->mode; /* l_mode_t */
+ iarg[a++] = p->flags; /* l_int */
+ *n_args = 4;
break;
}
default:
@@ -8737,6 +8742,22 @@
break;
/* linux_fchmodat2 */
case 452:
+ switch (ndx) {
+ case 0:
+ p = "l_int";
+ break;
+ case 1:
+ p = "userland const char *";
+ break;
+ case 2:
+ p = "l_mode_t";
+ break;
+ case 3:
+ p = "l_int";
+ break;
+ default:
+ break;
+ };
break;
default:
break;
@@ -10577,6 +10598,9 @@
case 451:
/* linux_fchmodat2 */
case 452:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master
--- a/sys/i386/linux/syscalls.master
+++ b/sys/i386/linux/syscalls.master
@@ -2630,8 +2630,13 @@
int linux_cachestat(void);
}
; Linux 6.6:
-452 AUE_NULL STD {
- int linux_fchmodat2(void);
+452 AUE_FCHMODAT STD {
+ int linux_fchmodat2(
+ l_int dfd,
+ const char *filename,
+ l_mode_t mode,
+ l_int flags
+ );
}
; vim: syntax=off

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 10, 6:57 PM (8 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40531540
Default Alt Text
D60394.id188788.diff (14 KB)

Event Timeline