From 8b859dddb9e583b1bb0f393066a3b81217028732 Mon Sep 17 00:00:00 2001 From: Dennis Schwerdel Date: Thu, 23 Mar 2017 15:58:49 +0100 Subject: [PATCH] Fixed memory leak --- src/util/compression.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/util/compression.rs b/src/util/compression.rs index 04adcff..1d9c780 100644 --- a/src/util/compression.rs +++ b/src/util/compression.rs @@ -3,6 +3,7 @@ use std::ffi::{CStr, CString}; use std::io::{self, Write}; use std::str::FromStr; +use libc; use squash::*; @@ -203,7 +204,7 @@ impl Compression { if stream.is_null() { return Err(CompressionError::InitializeStream); } - Ok(CompressionStream::new(unsafe { Box::from_raw(stream) })) + Ok(CompressionStream::new(stream)) } #[inline] @@ -215,19 +216,19 @@ impl Compression { if stream.is_null() { return Err(CompressionError::InitializeStream); } - Ok(CompressionStream::new(unsafe { Box::from_raw(stream) })) + Ok(CompressionStream::new(stream)) } } pub struct CompressionStream { - stream: Box, + stream: *mut SquashStream, buffer: [u8; 16*1024] } impl CompressionStream { #[inline] - fn new(stream: Box) -> Self { + fn new(stream: *mut SquashStream) -> Self { CompressionStream { stream: stream, buffer: [0; 16*1024] @@ -235,7 +236,7 @@ impl CompressionStream { } pub fn process(&mut self, input: &[u8], output: &mut W) -> Result<(), CompressionError> { - let mut stream = &mut *self.stream; + let stream = unsafe { &mut (*self.stream) }; stream.next_in = input.as_ptr(); stream.avail_in = input.len(); loop { @@ -255,7 +256,7 @@ impl CompressionStream { } pub fn finish(mut self, output: &mut W) -> Result<(), CompressionError> { - let mut stream = &mut *self.stream; + let stream = unsafe { &mut (*self.stream) }; loop { stream.next_out = self.buffer.as_mut_ptr(); stream.avail_out = self.buffer.len(); @@ -272,3 +273,9 @@ impl CompressionStream { Ok(()) } } + +impl Drop for CompressionStream { + fn drop(&mut self) { + unsafe { squash_object_unref(self.stream as *mut libc::c_void); } + } +}