divamnt stores a start_time at init and uses it to calculate
elapsed time. These operations are all internal to divamnt.

Address struct timeval overflow on 32-bit systems by replacing:
struct timeval with struct timespec64; do_gettimeofday() with
getnstimeofday64(); the calculations that yield a safe and normalized
elapsed time with timespec64_sub() which provides same.

Signed-off-by: Alison Schofield <[email protected]>
---
 drivers/isdn/hardware/eicon/divamnt.c | 35 +++++++++++------------------------
 1 file changed, 11 insertions(+), 24 deletions(-)

diff --git a/drivers/isdn/hardware/eicon/divamnt.c 
b/drivers/isdn/hardware/eicon/divamnt.c
index 48db08d..7ac057e 100644
--- a/drivers/isdn/hardware/eicon/divamnt.c
+++ b/drivers/isdn/hardware/eicon/divamnt.c
@@ -45,7 +45,7 @@ char *DRIVERRELEASE_MNT = "2.0";
 
 static wait_queue_head_t msgwaitq;
 static unsigned long opened;
-static struct timeval start_time;
+static struct timespec64 start_time;
 
 extern int mntfunc_init(int *, void **, unsigned long);
 extern void mntfunc_finit(void);
@@ -88,28 +88,15 @@ int diva_os_copy_from_user(void *os_handle, void *dst, 
const void __user *src,
  */
 void diva_os_get_time(dword *sec, dword *usec)
 {
-       struct timeval tv;
-
-       do_gettimeofday(&tv);
-
-       if (tv.tv_sec > start_time.tv_sec) {
-               if (start_time.tv_usec > tv.tv_usec) {
-                       tv.tv_sec--;
-                       tv.tv_usec += 1000000;
-               }
-               *sec = (dword) (tv.tv_sec - start_time.tv_sec);
-               *usec = (dword) (tv.tv_usec - start_time.tv_usec);
-       } else if (tv.tv_sec == start_time.tv_sec) {
-               *sec = 0;
-               if (start_time.tv_usec < tv.tv_usec) {
-                       *usec = (dword) (tv.tv_usec - start_time.tv_usec);
-               } else {
-                       *usec = 0;
-               }
-       } else {
-               *sec = (dword) tv.tv_sec;
-               *usec = (dword) tv.tv_usec;
-       }
+       struct timespec64 curr_time;
+       struct timespec64 delta;
+
+       getnstimeofday64(&curr_time);
+
+       delta = timespec64_sub(curr_time, start_time);
+
+       *sec = (dword) delta.tv_sec;
+       *usec = (dword) (delta.tv_nsec / NSEC_PER_USEC);
 }
 
 /*
@@ -213,7 +200,7 @@ static int __init maint_init(void)
        int ret = 0;
        void *buffer = NULL;
 
-       do_gettimeofday(&start_time);
+       getnstimeofday64(&start_time);
        init_waitqueue_head(&msgwaitq);
 
        printk(KERN_INFO "%s\n", DRIVERNAME);
-- 
2.1.4

_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038

Reply via email to