@@ -20,7 +20,7 @@ use minicbor::CborLen;
2020use minicbor_lease:: LeasedWriter ;
2121use ringbuf:: { counted_ringbuf, ringbuf_entry} ;
2222use task_packrat_api:: { EreportReadError , VpdIdentity } ;
23- use userlib:: { kipc, sys_get_timer, RecvMessage , TaskId } ;
23+ use userlib:: { kipc, sys_get_timer, RecvMessage , TaskId , UnwrapLite } ;
2424use zerocopy:: IntoBytes ;
2525
2626pub ( crate ) struct EreportStore {
@@ -160,11 +160,12 @@ impl EreportStore {
160160 & mut data,
161161 ) ) ;
162162
163- fn check_err (
164- encoder : & minicbor:: Encoder < LeasedWriter < ' _ , idol_runtime:: W > > ,
165- err : minicbor:: encode:: Error < minicbor_lease:: WriteError > ,
163+ fn handle_encode_err (
164+ err : minicbor:: encode:: Error < minicbor_lease:: Error > ,
166165 ) -> RequestError < EreportReadError > {
167- match encoder. writer ( ) . check_err ( err) {
166+ // These should always be write errors; everything we write should
167+ // always encode successfully.
168+ match err. into_write ( ) . unwrap_lite ( ) {
168169 minicbor_lease:: Error :: WentAway => ClientError :: WentAway . fail ( ) ,
169170 minicbor_lease:: Error :: EndOfLease => {
170171 ClientError :: BadLease . fail ( )
@@ -176,20 +177,7 @@ impl EreportStore {
176177 //
177178 // MGS expects us to always include this, and to just have it be
178179 // empty if we didn't send any metadata.
179- encoder
180- . begin_map ( )
181- // This pattern (which will occur every time we handle an encoder
182- // error in this function) is goofy, but is necessary to placate the
183- // borrow checker: the function passed to `map_err` must borrow the
184- // encoder so that it can check whether the error indicates that we
185- // ran out of space in the lease, or if the client disappeared.
186- // However, because `minicbor::Encoder`'s methods return a mutable
187- // borrow of the encoder, we must drop it first before borrowing it
188- // into the `map_err` closure. Thus, every `map_err` must be
189- // preceded by a `map` with a toilet closure that drops the mutable
190- // borrow. Yuck.
191- . map ( |_| ( ) )
192- . map_err ( |e| check_err ( & encoder, e) ) ?;
180+ encoder. begin_map ( ) . map_err ( handle_encode_err) ?;
193181
194182 // If the requested restart ID matches the current restart ID, then read
195183 // from the requested ENA. If not, start at ENA 0.
@@ -218,8 +206,7 @@ impl EreportStore {
218206 if let Some ( vpd) = vpd {
219207 // Encode the metadata map.
220208 self . encode_metadata ( & mut encoder, vpd)
221- . map ( |_| ( ) )
222- . map_err ( |e| check_err ( & encoder, e) ) ?;
209+ . map_err ( handle_encode_err) ?;
223210 ringbuf_entry ! ( Trace :: MetadataEncoded {
224211 len: encoder
225212 . writer( )
@@ -233,10 +220,7 @@ impl EreportStore {
233220 } ;
234221
235222 // End metadata map.
236- encoder
237- . end ( )
238- . map ( |_| ( ) )
239- . map_err ( |e| check_err ( & encoder, e) ) ?;
223+ encoder. end ( ) . map_err ( handle_encode_err) ?;
240224
241225 let mut reports = 0 ;
242226 // Beginning with the first
@@ -290,24 +274,15 @@ impl EreportStore {
290274 if first_written_ena. is_none ( ) {
291275 first_written_ena = Some ( r. ena ) ;
292276 // Start the ereport array
293- encoder
294- . begin_array ( )
295- . map ( |_| ( ) )
296- . map_err ( |e| check_err ( & encoder, e) ) ?;
277+ encoder. begin_array ( ) . map_err ( handle_encode_err) ?;
297278 }
298- encoder
299- . encode ( & entry)
300- . map ( |_| ( ) )
301- . map_err ( |e| check_err ( & encoder, e) ) ?;
279+ encoder. encode ( & entry) . map_err ( handle_encode_err) ?;
302280 reports += 1 ;
303281 }
304282
305283 if let Some ( start_ena) = first_written_ena {
306284 // End CBOR array, if we wrote anything.
307- encoder
308- . end ( )
309- . map ( |_| ( ) )
310- . map_err ( |e| check_err ( & encoder, e) ) ?;
285+ encoder. end ( ) . map_err ( handle_encode_err) ?;
311286
312287 ringbuf_entry ! ( Trace :: Reported {
313288 start_ena,
@@ -335,7 +310,7 @@ impl EreportStore {
335310 & self ,
336311 encoder : & mut minicbor:: Encoder < LeasedWriter < ' _ , idol_runtime:: W > > ,
337312 vpd : & VpdIdentity ,
338- ) -> Result < ( ) , minicbor:: encode:: Error < minicbor_lease:: WriteError > > {
313+ ) -> Result < ( ) , minicbor:: encode:: Error < minicbor_lease:: Error > > {
339314 encoder
340315 . str ( "hubris_archive_id" ) ?
341316 . bytes ( & self . image_id [ ..] ) ?;
0 commit comments