[pbs-devel] applied: [PATCH proxmox-backup v4 1/2] tape: changer: correctly consume data in decode_element_status_page

Dietmar Maurer dietmar at proxmox.com
Thu Jul 22 11:38:54 CEST 2021


applied both patches

On 7/22/21 11:26 AM, Dominik Csapak wrote:
> instead of 'blindly' trusting the changer to deliver the fields written
> in the specification, trust the length data it returns in the header.
>
> we slice the descriptor data into equal sized chunks of the correct
> size, then we do not have care bout the len and empty checks anymore
>
> this also makes the code to read the rest of the page obsolete,
> since the next descriptor is on the correct offset anyway
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
>   src/tape/changer/sg_pt_changer.rs | 31 ++-----------------------------
>   1 file changed, 2 insertions(+), 29 deletions(-)
>
> diff --git a/src/tape/changer/sg_pt_changer.rs b/src/tape/changer/sg_pt_changer.rs
> index a15d8192..098c10d8 100644
> --- a/src/tape/changer/sg_pt_changer.rs
> +++ b/src/tape/changer/sg_pt_changer.rs
> @@ -651,17 +651,9 @@ fn decode_element_status_page(
>               }
>   
>               let descr_data = reader.read_exact_allocated(len)?;
> -            let mut reader = &descr_data[..];
>   
> -            loop {
> -                if reader.is_empty() {
> -                    break;
> -                }
> -                if reader.len() < (subhead.descriptor_length as usize) {
> -                    break;
> -                }
> -
> -                let len_before = reader.len();
> +            for descriptor in descr_data.chunks_exact(subhead.descriptor_length as usize) {
> +                let mut reader = &descriptor[..];
>   
>                   match subhead.element_type_code {
>                       1 => {
> @@ -672,9 +664,6 @@ fn decode_element_status_page(
>   
>                           subhead.skip_alternate_volume_tag(&mut reader)?;
>   
> -                        let mut reserved = [0u8; 4];
> -                        reader.read_exact(&mut reserved)?;
> -
>                           result.last_element_address = Some(desc.element_address);
>   
>                           let status = TransportElementStatus {
> @@ -691,9 +680,6 @@ fn decode_element_status_page(
>   
>                           subhead.skip_alternate_volume_tag(&mut reader)?;
>   
> -                        let mut reserved = [0u8; 4];
> -                        reader.read_exact(&mut reserved)?;
> -
>                           result.last_element_address = Some(desc.element_address);
>   
>                           if subhead.element_type_code == 3 {
> @@ -763,19 +749,6 @@ fn decode_element_status_page(
>                       }
>                       code => bail!("got unknown element type code {}", code),
>                   }
> -
> -                // we have to consume the whole descriptor size, else
> -                // our position in the reader is not correct
> -                let len_after = reader.len();
> -                let have_read = len_before - len_after;
> -                let desc_len = subhead.descriptor_length as usize;
> -                if desc_len > have_read {
> -                    let mut left_to_read = desc_len - have_read;
> -                    if left_to_read > len_after {
> -                        left_to_read = len_after; // reader has not enough data?
> -                    }
> -                    let _ = reader.read_exact_allocated(left_to_read)?;
> -                }
>               }
>           }
>   





More information about the pbs-devel mailing list