upstream PR: https://github.com/doxygen/doxygen/pull/8739 What was happening is that the TextStream object is reused for multiple different files. Therefore, when one calls setStream(nullptr) or setFile(nullptr), m_f or m_s will, respectively, still contain a pointer to the previous member, which is used when one calls setFile() or setStream() again, since these methods will call flush(). For example, a program doing s.setFile(f1); s.setStream(nullptr); fclose(f1); s.setFile(f2); will call fwrite(f1, ...). This pattern can be observed in many parts of Doxygen, so fixing it in TextStream itself by always zeroing the other pointer is the simplest fix. diff --git a/src/textstream.h b/src/textstream.h index 161ce7fe..38027ec0 100644 --- a/src/textstream.h +++ b/src/textstream.h @@ -67,11 +67,13 @@ class TextStream final { flush(); m_s = s; + m_f = nullptr; } void setFile(FILE *f) { flush(); + m_s = nullptr; m_f = f; } -- 2.33.0