You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2015/11/10 05:07:02 UTC

trafficserver git commit: CID 1328817: Resource leaks (CTOR_DTOR_LEAK) in multiplexer plugin

Repository: trafficserver
Updated Branches:
  refs/heads/master df48fade2 -> 0f8236763


CID 1328817: Resource leaks (CTOR_DTOR_LEAK) in multiplexer plugin

This closes #316


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/0f823676
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/0f823676
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/0f823676

Branch: refs/heads/master
Commit: 0f823676361d2095f4e24b9fc97ef3dde4aadc85
Parents: df48fad
Author: Daniel Vitor Morilha <dm...@gmail.com>
Authored: Mon Nov 9 20:03:07 2015 -0800
Committer: Bryan Call <bc...@apache.org>
Committed: Mon Nov 9 20:03:07 2015 -0800

----------------------------------------------------------------------
 plugins/experimental/multiplexer/dispatch.cc | 33 +++++++++++++++++------
 plugins/experimental/multiplexer/dispatch.h  |  5 +++-
 2 files changed, 29 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0f823676/plugins/experimental/multiplexer/dispatch.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/multiplexer/dispatch.cc b/plugins/experimental/multiplexer/dispatch.cc
index fe44b0b..585b2cf 100644
--- a/plugins/experimental/multiplexer/dispatch.cc
+++ b/plugins/experimental/multiplexer/dispatch.cc
@@ -36,19 +36,37 @@ extern Statistics statistics;
 extern size_t timeout;
 
 Request::Request(const std::string &h, const TSMBuffer b, const TSMLoc l)
-  : host(h), length(TSHttpHdrLengthGet(b, l)),
-    // coverity[ctor_dtor_leak]
-    io(new ats::io::IO())
+  : host(h), length(TSHttpHdrLengthGet(b, l)), io(new ats::io::IO())
 {
   assert(!host.empty());
   assert(b != NULL);
   assert(l != NULL);
-  assert(io != NULL);
   assert(length > 0);
+  assert(io.get() != NULL);
   TSHttpHdrPrint(b, l, io->buffer);
   assert(length == TSIOBufferReaderAvail(io->reader));
 }
 
+Request::Request(const Request &r) : host(r.host), length(r.length), io(const_cast<Request &>(r).io)
+{
+  assert(!host.empty());
+  assert(length > 0);
+  assert(io.get() != NULL);
+  assert(r.io.get() != NULL);
+}
+
+Request &Request::operator=(Request &r)
+{
+  host = r.host;
+  length = r.length;
+  io = r.io;
+  assert(!host.empty());
+  assert(length > 0);
+  assert(io.get() != NULL);
+  assert(r.io.get() == NULL);
+  return *this;
+}
+
 uint64_t
 copy(const TSIOBufferReader &r, const TSIOBuffer b)
 {
@@ -218,7 +236,7 @@ addBody(Requests &r, const TSIOBufferReader re)
   }
   assert(length > 0);
   for (; iterator != end; ++iterator) {
-    assert(iterator->io != NULL);
+    assert(iterator->io.get() != NULL);
     const int64_t size = copy(re, iterator->io->buffer);
     assert(size == length);
     iterator->length += size;
@@ -231,7 +249,7 @@ dispatch(Requests &r, const int t)
   Requests::iterator iterator = r.begin();
   const Requests::iterator end = r.end();
   for (; iterator != end; ++iterator) {
-    assert(iterator->io != NULL);
+    assert(iterator->io.get() != NULL);
     if (TSIsDebugTagSet(PLUGIN_TAG) > 0) {
       TSDebug(PLUGIN_TAG, "Dispatching %i bytes to \"%s\"", iterator->length, iterator->host.c_str());
       std::string b;
@@ -239,8 +257,7 @@ dispatch(Requests &r, const int t)
       assert(b.size() == static_cast<uint64_t>(iterator->length));
       TSDebug(PLUGIN_TAG, "%s", b.c_str());
     }
-    ats::get(iterator->io, iterator->length, Handler(iterator->host), t);
     // forwarding iterator->io pointer ownership
-    iterator->io = NULL;
+    ats::get(iterator->io.release(), iterator->length, Handler(iterator->host), t);
   }
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0f823676/plugins/experimental/multiplexer/dispatch.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/multiplexer/dispatch.h b/plugins/experimental/multiplexer/dispatch.h
index e152742..61c79a8 100644
--- a/plugins/experimental/multiplexer/dispatch.h
+++ b/plugins/experimental/multiplexer/dispatch.h
@@ -24,6 +24,7 @@
 #define DISPATCH_H
 
 #include <assert.h>
+#include <memory>
 #include <string>
 #include <ts/ts.h>
 #include <vector>
@@ -50,9 +51,11 @@ typedef std::vector<std::string> Origins;
 struct Request {
   std::string host;
   int length;
-  ats::io::IO *io;
+  std::auto_ptr<ats::io::IO> io;
 
   Request(const std::string &, const TSMBuffer, const TSMLoc);
+  Request(const Request &);
+  Request &operator=(Request &);
 };
 
 typedef std::vector<Request> Requests;