From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id E8FCA687D0 for ; Thu, 22 Jul 2021 11:38:55 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id DFBEFF508 for ; Thu, 22 Jul 2021 11:38:55 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 605F8F4FA for ; Thu, 22 Jul 2021 11:38:55 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 3308642561 for ; Thu, 22 Jul 2021 11:38:55 +0200 (CEST) To: Proxmox Backup Server development discussion , Dominik Csapak References: <20210722092630.2227801-1-d.csapak@proxmox.com> From: Dietmar Maurer Message-ID: <356c750e-9a94-5d7a-cb49-e08686b1f156@proxmox.com> Date: Thu, 22 Jul 2021 11:38:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: <20210722092630.2227801-1-d.csapak@proxmox.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-SPAM-LEVEL: Spam detection results: 0 AWL 0.833 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] applied: [PATCH proxmox-backup v4 1/2] tape: changer: correctly consume data in decode_element_status_page X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Jul 2021 09:38:56 -0000 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 > --- > 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)?; > - } > } > } >