summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2017-10-04 14:20:51 +0100
committerAlan Modra <amodra@gmail.com>2017-10-05 12:03:47 +1030
commit2ca7de3746be7484aa5affceafa1ad2e1d789381 (patch)
tree3b828944d881259232614619db2108122a203880
parent7d36e2799141d206651410c68080f40b88809a3b (diff)
bfd_set_input_error
A downside to the 2017-10-04 PR22245 fix is that bfd_set_error can now silently accept invalid errors if/when someone passes the a value of the wrong enumeration type, which previously would be caught by the -Wenum-conversion warning. PR 22245 * bfd.c (bfd_set_error): Revert 2017-10-04 change. Remove ellipsis parameter. Split out bfd_error_on_input code to.. (bfd_set_input_error): .. New function. * archive.c (_bfd_write_archive_contents): Use bfd_set_input_error. * vms-lib.c (_bfd_vms_lib_write_archive_contents): Likewise. * bfd-in2.h: Regenerate.
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/archive.c2
-rw-r--r--bfd/bfd-in2.h4
-rw-r--r--bfd/bfd.c51
-rw-r--r--bfd/vms-lib.c2
5 files changed, 48 insertions, 21 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c221cdb48b..4e52880b88 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2017-10-05 Pedro Alves <palves@redhat.com>
+
+ PR 22245
+ * bfd.c (bfd_set_error): Revert 2017-10-04 change. Remove
+ ellipsis parameter. Split out bfd_error_on_input code to..
+ (bfd_set_input_error): .. New function.
+ * archive.c (_bfd_write_archive_contents): Use bfd_set_input_error.
+ * vms-lib.c (_bfd_vms_lib_write_archive_contents): Likewise.
+ * bfd-in2.h: Regenerate.
+
2017-10-05 Alan Modra <amodra@gmail.com>
* elflink.c (elf_link_input_bfd): Correct ctor/dtor in init_array/
diff --git a/bfd/archive.c b/bfd/archive.c
index 3ce3f9eb89..1e87685643 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -2309,7 +2309,7 @@ _bfd_write_archive_contents (bfd *arch)
return TRUE;
input_err:
- bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
+ bfd_set_input_error (current, bfd_get_error ());
return FALSE;
}
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 62be566e75..4ba05b10b6 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -7054,7 +7054,9 @@ bfd_error_type;
bfd_error_type bfd_get_error (void);
-void bfd_set_error (int error_tag, ...);
+void bfd_set_error (bfd_error_type error_tag);
+
+void bfd_set_input_error (bfd *input, bfd_error_type error_tag);
const char *bfd_errmsg (bfd_error_type error_tag);
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 5da1a6fd53..f21c97aa53 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -497,32 +497,47 @@ FUNCTION
bfd_set_error
SYNOPSIS
- void bfd_set_error (int error_tag, ...);
+ void bfd_set_error (bfd_error_type error_tag);
DESCRIPTION
Set the BFD error condition to be @var{error_tag}.
- If @var{error_tag} is bfd_error_on_input, then this function
- takes two more parameters, the input bfd where the error
- occurred, and the bfd_error_type error.
+
+ @var{error_tag} must not be bfd_error_on_input. Use
+ bfd_set_input_error for input errors instead.
*/
void
-bfd_set_error (int error_tag, ...)
+bfd_set_error (bfd_error_type error_tag)
{
bfd_error = error_tag;
- if (error_tag == bfd_error_on_input)
- {
- /* This is an error that occurred during bfd_close when
- writing an archive, but on one of the input files. */
- va_list ap;
-
- va_start (ap, error_tag);
- input_bfd = va_arg (ap, bfd *);
- input_error = (bfd_error_type) va_arg (ap, int);
- if (input_error >= bfd_error_on_input)
- abort ();
- va_end (ap);
- }
+ if (bfd_error >= bfd_error_on_input)
+ abort ();
+}
+
+/*
+FUNCTION
+ bfd_set_input_error
+
+SYNOPSIS
+ void bfd_set_input_error (bfd *input, bfd_error_type error_tag);
+
+DESCRIPTION
+
+ Set the BFD error condition to be bfd_error_on_input.
+ @var{input} is the input bfd where the error occurred, and
+ @var{error_tag} the bfd_error_type error.
+*/
+
+void
+bfd_set_input_error (bfd *input, bfd_error_type error_tag)
+{
+ /* This is an error that occurred during bfd_close when writing an
+ archive, but on one of the input files. */
+ bfd_error = bfd_error_on_input;
+ input_bfd = input;
+ input_error = error_tag;
+ if (input_error >= bfd_error_on_input)
+ abort ();
}
/*
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c
index 7b1320de72..27f07e13a9 100644
--- a/bfd/vms-lib.c
+++ b/bfd/vms-lib.c
@@ -2305,7 +2305,7 @@ _bfd_vms_lib_write_archive_contents (bfd *arch)
return TRUE;
input_err:
- bfd_set_error (bfd_error_on_input, current, bfd_get_error ());
+ bfd_set_input_error (current, bfd_get_error ());
return FALSE;
}