#include <stdio.h>
#include <unbound.h>
int main(void)
{
FILE *tfh = tmpfile();
setvbuf( tfh, NULL, _IONBF, 0 );
struct ub_ctx* ctx;
for (int i=0; i<2; i++) {
ctx = ub_ctx_create();
ub_ctx_debuglevel(ctx, 5);
ub_ctx_debugout( ctx, tfh );
ub_ctx_delete(ctx);
if (-1 == fseek(tfh, 0, 0)) {
perror("fseek()");
}
}
}
The above code illustrates a problem where a 2nd context creation will clobber a leftover logfile from a former context.
It seems like the ideal fix would be to put the log state variables into the context struct rather than having them be globals?
(I haven’t tested it, but it looks like, given the globals, it would be problematic, for example, to have two concurrent Unbound objects in the same process with different log outputs?)
Failing that change … is there any way to fix this, short of removing that fclose() in log.c (and potentially breaking behavior that implementations may have been expecting now for over 10 years)?
Regardless, it seems like this issue should at least be documented? The existing libunbound(3) documentation for ub_ctx_debugout() gives the impression that log state is contained entirely within the log object, which of course isn’t the case.
The workaround seems to be to set the log handle to stderr before deleting the context … does that seem reasonable?
Thank you!
The above code illustrates a problem where a 2nd context creation will clobber a leftover logfile from a former context.
It seems like the ideal fix would be to put the log state variables into the context struct rather than having them be globals?
(I haven’t tested it, but it looks like, given the globals, it would be problematic, for example, to have two concurrent Unbound objects in the same process with different log outputs?)
Failing that change … is there any way to fix this, short of removing that fclose() in log.c (and potentially breaking behavior that implementations may have been expecting now for over 10 years)?
Regardless, it seems like this issue should at least be documented? The existing libunbound(3) documentation for ub_ctx_debugout() gives the impression that log state is contained entirely within the log object, which of course isn’t the case.
The workaround seems to be to set the log handle to stderr before deleting the context … does that seem reasonable?
Thank you!