X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fvms-misc.c;h=bc422895bd02a2369ab9dec30ad08fe55c089c32;hb=488d02fe7729dda5b9414a3942df68e0c316ce53;hp=49b8274e772a8f4fdb236717984722c864a725a5;hpb=81c5c866a5705421e71a559589cff136221054e0;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/vms-misc.c b/bfd/vms-misc.c index 49b8274e77..bc422895bd 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-2019 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); } @@ -251,7 +252,7 @@ _bfd_vms_output_end_subrec (struct vms_rec_wr *recwr) /* Put length to buffer. */ bfd_putl16 ((bfd_vma) (recwr->size - recwr->subrec_offset), - recwr->buf + recwr->subrec_offset + 2); + recwr->buf + recwr->subrec_offset + 2); /* Close the subrecord. */ recwr->subrec_offset = 0; @@ -348,7 +349,7 @@ _bfd_vms_output_quad (struct vms_rec_wr *recwr, bfd_vma value) /* Output c-string as counted string. */ void -_bfd_vms_output_counted (struct vms_rec_wr *recwr, char *value) +_bfd_vms_output_counted (struct vms_rec_wr *recwr, const char *value) { int len; @@ -357,22 +358,22 @@ _bfd_vms_output_counted (struct vms_rec_wr *recwr, 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); - _bfd_vms_output_dump (recwr, (unsigned char *) value, len); + _bfd_vms_output_dump (recwr, (const unsigned char *)value, len); } /* Output character area. */ void -_bfd_vms_output_dump (struct vms_rec_wr *recwr, unsigned char *data, int len) +_bfd_vms_output_dump (struct vms_rec_wr *recwr, const unsigned char *data, int len) { vms_debug2 ((6, "_bfd_vms_output_dump (%d)\n", len)); @@ -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; @@ -515,12 +516,12 @@ vms_get_module_name (const char *filename, bfd_boolean upcase) for (fptr = fname; *fptr != 0; fptr++) { if (*fptr == ';' || (fptr - fname) >= 31) - { - *fptr = 0; - break; - } + { + *fptr = 0; + break; + } if (upcase) - *fptr = TOUPPER (*fptr); + *fptr = TOUPPER (*fptr); } return fname; } @@ -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. */