summaryrefslogtreecommitdiff
path: root/bfd/vms-misc.c
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2011-06-27 08:24:19 +0000
committerTristan Gingold <gingold@adacore.com>2011-06-27 08:24:19 +0000
commite4309be8c4b46a4c76413266a0744f4d13b957cd (patch)
treebfbadb676b75279ece01dfe7a1555927ec45b118 /bfd/vms-misc.c
parent099331a13bfa8c6742fa1dffad9fe0fa29e8e526 (diff)
downloadbinutils-redhat-e4309be8c4b46a4c76413266a0744f4d13b957cd.tar.gz
2011-06-27 Tristan Gingold <gingold@adacore.com>
* vms-misc.c (vms_time_to_time_t): Adjust overflow detection. Add comment.
Diffstat (limited to 'bfd/vms-misc.c')
-rw-r--r--bfd/vms-misc.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/bfd/vms-misc.c b/bfd/vms-misc.c
index a2665b7e4f..2ea2267d18 100644
--- a/bfd/vms-misc.c
+++ b/bfd/vms-misc.c
@@ -530,7 +530,10 @@ vms_get_module_name (const char *filename, bfd_boolean upcase)
- 100ns granularity
- epoch is Nov 17, 1858.
Here has the constants and the routines used to convert VMS from/to UNIX time.
- The conversion routines don't assume 64 bits arithmetic. */
+ The conversion routines don't assume 64 bits arithmetic.
+
+ Here we assume that the definition of time_t is the UNIX one, ie integer
+ type, expressing seconds since the epoch. */
/* UNIX time granularity for VMS, ie 1s / 100ns. */
#define VMS_TIME_FACTOR 10000000
@@ -546,6 +549,7 @@ vms_time_to_time_t (unsigned int hi, unsigned int lo)
unsigned int tmp;
unsigned int rlo;
int i;
+ time_t res;
/* First convert to seconds. */
tmp = hi % VMS_TIME_FACTOR;
@@ -562,14 +566,18 @@ vms_time_to_time_t (unsigned int hi, unsigned int lo)
lo = rlo;
/* Return 0 in case of overflow. */
- if (lo > VMS_TIME_OFFSET && hi > 1)
+ if (hi > 1
+ || (hi == 1 && lo >= VMS_TIME_OFFSET))
return 0;
/* Return 0 in case of underflow. */
- if (lo < VMS_TIME_OFFSET)
+ if (hi == 0 && lo < VMS_TIME_OFFSET)
return 0;
- return lo - VMS_TIME_OFFSET;
+ res = lo - VMS_TIME_OFFSET;
+ if (res <= 0)
+ return 0;
+ return res;
}
/* Convert a time_t to a VMS time. */