From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kB56C-0002Xs-17 for mharc-grub-devel@gnu.org; Wed, 26 Aug 2020 19:45:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kB56A-0002Xk-Qs for grub-devel@gnu.org; Wed, 26 Aug 2020 19:44:58 -0400 Received: from mail-qv1-xf43.google.com ([2607:f8b0:4864:20::f43]:43404) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kB568-0002WP-Gg for grub-devel@gnu.org; Wed, 26 Aug 2020 19:44:58 -0400 Received: by mail-qv1-xf43.google.com with SMTP id l13so1841515qvt.10 for ; Wed, 26 Aug 2020 16:44:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficientek-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8YrJ77hD0LLYQd7PCG6bMZk4auCA1jLzdX+ctngX638=; b=zYwdb1Zri23bok38TBpxLMCSqbe2b+QhXduluBy38/MsvvH02wsr5P1aBzfczFV2mO lx1HsOKsV2sRlt3BiG41wA/kMqScXWUHl8hG9mLe//q3umz9/HK/+o8lByal0guZyh4f oV6EkIc+qizBPDmNhopiADU4OUgTvnTsvvKPuLqw5ZqiHUUqj5AVZ6DBpwgUIMT9NI4w /HCuUV+prcrRPDeIZBmoKwQSDIXSiLtwOKZjpFe/w1W9q/4n27KU0Tyn2hNs8Pp5oQF4 8YBjaIzXE3g0L7wqdXStKZO/5ceYOf7bruVxEMqI4a0vadF34e3RSzn4x1V48WhQZBkL /QZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8YrJ77hD0LLYQd7PCG6bMZk4auCA1jLzdX+ctngX638=; b=P1K5+P6XFEJPRqF2krBN0bKSgkpSd9x2VoSxXdy62UwjMFSRUdJPtnOTDG8mmfi284 wYTy3d31hYLqA0D22nbQOaGy1fe+cleE4jYDoclUOIVr0YvZYb8dinQQNjmR6zLWBLI4 RFATG8KYHZwnQ2MjlHZhISWIWQB6Ezsv0sZ5gLNmqcS/gyjGWyebzgWIZhuU+5adl1LP bQgHn2lRYx0ymi6UCBnhFBOg2fITbACVYprlDtZY4/I/rq+pb3Zlt04ZOhc7/WNyRIY1 8zC3P+0LCnTpOALQEdV6ZlWiA6CRETJPzTSHPkm9PHCSIAIuN3jsFqLxpWgSU1vcNgq5 ngsg== X-Gm-Message-State: AOAM530UFsHUnwm8GQoi+343Jc3rYEp0t8XWlwpWsxB60nydQ2q4nJdM RPpYq/RgQhMkGQDnSu+g00TMI2eN2mpcGw== X-Google-Smtp-Source: ABdhPJwSaq+XMphnNTaABG8FF8MQypJHkozP0rFT3CP5GzMOkoe8/uTDv/KlgGA2uip6ufVl8OR1YA== X-Received: by 2002:ad4:5812:: with SMTP id dd18mr16583004qvb.23.1598485495206; Wed, 26 Aug 2020 16:44:55 -0700 (PDT) Received: from localhost.localdomain ([2605:a601:aaec:9b00:fc1f:b488:83ac:101a]) by smtp.gmail.com with ESMTPSA id b84sm510061qkc.99.2020.08.26.16.44.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Aug 2020 16:44:54 -0700 (PDT) From: Glenn Washburn To: Patrick Steinhardt Cc: grub-devel@gnu.org, Glenn Washburn Subject: [PATCH] cryptodisk: Incorrect calculation of sector in grub_cryptodisk_read/write. Date: Wed, 26 Aug 2020 18:44:35 -0500 Message-Id: <20200826234435.2079207-1-development@efficientek.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2607:f8b0:4864:20::f43; envelope-from=development@efficientek.com; helo=mail-qv1-xf43.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Aug 2020 23:44:59 -0000 Here dev is a grub_cryptodisk_t and dev->offset is offset in sectors of size native to the cryptodisk device. The function grub_disk_read expects that the given start sector is in the native grub sector size, so dev->offset must be converted as well. Create function grub_disk_from_native_sector to convert disk sectors to grub sectors. Signed-off-by: Glenn Washburn --- grub-core/disk/cryptodisk.c | 11 ++++------- include/grub/disk.h | 7 +++++++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index b87925ad3..38bd49835 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -762,9 +762,8 @@ grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector, size, sector, dev->offset); err = grub_disk_read (dev->source_disk, - (sector << (disk->log_sector_size - - GRUB_DISK_SECTOR_BITS)) + dev->offset, 0, - size << disk->log_sector_size, buf); + grub_disk_from_native_sector (disk, sector + dev->offset), + 0, size << disk->log_sector_size, buf); if (err) { grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err); @@ -821,12 +820,10 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector, } /* Since ->write was called so disk.mod is loaded but be paranoid */ - + sector = sector + dev->offset; if (grub_disk_write_weak) err = grub_disk_write_weak (dev->source_disk, - (sector << (disk->log_sector_size - - GRUB_DISK_SECTOR_BITS)) - + dev->offset, + grub_disk_from_native_sector (disk, sector), 0, size << disk->log_sector_size, tmp); else err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded"); diff --git a/include/grub/disk.h b/include/grub/disk.h index 316659fee..af9f886d3 100644 --- a/include/grub/disk.h +++ b/include/grub/disk.h @@ -174,6 +174,13 @@ typedef struct grub_disk_memberlist *grub_disk_memberlist_t; /* Return value of grub_disk_get_size() in case disk size is unknown. */ #define GRUB_DISK_SIZE_UNKNOWN 0xffffffffffffffffULL +/* Convert to grub native disk sized sector from disk sized sector */ +static inline grub_disk_addr_t +grub_disk_from_native_sector (grub_disk_t disk, grub_disk_addr_t sector) +{ + return sector << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS); +} + /* This is called from the memory manager. */ void grub_disk_cache_invalidate_all (void); -- 2.27.0