As discussed this morning with Claudio ber_printf_elements might give
the impression that it cleans up everything on failure, while it only
removes the last element before '.', which is (from a quick scan) not
used in our tree.
Since 'e' is the only parameter that gets linked in instead of copied
in the caller is responsible of testing if said variable(s) are
linked in or not. This is unfortunately not addressed by this diff.
To make the situation a little more understandable I propose that we
never clean up on error (just change the behaviour of '.').
OK?
martijn@
Index: ber.c
===================================================================
RCS file: /cvs/src/lib/libutil/ber.c,v
retrieving revision 1.14
diff -u -p -r1.14 ber.c
--- ber.c 15 Aug 2019 06:11:18 -0000 1.14
+++ ber.c 3 Oct 2019 16:06:43 -0000
@@ -580,17 +580,17 @@ ber_printf_elements(struct ber_element *
p = va_arg(ap, void *);
len = va_arg(ap, size_t);
if ((ber = ber_add_bitstring(ber, p, len)) == NULL)
- goto fail;
+ return NULL;
break;
case 'b':
d = va_arg(ap, int);
if ((ber = ber_add_boolean(ber, d)) == NULL)
- goto fail;
+ return NULL;
break;
case 'd':
d = va_arg(ap, int);
if ((ber = ber_add_integer(ber, d)) == NULL)
- goto fail;
+ return NULL;
break;
case 'e':
e = va_arg(ap, struct ber_element *);
@@ -599,27 +599,27 @@ ber_printf_elements(struct ber_element *
case 'E':
i = va_arg(ap, long long);
if ((ber = ber_add_enumerated(ber, i)) == NULL)
- goto fail;
+ return NULL;
break;
case 'i':
i = va_arg(ap, long long);
if ((ber = ber_add_integer(ber, i)) == NULL)
- goto fail;
+ return NULL;
break;
case 'O':
o = va_arg(ap, struct ber_oid *);
if ((ber = ber_add_oid(ber, o)) == NULL)
- goto fail;
+ return NULL;
break;
case 'o':
s = va_arg(ap, char *);
if ((ber = ber_add_oidstring(ber, s)) == NULL)
- goto fail;
+ return NULL;
break;
case 's':
s = va_arg(ap, char *);
if ((ber = ber_add_string(ber, s)) == NULL)
- goto fail;
+ return NULL;
break;
case 't':
class = va_arg(ap, int);
@@ -630,28 +630,27 @@ ber_printf_elements(struct ber_element *
s = va_arg(ap, char *);
len = va_arg(ap, size_t);
if ((ber = ber_add_nstring(ber, s, len)) == NULL)
- goto fail;
+ return NULL;
break;
case '0':
if ((ber = ber_add_null(ber)) == NULL)
- goto fail;
+ return NULL;
break;
case '{':
if ((ber = sub = ber_add_sequence(ber)) == NULL)
- goto fail;
+ return NULL;
break;
case '(':
if ((ber = sub = ber_add_set(ber)) == NULL)
- goto fail;
+ return NULL;
break;
case '}':
case ')':
ber = sub;
break;
case '.':
- if ((e = ber_add_eoc(ber)) == NULL)
- goto fail;
- ber = e;
+ if ((ber = ber_add_eoc(ber)) == NULL)
+ return NULL;
break;
default:
break;
@@ -660,9 +659,6 @@ ber_printf_elements(struct ber_element *
va_end(ap);
return (ber);
- fail:
- ber_free_elements(ber);
- return (NULL);
}
int