@@ -82,7 +82,7 @@ pub fn free(ptr: *mut u8, size: usize) {
8282 Vec :: from_raw_parts ( ptr, size, size)
8383 } ;
8484 let buf = ManuallyDrop :: new ( buf) ;
85- mem :: drop ( ManuallyDrop :: into_inner ( buf) ) ;
85+ ManuallyDrop :: into_inner ( buf) ;
8686}
8787
8888/// Manually drop the memory occupied by a transport buffer at the given location.
@@ -116,15 +116,15 @@ pub fn free_transport_buffer(ptr: *mut u8) -> Result<()> {
116116
117117 let type_id: i8 = type_rdr. read_i8 ( ) ?;
118118 if type_id == NIL_TYPE_ID {
119- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr) ) ;
119+ ManuallyDrop :: into_inner ( type_rdr) ;
120120 return Ok ( ( ) )
121121 }
122122 if type_id == EOS_TYPE_ID {
123- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr) ) ;
123+ ManuallyDrop :: into_inner ( type_rdr) ;
124124 return Ok ( ( ) )
125125 }
126126 if type_id < 0 {
127- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr) ) ;
127+ ManuallyDrop :: into_inner ( type_rdr) ;
128128 return Ok ( ( ) )
129129 }
130130
@@ -137,7 +137,7 @@ pub fn free_transport_buffer(ptr: *mut u8) -> Result<()> {
137137
138138 let len: usize = len_rdr. read_u32 :: < LittleEndian > ( ) ?. try_into ( ) ?;
139139
140- free ( ptr, len) ;
140+ free ( ptr, mem :: size_of :: < i8 > ( ) +mem :: size_of :: < u32 > ( ) + len) ;
141141
142142 Ok ( ( ) )
143143}
@@ -162,51 +162,49 @@ pub fn free_transport_buffer(ptr: *mut u8) -> Result<()> {
162162///
163163/// This function will return an [Error](error/enum.Error.html) if the data at the given location is not in the expected
164164/// format.
165- pub fn try_from_mem < TOutput : for < ' a > Deserialize < ' a > > ( ptr : * mut u8 ) -> Result < StreamOption < TOutput > > {
165+ pub fn try_from_mem < TOutput : for < ' a > Deserialize < ' a > + Clone > ( ptr : * mut u8 ) -> Result < StreamOption < TOutput > > {
166166 let type_vec: Vec < u8 > = unsafe {
167167 Vec :: from_raw_parts ( ptr, mem:: size_of :: < i8 > ( ) , mem:: size_of :: < i8 > ( ) )
168168 } ;
169169
170- let type_rdr = Cursor :: new ( type_vec) ;
171- let mut type_rdr = ManuallyDrop :: new ( type_rdr ) ;
170+ let mut type_rdr = Cursor :: new ( type_vec. clone ( ) ) ;
171+ let _ = ManuallyDrop :: new ( type_vec ) ;
172172
173173 let type_id: i8 = type_rdr. read_i8 ( ) ?;
174174 if type_id == NIL_TYPE_ID {
175- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr ) ) ;
175+ free_transport_buffer ( ptr ) ? ;
176176 return Ok ( StreamOption :: None )
177177 }
178178 if type_id == EOS_TYPE_ID {
179- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr ) ) ;
179+ free_transport_buffer ( ptr ) ? ;
180180 return Ok ( StreamOption :: EndOfStream )
181181 }
182182 if type_id < 0 {
183- mem :: drop ( ManuallyDrop :: into_inner ( type_rdr ) ) ;
183+ free_transport_buffer ( ptr ) ? ;
184184 return Result :: from ( error:: LensError :: InputErrorUnsupportedError )
185185 }
186186
187187 let len_vec: Vec < u8 > = unsafe {
188188 Vec :: from_raw_parts ( ptr. add ( mem:: size_of :: < i8 > ( ) ) , mem:: size_of :: < u32 > ( ) , mem:: size_of :: < u32 > ( ) )
189189 } ;
190190
191- let len_rdr = Cursor :: new ( len_vec) ;
192- let mut len_rdr = ManuallyDrop :: new ( len_rdr ) ;
191+ let mut len_rdr = Cursor :: new ( len_vec. clone ( ) ) ;
192+ let _ = ManuallyDrop :: new ( len_vec ) ;
193193
194194 let len: usize = len_rdr. read_u32 :: < LittleEndian > ( ) ?. try_into ( ) ?;
195195
196196 let input_vec: Vec < u8 > = unsafe {
197197 Vec :: from_raw_parts ( ptr. add ( mem:: size_of :: < i8 > ( ) +mem:: size_of :: < u32 > ( ) ) , len, len)
198198 } ;
199- let input_vec = ManuallyDrop :: new ( input_vec) ;
200-
201- let json_string = String :: from_utf8 ( input_vec. to_vec ( ) ) ?. clone ( ) ;
202199
203200 // It is possible for null json values to reach this line, particularly if sourced directly
204201 // from a 3rd party module, so we ensure that we parse to option as well as the earlier type_id
205202 // checks.
206- let result = match serde_json:: from_str :: < Option < TOutput > > ( & json_string ) ? {
207- Some ( v) => StreamOption :: Some ( v) ,
203+ let result = match serde_json:: from_slice :: < Option < TOutput > > ( & input_vec . clone ( ) ) ? {
204+ Some ( v) => StreamOption :: Some ( v. clone ( ) ) ,
208205 None => StreamOption :: None ,
209206 } ;
207+ let _ = ManuallyDrop :: new ( input_vec) ;
210208
211209 Ok ( result)
212210}
@@ -236,7 +234,8 @@ pub fn try_to_mem(type_id: i8, message: &[u8]) -> Result<*mut u8> {
236234 }
237235 } ;
238236
239- let result = wtr. into_inner ( ) . clone ( ) . as_mut_ptr ( ) ;
237+ let mut buffer = wtr. into_inner ( ) . clone ( ) ;
238+ let result = buffer. as_mut_ptr ( ) ;
240239 Ok ( result)
241240}
242241
0 commit comments