X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fvms-misc.c;h=91e2ec76c223bbdb35783cec7ae949d835456369;hb=0ee5a0e48314fec3522f7eabadd5fea920628077;hp=984004337d13e0338882fcec836f35110a98c954;hpb=81bb31c0d9904c80f282134ea1ccb6899f93b0a6;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/vms-misc.c b/bfd/vms-misc.c index 984004337d..91e2ec76c2 100644 --- a/bfd/vms-misc.c +++ b/bfd/vms-misc.c @@ -1,7 +1,6 @@ /* vms-misc.c -- BFD back-end for VMS/VAX (openVMS/VAX) and EVAX (openVMS/Alpha) files. - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1996-2017 Free Software Foundation, Inc. Miscellaneous functions. @@ -136,11 +135,11 @@ _bfd_hexdump (int level, unsigned char *ptr, int size, int offset) #endif -/* Copy sized string (string with fixed size) to new allocated area - size is string size (size of record) */ +/* Copy sized string (string with fixed size) to new allocated area. + Size is string size (size of record). */ char * -_bfd_vms_save_sized_string (unsigned char *str, int size) +_bfd_vms_save_sized_string (unsigned char *str, unsigned int size) { char *newstr = bfd_malloc ((bfd_size_type) size + 1); @@ -152,14 +151,16 @@ _bfd_vms_save_sized_string (unsigned char *str, int size) return newstr; } -/* Copy counted string (string with size at first byte) to new allocated area - ptr points to size byte on entry */ +/* Copy counted string (string with size at first byte) to new allocated area. + PTR points to size byte on entry. */ char * -_bfd_vms_save_counted_string (unsigned char *ptr) +_bfd_vms_save_counted_string (unsigned char *ptr, unsigned int maxlen) { - int len = *ptr++; + unsigned int len = *ptr++; + if (len > maxlen) + return NULL; return _bfd_vms_save_sized_string (ptr, len); } @@ -357,12 +358,12 @@ _bfd_vms_output_counted (struct vms_rec_wr *recwr, const char *value) len = strlen (value); if (len == 0) { - (*_bfd_error_handler) (_("_bfd_vms_output_counted called with zero bytes")); + _bfd_error_handler (_("_bfd_vms_output_counted called with zero bytes")); return; } if (len > 255) { - (*_bfd_error_handler) (_("_bfd_vms_output_counted called with too many bytes")); + _bfd_error_handler (_("_bfd_vms_output_counted called with too many bytes")); return; } _bfd_vms_output_byte (recwr, (unsigned int) len & 0xff); @@ -401,8 +402,8 @@ _bfd_vms_output_fill (struct vms_rec_wr *recwr, int value, int count) using undocumented system call sys$modify(). Pure VMS version. */ -void -_bfd_vms_convert_to_var (char * vms_filename) +static void +vms_convert_to_var (char * vms_filename) { struct FAB fab = cc$rms_fab; @@ -433,8 +434,8 @@ vms_convert_to_var_1 (char *filename, int type) using undocumented system call sys$modify(). Unix filename version. */ -static int -vms_convert_to_var_unix_filename (const char *unix_filename) +int +_bfd_vms_convert_to_var_unix_filename (const char *unix_filename) { if (decc$to_vms (unix_filename, &vms_convert_to_var_1, 0, 1) != 1) return FALSE; @@ -530,7 +531,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 +550,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 +567,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. */