All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Convert ppdev to y2038 safe
@ 2015-12-09  6:11 Bamvor Jian Zhang
  2015-12-09  6:11 ` [PATCH 1/2] ppdev: convert " Bamvor Jian Zhang
  2015-12-09  6:11 ` [PATCH 2/2] ppdev: add support for compat ioctl Bamvor Jian Zhang
  0 siblings, 2 replies; 6+ messages in thread
From: Bamvor Jian Zhang @ 2015-12-09  6:11 UTC (permalink / raw)
  To: linux-kernel
  Cc: y2038, gregkh, arnd, sudipm.mukherjee, broonie, Bamvor Jian Zhang

These series of patches try to convert parport device(ppdev) to
y2038 safe, and support y2038 safe and unsafe application at the
same time. There were some discussions in y2038 mailing list[1].

An y2038 safe application/kernel use 64bit time_t(aka time64_t)
to avoid 32-bit time types broken in the year 2038. Given that
some time relative struct(e.g. timeval in ppdev.c) is mainly the
offset of the real time, the old 32bit time_t in such application
is safe. We need to handle the 32bit time_t and 64bit time_t
application at the same time. My approach here is handle them as
different ioctl command for different size of timeval.

Build successful on arm64 and arm.

[1] https://lists.linaro.org/pipermail/y2038/

Bamvor Jian Zhang (2):
  ppdev: convert to y2038 safe
  ppdev: add support for compat ioctl

 drivers/char/ppdev.c | 86 ++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 66 insertions(+), 20 deletions(-)

-- 
2.1.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] ppdev: convert to y2038 safe
  2015-12-09  6:11 [PATCH 0/2] Convert ppdev to y2038 safe Bamvor Jian Zhang
@ 2015-12-09  6:11 ` Bamvor Jian Zhang
  2015-12-09  9:45   ` [Y2038] " Arnd Bergmann
  2015-12-09  6:11 ` [PATCH 2/2] ppdev: add support for compat ioctl Bamvor Jian Zhang
  1 sibling, 1 reply; 6+ messages in thread
From: Bamvor Jian Zhang @ 2015-12-09  6:11 UTC (permalink / raw)
  To: linux-kernel
  Cc: y2038, gregkh, arnd, sudipm.mukherjee, broonie, Bamvor Jian Zhang

The y2038 issue for ppdev is changes of timeval in the ioctl
(PPSETTIME and PPGETTIME). The size of struct timeval changes from
8bytes to 16bytes due to the changes of time_t. It lead to the
changes of the command of ioctl, e.g. for PPGETTIME, We have:

on 32-bit (old): 0x80087095
on 32-bit (new): 0x80107095
on 64-bit      : 0x80107095

This patch define these two ioctl commands to support the 32bit
and 64bit time_t application at the same time. And, introduce
pp_set_timeout to remove some duplicated code.

Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
---
 drivers/char/ppdev.c | 75 ++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 55 insertions(+), 20 deletions(-)

diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index ae0b42b..19a4d6e 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -98,6 +98,13 @@ struct pp_struct {
 #define ROUND_UP(x,y) (((x)+(y)-1)/(y))
 
 static DEFINE_MUTEX(pp_do_mutex);
+
+/* define fixed sized ioctl cmd for y2038 migration */
+#define PPGETTIME32	_IOR(PP_IOCTL, 0x95, s32[2])
+#define PPSETTIME32	_IOW(PP_IOCTL, 0x96, s32[2])
+#define PPGETTIME64	_IOR(PP_IOCTL, 0x95, s64[2])
+#define PPSETTIME64	_IOW(PP_IOCTL, 0x96, s64[2])
+
 static inline void pp_enable_irq (struct pp_struct *pp)
 {
 	struct parport *port = pp->pdev->port;
@@ -322,6 +329,22 @@ static enum ieee1284_phase init_phase (int mode)
 	return IEEE1284_PH_FWD_IDLE;
 }
 
+static int pp_set_timeout(struct pardevice *pdev, long tv_sec, int tv_usec)
+{
+	long to_jiffies;
+
+	if ((tv_sec < 0) || (tv_usec < 0))
+		return -EINVAL;
+
+	to_jiffies = usecs_to_jiffies(tv_usec);
+	to_jiffies += tv_sec * HZ;
+	if (to_jiffies <= 0)
+		return -EINVAL;
+
+	pdev->timeout = to_jiffies;
+	return 0;
+}
+
 static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
 	unsigned int minor = iminor(file_inode(file));
@@ -495,9 +518,10 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		unsigned char reg;
 		unsigned char mask;
 		int mode;
+		s32 time32[2];
+		s64 time64[2];
+		struct timespec64 ts;
 		int ret;
-		struct timeval par_timeout;
-		long to_jiffies;
 
 	case PPRSTATUS:
 		reg = parport_read_status (port);
@@ -592,29 +616,40 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		atomic_sub (ret, &pp->irqc);
 		return 0;
 
-	case PPSETTIME:
-		if (copy_from_user (&par_timeout, argp, sizeof(struct timeval))) {
+	case PPSETTIME32:
+		if (copy_from_user(time32, argp, sizeof(time32)))
 			return -EFAULT;
-		}
-		/* Convert to jiffies, place in pp->pdev->timeout */
-		if ((par_timeout.tv_sec < 0) || (par_timeout.tv_usec < 0)) {
-			return -EINVAL;
-		}
-		to_jiffies = ROUND_UP(par_timeout.tv_usec, 1000000/HZ);
-		to_jiffies += par_timeout.tv_sec * (long)HZ;
-		if (to_jiffies <= 0) {
+
+		return pp_set_timeout(pp->pdev, time32[0], time32[1]);
+
+	case PPSETTIME64:
+		if (copy_from_user(time64, argp, sizeof(time64)))
+			return -EFAULT;
+
+		return pp_set_timeout(pp->pdev, time64[0], time64[1]);
+
+	case PPGETTIME32:
+		jiffies_to_timespec64(pp->pdev->timeout, &ts);
+		time32[0] = ts.tv_sec;
+		time32[1] = ts.tv_nsec / NSEC_PER_USEC;
+		if ((time32[0] < 0) || (time32[1] < 0))
 			return -EINVAL;
-		}
-		pp->pdev->timeout = to_jiffies;
+
+		if (copy_to_user(time32, argp, sizeof(time32)))
+			return -EFAULT;
+
 		return 0;
 
-	case PPGETTIME:
-		to_jiffies = pp->pdev->timeout;
-		memset(&par_timeout, 0, sizeof(par_timeout));
-		par_timeout.tv_sec = to_jiffies / HZ;
-		par_timeout.tv_usec = (to_jiffies % (long)HZ) * (1000000/HZ);
-		if (copy_to_user (argp, &par_timeout, sizeof(struct timeval)))
+	case PPGETTIME64:
+		jiffies_to_timespec64(pp->pdev->timeout, &ts);
+		time64[0] = ts.tv_sec;
+		time64[1] = ts.tv_nsec / NSEC_PER_USEC;
+		if ((time64[0] < 0) || (time64[1] < 0))
+			return -EINVAL;
+
+		if (copy_to_user(time64, argp, sizeof(time64)))
 			return -EFAULT;
+
 		return 0;
 
 	default:
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] ppdev: add support for compat ioctl
  2015-12-09  6:11 [PATCH 0/2] Convert ppdev to y2038 safe Bamvor Jian Zhang
  2015-12-09  6:11 ` [PATCH 1/2] ppdev: convert " Bamvor Jian Zhang
@ 2015-12-09  6:11 ` Bamvor Jian Zhang
  2015-12-09  6:39   ` kbuild test robot
  1 sibling, 1 reply; 6+ messages in thread
From: Bamvor Jian Zhang @ 2015-12-09  6:11 UTC (permalink / raw)
  To: linux-kernel
  Cc: y2038, gregkh, arnd, sudipm.mukherjee, broonie, Bamvor Jian Zhang

The arg of ioctl in ppdev is the pointer of integer except the
timeval in PPSETTIME, PPGETTIME. Different size of timeval
is already supported by the previous patches. So, it is safe
to add compat support.

Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
---
 drivers/char/ppdev.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index 19a4d6e..7390166 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -670,6 +670,14 @@ static long pp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	return ret;
 }
 
+#ifdef CONFIG_COMPAT
+static long pp_compat_ioctl(struct file *file, unsigned int cmd,
+		unsigned long arg)
+{
+	return pp_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
+}
+#endif
+
 static int pp_open (struct inode * inode, struct file * file)
 {
 	unsigned int minor = iminor(inode);
@@ -779,6 +787,9 @@ static const struct file_operations pp_fops = {
 	.write		= pp_write,
 	.poll		= pp_poll,
 	.unlocked_ioctl	= pp_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl   = pp_compat_ioctl,
+#endif
 	.open		= pp_open,
 	.release	= pp_release,
 };
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] ppdev: add support for compat ioctl
  2015-12-09  6:11 ` [PATCH 2/2] ppdev: add support for compat ioctl Bamvor Jian Zhang
@ 2015-12-09  6:39   ` kbuild test robot
  2015-12-09  9:44     ` [Y2038] " Arnd Bergmann
  0 siblings, 1 reply; 6+ messages in thread
From: kbuild test robot @ 2015-12-09  6:39 UTC (permalink / raw)
  To: Bamvor Jian Zhang
  Cc: kbuild-all, linux-kernel, y2038, gregkh, arnd, sudipm.mukherjee,
	broonie, Bamvor Jian Zhang

[-- Attachment #1: Type: text/plain, Size: 1222 bytes --]

Hi Bamvor,

[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v4.4-rc4 next-20151208]

url:    https://github.com/0day-ci/linux/commits/Bamvor-Jian-Zhang/Convert-ppdev-to-y2038-safe/20151209-141616
config: x86_64-randconfig-n0-12091355 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/char/ppdev.c: In function 'pp_compat_ioctl':
>> drivers/char/ppdev.c:677:44: error: implicit declaration of function 'compat_ptr' [-Werror=implicit-function-declaration]
     return pp_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
                                               ^
   cc1: some warnings being treated as errors

vim +/compat_ptr +677 drivers/char/ppdev.c

   671	}
   672	
   673	#ifdef CONFIG_COMPAT
   674	static long pp_compat_ioctl(struct file *file, unsigned int cmd,
   675			unsigned long arg)
   676	{
 > 677		return pp_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
   678	}
   679	#endif
   680	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 21550 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Y2038] [PATCH 2/2] ppdev: add support for compat ioctl
  2015-12-09  6:39   ` kbuild test robot
@ 2015-12-09  9:44     ` Arnd Bergmann
  0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2015-12-09  9:44 UTC (permalink / raw)
  To: y2038
  Cc: kbuild test robot, Bamvor Jian Zhang, gregkh, linux-kernel,
	broonie, kbuild-all, sudipm.mukherjee

On Wednesday 09 December 2015 14:39:30 kbuild test robot wrote:
>    671  }
>    672  
>    673  #ifdef CONFIG_COMPAT
>    674  static long pp_compat_ioctl(struct file *file, unsigned int cmd,
>    675                  unsigned long arg)
>    676  {
>  > 677          return pp_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
>    678  }
>    679  #endif
>    680  
> 

This needs

#include <linux/compat.h>

	Arnd

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Y2038] [PATCH 1/2] ppdev: convert to y2038 safe
  2015-12-09  6:11 ` [PATCH 1/2] ppdev: convert " Bamvor Jian Zhang
@ 2015-12-09  9:45   ` Arnd Bergmann
  0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2015-12-09  9:45 UTC (permalink / raw)
  To: y2038; +Cc: Bamvor Jian Zhang, linux-kernel, gregkh, broonie, sudipm.mukherjee

On Wednesday 09 December 2015 14:11:37 Bamvor Jian Zhang wrote:
> The y2038 issue for ppdev is changes of timeval in the ioctl
> (PPSETTIME and PPGETTIME). The size of struct timeval changes from
> 8bytes to 16bytes due to the changes of time_t. It lead to the
> changes of the command of ioctl, e.g. for PPGETTIME, We have:
> 
> on 32-bit (old): 0x80087095
> on 32-bit (new): 0x80107095
> on 64-bit      : 0x80107095
> 
> This patch define these two ioctl commands to support the 32bit
> and 64bit time_t application at the same time. And, introduce
> pp_set_timeout to remove some duplicated code.
> 
> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>

I've reviewed the previous versions in detail, and am happy with
the latest one.

Reviewed-by: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-12-09  9:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-09  6:11 [PATCH 0/2] Convert ppdev to y2038 safe Bamvor Jian Zhang
2015-12-09  6:11 ` [PATCH 1/2] ppdev: convert " Bamvor Jian Zhang
2015-12-09  9:45   ` [Y2038] " Arnd Bergmann
2015-12-09  6:11 ` [PATCH 2/2] ppdev: add support for compat ioctl Bamvor Jian Zhang
2015-12-09  6:39   ` kbuild test robot
2015-12-09  9:44     ` [Y2038] " Arnd Bergmann

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.