While reading through ber.c I noticed that ober_get_writebuf can return
the wrong length when called multiple times on the same ber instance.
This is because ober_get_writebuf uses br_wend to calculate the length,
while ober_write_elements uses that to determine the size of the buffer.
ober_write_elements uses br_wptr to determine how much has been written.
So use that pointer instead.
$ cat test.c
#include <stdio.h>
#include <string.h>
#include <ber.h>
int
main(int argc, char *argv[])
{
struct ber_element *root;
struct ber ber;
void *buf;
bzero(&ber, sizeof(ber));
root = ober_printf_elements(NULL, "{}");
printf("%zd\n", ober_write_elements(&ber, root));
printf("%zd\n", ober_get_writebuf(&ber, &buf));
ober_free_elements(root);
root = ober_printf_elements(NULL, "{d}", (int)1);
printf("%zd\n", ober_write_elements(&ber, root));
printf("%zd\n", ober_get_writebuf(&ber, &buf));
ober_free_elements(root);
root = ober_printf_elements(NULL, "{}");
printf("%zd\n", ober_write_elements(&ber, root));
printf("%zd\n", ober_get_writebuf(&ber, &buf));
}
$ CFLAGS='-lutil' make test && ./test
cc -lutil -o test test.c
2
2
5
5
2
5
OK?
martijn@
Index: ber.c
===================================================================
RCS file: /cvs/src/lib/libutil/ber.c,v
retrieving revision 1.23
diff -u -p -r1.23 ber.c
--- ber.c 21 Oct 2021 08:17:33 -0000 1.23
+++ ber.c 20 Jan 2022 17:48:27 -0000
@@ -831,7 +831,7 @@ ober_get_writebuf(struct ber *b, void **
if (b->br_wbuf == NULL)
return -1;
*buf = b->br_wbuf;
- return (b->br_wend - b->br_wbuf);
+ return (b->br_wptr - b->br_wbuf);
}
/*