From 6ddc34f028e7905db192ba58a1bdff27515b61a2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 13 Sep 2020 08:42:30 +0200 Subject: [PATCH] hooks: fix segfault during destruction of stats hook --- lib/hooks/stats.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/hooks/stats.cpp b/lib/hooks/stats.cpp index a71658842..56db378ab 100644 --- a/lib/hooks/stats.cpp +++ b/lib/hooks/stats.cpp @@ -99,8 +99,8 @@ class StatsHook : public Hook { friend StatsWriteHook; protected: - StatsReadHook readHook; - StatsWriteHook writeHook; + StatsReadHook *readHook; + StatsWriteHook *writeHook; enum Stats::Format format; int verbose; @@ -116,8 +116,6 @@ public: StatsHook(struct vpath *p, struct vnode *n, int fl, int prio, bool en = true) : Hook(p, n, fl, prio, en), - readHook(this, p, n, fl, prio, en), - writeHook(this, p, n, fl, prio, en), format(Stats::Format::HUMAN), verbose(0), warmup(500), @@ -125,13 +123,22 @@ public: output(nullptr), uri() { + readHook = new StatsReadHook(this, p, n, fl, prio, en); + writeHook = new StatsWriteHook(this, p, n, fl, prio, en); + + if (!readHook || !writeHook) + throw MemoryAllocationError(); + /* Add child hooks */ if (node) { - vlist_push(&node->in.hooks, (void *) &readHook); - vlist_push(&node->out.hooks, (void *) &writeHook); + vlist_push(&node->in.hooks, (void *) readHook); + vlist_push(&node->out.hooks, (void *) writeHook); } } + StatsHook & operator=(const StatsHook&) = delete; + StatsHook(const StatsHook&) = delete; + virtual void start() { assert(state == State::PREPARED); @@ -168,7 +175,7 @@ public: { // Only call readHook if it hasnt been added to the node's hook list if (!node) - return readHook.process(smp); + return readHook->process(smp); return Hook::Reason::OK; }