From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id D9EEF1FF13F for ; Thu, 07 May 2026 15:02:33 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id AD5B51BA00; Thu, 7 May 2026 15:02:33 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup v2 2/5] datastore: data blob: refactor decoding method Date: Thu, 7 May 2026 15:01:32 +0200 Message-ID: <20260507130135.589100-3-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260507130135.589100-1-c.ebner@proxmox.com> References: <20260507130135.589100-1-c.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1778158809898 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.070 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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 Message-ID-Hash: SOTGMRFCXEYNXRAU6YBHFL5D6VHKLSNP X-Message-ID-Hash: SOTGMRFCXEYNXRAU6YBHFL5D6VHKLSNP X-MailFrom: c.ebner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Improve code style and readability by using a single match statement instead of chained if statements and deduplicate the common digest verificaton, performed on the decoded blob data. Signed-off-by: Christian Ebner --- pbs-datastore/src/data_blob.rs | 86 +++++++++++++++++----------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/pbs-datastore/src/data_blob.rs b/pbs-datastore/src/data_blob.rs index 7761bbae7..3c05a6106 100644 --- a/pbs-datastore/src/data_blob.rs +++ b/pbs-datastore/src/data_blob.rs @@ -180,57 +180,57 @@ impl DataBlob { config: Option<&CryptConfig>, digest: Option<&[u8; 32]>, ) -> Result, Error> { - let magic = self.magic(); + let magic = *self.magic(); - if magic == &UNCOMPRESSED_BLOB_MAGIC_1_0 { - let data_start = std::mem::size_of::(); - let data = self.raw_data[data_start..].to_vec(); - if let Some(digest) = digest { - Self::verify_digest(&data, None, digest)?; + let (data, crypt_config) = match magic { + UNCOMPRESSED_BLOB_MAGIC_1_0 => { + let data_start = std::mem::size_of::(); + let data = self.raw_data[data_start..].to_vec(); + (data, None) } - Ok(data) - } else if magic == &COMPRESSED_BLOB_MAGIC_1_0 { - let data_start = std::mem::size_of::(); - let mut reader = &self.raw_data[data_start..]; - let data = zstd::stream::decode_all(&mut reader)?; - // zstd::block::decompress is about 10% slower - // let data = zstd::block::decompress(&self.raw_data[data_start..], MAX_BLOB_SIZE)?; - if let Some(digest) = digest { - Self::verify_digest(&data, None, digest)?; + COMPRESSED_BLOB_MAGIC_1_0 => { + let data_start = std::mem::size_of::(); + let mut reader = &self.raw_data[data_start..]; + let data = zstd::stream::decode_all(&mut reader)?; + // zstd::block::decompress is about 10% slower + // let data = zstd::block::decompress(&self.raw_data[data_start..], MAX_BLOB_SIZE)?; + (data, None) } - Ok(data) - } else if magic == &ENCR_COMPR_BLOB_MAGIC_1_0 || magic == &ENCRYPTED_BLOB_MAGIC_1_0 { - let header_len = std::mem::size_of::(); - let head = unsafe { - (&self.raw_data[..header_len]).read_le_value::()? - }; + ENCR_COMPR_BLOB_MAGIC_1_0 | ENCRYPTED_BLOB_MAGIC_1_0 => { + let header_len = std::mem::size_of::(); + let head = unsafe { + (&self.raw_data[..header_len]).read_le_value::()? + }; - if let Some(config) = config { - let data = if magic == &ENCR_COMPR_BLOB_MAGIC_1_0 { - Self::decode_compressed_chunk( - config, - &self.raw_data[header_len..], - &head.iv, - &head.tag, - )? + if let Some(config) = config { + let data = if magic == ENCR_COMPR_BLOB_MAGIC_1_0 { + Self::decode_compressed_chunk( + config, + &self.raw_data[header_len..], + &head.iv, + &head.tag, + )? + } else { + Self::decode_uncompressed_chunk( + config, + &self.raw_data[header_len..], + &head.iv, + &head.tag, + )? + }; + (data, Some(config)) } else { - Self::decode_uncompressed_chunk( - config, - &self.raw_data[header_len..], - &head.iv, - &head.tag, - )? - }; - if let Some(digest) = digest { - Self::verify_digest(&data, Some(config), digest)?; + bail!("unable to decrypt blob - missing CryptConfig"); } - Ok(data) - } else { - bail!("unable to decrypt blob - missing CryptConfig"); } - } else { - bail!("Invalid blob magic number."); + _ => bail!("Invalid blob magic number."), + }; + + if let Some(digest) = digest { + Self::verify_digest(&data, crypt_config, digest)?; } + + Ok(data) } /// Load data blob via given sync ``reader`` and verify its CRC -- 2.47.3