Message ID | 20170730223006.32661-3-deepa.kernel@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, Jul 30, 2017 at 6:30 PM, Deepa Dinamani <deepa.kernel@gmail.com> wrote: > struct timespec is not y2038 safe. Replace > all uses of timespec by y2038 safe struct timespec64. > > Even though timespec is used here to represent timeouts, > replace these with timespec64 so that it facilitates > in verification by creating a y2038 safe kernel image > that is free of timespec. > > The syscall interfaces themselves are not changed as part > of the patch. They will be part of a different series. > > Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> > Cc: Paul Moore <paul@paul-moore.com> > Cc: Richard Guy Briggs <rgb@redhat.com> > Reviewed-by: Richard Guy Briggs <rgb@redhat.com> > --- > include/linux/audit.h | 6 +++--- > ipc/mqueue.c | 28 ++++++++++++++-------------- > kernel/audit.h | 2 +- > kernel/auditsc.c | 12 ++++++------ > 4 files changed, 24 insertions(+), 24 deletions(-) The audit bits look fine. Deepa, I assume you are going to seek to have this go in through a tree other than audit? Acked-by: Paul Moore <paul@paul-moore.com> > diff --git a/include/linux/audit.h b/include/linux/audit.h > index 2150bdccfbab..74d4d4e8e3db 100644 > --- a/include/linux/audit.h > +++ b/include/linux/audit.h > @@ -351,7 +351,7 @@ extern int __audit_socketcall(int nargs, unsigned long *args); > extern int __audit_sockaddr(int len, void *addr); > extern void __audit_fd_pair(int fd1, int fd2); > extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr); > -extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout); > +extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout); > extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification); > extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); > extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm, > @@ -412,7 +412,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) > if (unlikely(!audit_dummy_context())) > __audit_mq_open(oflag, mode, attr); > } > -static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout) > +static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout) > { > if (unlikely(!audit_dummy_context())) > __audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout); > @@ -549,7 +549,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) > { } > static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, > unsigned int msg_prio, > - const struct timespec *abs_timeout) > + const struct timespec64 *abs_timeout) > { } > static inline void audit_mq_notify(mqd_t mqdes, > const struct sigevent *notification) > diff --git a/ipc/mqueue.c b/ipc/mqueue.c > index c9ff943f19ab..5be1346a9167 100644 > --- a/ipc/mqueue.c > +++ b/ipc/mqueue.c > @@ -668,11 +668,11 @@ static void __do_notify(struct mqueue_inode_info *info) > } > > static int prepare_timeout(const struct timespec __user *u_abs_timeout, > - struct timespec *ts) > + struct timespec64 *ts) > { > - if (copy_from_user(ts, u_abs_timeout, sizeof(struct timespec))) > + if (get_timespec64(ts, u_abs_timeout)) > return -EFAULT; > - if (!timespec_valid(ts)) > + if (!timespec64_valid(ts)) > return -EINVAL; > return 0; > } > @@ -962,7 +962,7 @@ static inline void pipelined_receive(struct wake_q_head *wake_q, > > static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, > size_t msg_len, unsigned int msg_prio, > - struct timespec *ts) > + struct timespec64 *ts) > { > struct fd f; > struct inode *inode; > @@ -979,7 +979,7 @@ static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, > return -EINVAL; > > if (ts) { > - expires = timespec_to_ktime(*ts); > + expires = timespec64_to_ktime(*ts); > timeout = &expires; > } > > @@ -1080,7 +1080,7 @@ static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, > > static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, > size_t msg_len, unsigned int __user *u_msg_prio, > - struct timespec *ts) > + struct timespec64 *ts) > { > ssize_t ret; > struct msg_msg *msg_ptr; > @@ -1092,7 +1092,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, > struct posix_msg_tree_node *new_leaf = NULL; > > if (ts) { > - expires = timespec_to_ktime(*ts); > + expires = timespec64_to_ktime(*ts); > timeout = &expires; > } > > @@ -1184,7 +1184,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, > size_t, msg_len, unsigned int, msg_prio, > const struct timespec __user *, u_abs_timeout) > { > - struct timespec ts, *p = NULL; > + struct timespec64 ts, *p = NULL; > if (u_abs_timeout) { > int res = prepare_timeout(u_abs_timeout, &ts); > if (res) > @@ -1198,7 +1198,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, > size_t, msg_len, unsigned int __user *, u_msg_prio, > const struct timespec __user *, u_abs_timeout) > { > - struct timespec ts, *p = NULL; > + struct timespec64 ts, *p = NULL; > if (u_abs_timeout) { > int res = prepare_timeout(u_abs_timeout, &ts); > if (res) > @@ -1473,11 +1473,11 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name, > } > > static int compat_prepare_timeout(const struct compat_timespec __user *p, > - struct timespec *ts) > + struct timespec64 *ts) > { > - if (compat_get_timespec(ts, p)) > + if (compat_get_timespec64(ts, p)) > return -EFAULT; > - if (!timespec_valid(ts)) > + if (!timespec64_valid(ts)) > return -EINVAL; > return 0; > } > @@ -1487,7 +1487,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, > compat_size_t, msg_len, unsigned int, msg_prio, > const struct compat_timespec __user *, u_abs_timeout) > { > - struct timespec ts, *p = NULL; > + struct timespec64 ts, *p = NULL; > if (u_abs_timeout) { > int res = compat_prepare_timeout(u_abs_timeout, &ts); > if (res) > @@ -1502,7 +1502,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, > compat_size_t, msg_len, unsigned int __user *, u_msg_prio, > const struct compat_timespec __user *, u_abs_timeout) > { > - struct timespec ts, *p = NULL; > + struct timespec64 ts, *p = NULL; > if (u_abs_timeout) { > int res = compat_prepare_timeout(u_abs_timeout, &ts); > if (res) > diff --git a/kernel/audit.h b/kernel/audit.h > index b331d9b83f63..9b110ae17ee3 100644 > --- a/kernel/audit.h > +++ b/kernel/audit.h > @@ -182,7 +182,7 @@ struct audit_context { > mqd_t mqdes; > size_t msg_len; > unsigned int msg_prio; > - struct timespec abs_timeout; > + struct timespec64 abs_timeout; > } mq_sendrecv; > struct { > int oflag; > diff --git a/kernel/auditsc.c b/kernel/auditsc.c > index 3260ba2312a9..daee2d5bd03a 100644 > --- a/kernel/auditsc.c > +++ b/kernel/auditsc.c > @@ -1235,11 +1235,11 @@ static void show_special(struct audit_context *context, int *call_panic) > case AUDIT_MQ_SENDRECV: > audit_log_format(ab, > "mqdes=%d msg_len=%zd msg_prio=%u " > - "abs_timeout_sec=%ld abs_timeout_nsec=%ld", > + "abs_timeout_sec=%lld abs_timeout_nsec=%ld", > context->mq_sendrecv.mqdes, > context->mq_sendrecv.msg_len, > context->mq_sendrecv.msg_prio, > - context->mq_sendrecv.abs_timeout.tv_sec, > + (long long) context->mq_sendrecv.abs_timeout.tv_sec, > context->mq_sendrecv.abs_timeout.tv_nsec); > break; > case AUDIT_MQ_NOTIFY: > @@ -2083,15 +2083,15 @@ void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) > * > */ > void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, > - const struct timespec *abs_timeout) > + const struct timespec64 *abs_timeout) > { > struct audit_context *context = current->audit_context; > - struct timespec *p = &context->mq_sendrecv.abs_timeout; > + struct timespec64 *p = &context->mq_sendrecv.abs_timeout; > > if (abs_timeout) > - memcpy(p, abs_timeout, sizeof(struct timespec)); > + memcpy(p, abs_timeout, sizeof(*p)); > else > - memset(p, 0, sizeof(struct timespec)); > + memset(p, 0, sizeof(*p)); > > context->mq_sendrecv.mqdes = mqdes; > context->mq_sendrecv.msg_len = msg_len; > -- > 2.11.0 >
> The audit bits look fine. Deepa, I assume you are going to seek to > have this go in through a tree other than audit? > > Acked-by: Paul Moore <paul@paul-moore.com> Yes, the proposal was to go through Al's tree since he already has a few ipc patches queued up. Thanks, Deepa
diff --git a/include/linux/audit.h b/include/linux/audit.h index 2150bdccfbab..74d4d4e8e3db 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h @@ -351,7 +351,7 @@ extern int __audit_socketcall(int nargs, unsigned long *args); extern int __audit_sockaddr(int len, void *addr); extern void __audit_fd_pair(int fd1, int fd2); extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr); -extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout); +extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout); extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification); extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat); extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm, @@ -412,7 +412,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) if (unlikely(!audit_dummy_context())) __audit_mq_open(oflag, mode, attr); } -static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout) +static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec64 *abs_timeout) { if (unlikely(!audit_dummy_context())) __audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout); @@ -549,7 +549,7 @@ static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) { } static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, - const struct timespec *abs_timeout) + const struct timespec64 *abs_timeout) { } static inline void audit_mq_notify(mqd_t mqdes, const struct sigevent *notification) diff --git a/ipc/mqueue.c b/ipc/mqueue.c index c9ff943f19ab..5be1346a9167 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -668,11 +668,11 @@ static void __do_notify(struct mqueue_inode_info *info) } static int prepare_timeout(const struct timespec __user *u_abs_timeout, - struct timespec *ts) + struct timespec64 *ts) { - if (copy_from_user(ts, u_abs_timeout, sizeof(struct timespec))) + if (get_timespec64(ts, u_abs_timeout)) return -EFAULT; - if (!timespec_valid(ts)) + if (!timespec64_valid(ts)) return -EINVAL; return 0; } @@ -962,7 +962,7 @@ static inline void pipelined_receive(struct wake_q_head *wake_q, static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, size_t msg_len, unsigned int msg_prio, - struct timespec *ts) + struct timespec64 *ts) { struct fd f; struct inode *inode; @@ -979,7 +979,7 @@ static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, return -EINVAL; if (ts) { - expires = timespec_to_ktime(*ts); + expires = timespec64_to_ktime(*ts); timeout = &expires; } @@ -1080,7 +1080,7 @@ static int do_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr, static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, size_t msg_len, unsigned int __user *u_msg_prio, - struct timespec *ts) + struct timespec64 *ts) { ssize_t ret; struct msg_msg *msg_ptr; @@ -1092,7 +1092,7 @@ static int do_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr, struct posix_msg_tree_node *new_leaf = NULL; if (ts) { - expires = timespec_to_ktime(*ts); + expires = timespec64_to_ktime(*ts); timeout = &expires; } @@ -1184,7 +1184,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, size_t, msg_len, unsigned int, msg_prio, const struct timespec __user *, u_abs_timeout) { - struct timespec ts, *p = NULL; + struct timespec64 ts, *p = NULL; if (u_abs_timeout) { int res = prepare_timeout(u_abs_timeout, &ts); if (res) @@ -1198,7 +1198,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, size_t, msg_len, unsigned int __user *, u_msg_prio, const struct timespec __user *, u_abs_timeout) { - struct timespec ts, *p = NULL; + struct timespec64 ts, *p = NULL; if (u_abs_timeout) { int res = prepare_timeout(u_abs_timeout, &ts); if (res) @@ -1473,11 +1473,11 @@ COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name, } static int compat_prepare_timeout(const struct compat_timespec __user *p, - struct timespec *ts) + struct timespec64 *ts) { - if (compat_get_timespec(ts, p)) + if (compat_get_timespec64(ts, p)) return -EFAULT; - if (!timespec_valid(ts)) + if (!timespec64_valid(ts)) return -EINVAL; return 0; } @@ -1487,7 +1487,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, compat_size_t, msg_len, unsigned int, msg_prio, const struct compat_timespec __user *, u_abs_timeout) { - struct timespec ts, *p = NULL; + struct timespec64 ts, *p = NULL; if (u_abs_timeout) { int res = compat_prepare_timeout(u_abs_timeout, &ts); if (res) @@ -1502,7 +1502,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, compat_size_t, msg_len, unsigned int __user *, u_msg_prio, const struct compat_timespec __user *, u_abs_timeout) { - struct timespec ts, *p = NULL; + struct timespec64 ts, *p = NULL; if (u_abs_timeout) { int res = compat_prepare_timeout(u_abs_timeout, &ts); if (res) diff --git a/kernel/audit.h b/kernel/audit.h index b331d9b83f63..9b110ae17ee3 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -182,7 +182,7 @@ struct audit_context { mqd_t mqdes; size_t msg_len; unsigned int msg_prio; - struct timespec abs_timeout; + struct timespec64 abs_timeout; } mq_sendrecv; struct { int oflag; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 3260ba2312a9..daee2d5bd03a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -1235,11 +1235,11 @@ static void show_special(struct audit_context *context, int *call_panic) case AUDIT_MQ_SENDRECV: audit_log_format(ab, "mqdes=%d msg_len=%zd msg_prio=%u " - "abs_timeout_sec=%ld abs_timeout_nsec=%ld", + "abs_timeout_sec=%lld abs_timeout_nsec=%ld", context->mq_sendrecv.mqdes, context->mq_sendrecv.msg_len, context->mq_sendrecv.msg_prio, - context->mq_sendrecv.abs_timeout.tv_sec, + (long long) context->mq_sendrecv.abs_timeout.tv_sec, context->mq_sendrecv.abs_timeout.tv_nsec); break; case AUDIT_MQ_NOTIFY: @@ -2083,15 +2083,15 @@ void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr) * */ void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, - const struct timespec *abs_timeout) + const struct timespec64 *abs_timeout) { struct audit_context *context = current->audit_context; - struct timespec *p = &context->mq_sendrecv.abs_timeout; + struct timespec64 *p = &context->mq_sendrecv.abs_timeout; if (abs_timeout) - memcpy(p, abs_timeout, sizeof(struct timespec)); + memcpy(p, abs_timeout, sizeof(*p)); else - memset(p, 0, sizeof(struct timespec)); + memset(p, 0, sizeof(*p)); context->mq_sendrecv.mqdes = mqdes; context->mq_sendrecv.msg_len = msg_len;