Re: [RESEND PATCH 2/6] ipc: mqueue: Replace timespec with timespec64

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2017-07-28 11:52, Deepa Dinamani 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@xxxxxxxxx>
> Cc: Paul Moore <paul@xxxxxxxxxxxxxx>
> Cc: Richard Guy Briggs <rgb@xxxxxxxxxx>

Looks reasonable to me.
Reviewed-by: Richard Guy Briggs <rgb@xxxxxxxxxx>

> ---
>  include/linux/audit.h |  6 +++---
>  ipc/mqueue.c          | 28 ++++++++++++++--------------
>  kernel/audit.h        |  2 +-
>  kernel/auditsc.c      | 12 ++++++------
>  4 files changed, 24 insertions(+), 24 deletions(-)
> 
> 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..d0870f8e3656 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(struct timespec64));
>  	else
> -		memset(p, 0, sizeof(struct timespec));
> +		memset(p, 0, sizeof(struct timespec64));
>  
>  	context->mq_sendrecv.mqdes = mqdes;
>  	context->mq_sendrecv.msg_len = msg_len;
> -- 
> 2.11.0
> 

- RGB

--
Richard Guy Briggs <rgb@xxxxxxxxxx>
Sr. S/W Engineer, Kernel Security, Base Operating Systems
Remote, Ottawa, Red Hat Canada
IRC: rgb, SunRaycer
Voice: +1.647.777.2635, Internal: (81) 32635



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux