Make XzEtentWriter::Init() idempotent

xz_dec_init allocates memory, so avoid memory leak in calling Init()
    multiple times

Test: th
Change-Id: I2dc20f6f9127b6d7749369385f982a08c78e6e44
diff --git a/payload_consumer/xz_extent_writer.cc b/payload_consumer/xz_extent_writer.cc
index a648351..361e635 100644
--- a/payload_consumer/xz_extent_writer.cc
+++ b/payload_consumer/xz_extent_writer.cc
@@ -53,13 +53,13 @@
 }  // namespace
 
 XzExtentWriter::~XzExtentWriter() {
-  xz_dec_end(stream_);
+  stream_.reset();
   TEST_AND_RETURN(input_buffer_.empty());
 }
 
 bool XzExtentWriter::Init(const RepeatedPtrField<Extent>& extents,
                           uint32_t block_size) {
-  stream_ = xz_dec_init(XZ_DYNALLOC, kXzMaxDictSize);
+  stream_.reset(xz_dec_init(XZ_DYNALLOC, kXzMaxDictSize));
   TEST_AND_RETURN_FALSE(stream_ != nullptr);
   return underlying_writer_->Init(extents, block_size);
 }
@@ -86,7 +86,7 @@
   for (;;) {
     request.out_pos = 0;
 
-    xz_ret ret = xz_dec_run(stream_, &request);
+    xz_ret ret = xz_dec_run(stream_.get(), &request);
     if (ret != XZ_OK && ret != XZ_STREAM_END) {
       LOG(ERROR) << "xz_dec_run returned " << XzErrorString(ret);
       return false;
diff --git a/payload_consumer/xz_extent_writer.h b/payload_consumer/xz_extent_writer.h
index 70338f2..caf34ec 100644
--- a/payload_consumer/xz_extent_writer.h
+++ b/payload_consumer/xz_extent_writer.h
@@ -34,6 +34,10 @@
 namespace chromeos_update_engine {
 
 class XzExtentWriter : public ExtentWriter {
+  struct xz_deleter {
+    constexpr void operator()(xz_dec* p) { xz_dec_end(p); }
+  };
+
  public:
   explicit XzExtentWriter(std::unique_ptr<ExtentWriter> underlying_writer)
       : underlying_writer_(std::move(underlying_writer)) {}
@@ -47,7 +51,7 @@
   // The underlying ExtentWriter.
   std::unique_ptr<ExtentWriter> underlying_writer_;
   // The opaque xz decompressor struct.
-  xz_dec* stream_{nullptr};
+  std::unique_ptr<xz_dec, xz_deleter> stream_{nullptr};
   brillo::Blob input_buffer_;
 
   DISALLOW_COPY_AND_ASSIGN(XzExtentWriter);