From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kAOsB-00071G-Sd for mharc-grub-devel@gnu.org; Mon, 24 Aug 2020 22:39:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49232) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kAOsA-000718-G9 for grub-devel@gnu.org; Mon, 24 Aug 2020 22:39:42 -0400 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]:55398) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kAOs8-0006gS-Ck for grub-devel@gnu.org; Mon, 24 Aug 2020 22:39:42 -0400 Received: by mail-pj1-x1031.google.com with SMTP id 2so443010pjx.5 for ; Mon, 24 Aug 2020 19:39:39 -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=h0E3nQk1D7p+ntgcjhfFEMdC4Lh1Z1ANfRPGOVc1dZw=; b=1QuQ0YOPSeZom+/7WtiKWU7B/GNuvOu4nCrLmuIvPloV6BvW8z0dIkJ1+FbEmWH2L1 BXQEwuG2BnZHjH459hf/YD05LZ4LeYvV42WrCv2sXomnub6OzrLNiasH6F9a8HHbGDjc 0hn/2fitzxnV/TN4smdfZppWMpeaYfjC3psQQrINMjh/xvbyq72LRZyU3CUHvSMY3l9E giqLHbs4dYusWvMVGP/kfGC9fXDOx1ZXmQv6dqCVyTaLicrfIOpN8qF4Q1RhgYtUI4A6 ETzlp2C9J0NhJqrK2eh8Cra2empETMsq1eign0ruMt/GWBzK7gXZb5ljEz5WPZ9SYI3f wCGw== 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=h0E3nQk1D7p+ntgcjhfFEMdC4Lh1Z1ANfRPGOVc1dZw=; b=sR0efNMqN9Tg0RqpoNXWj/aqH94AUOcJ9OETTUUTKcm+RQ8a+Jy8kbRZj5fOVIp/lc 7chtGx0mM6olzyBH69tuvjEYgSmMF0bMU6nDFt0VmxxQ8MclKFwyRZopFomYU4LfaImY vJlh59G2GzMnp9Ye0dkwI4PmfPydW7H65PZIrWfwY7Q8T0S1VnEaF+slLnquzu8TTLiS RG22+nBI7mhuJKj5lyvJEKKypuViQOVeIPH3SThkQIcO3rm8kmvUzpVUCK3oqqctwVpk 2mz3PlIJtgPNuMmC5XDP92D1I1e0md8fmpylGKgYh5gd0I8ba5BVZTKMw6T3KkssI6// AtjQ== X-Gm-Message-State: AOAM530EqS/eczbsie4OKZkNSfIGZt8dh7sfs70YVPf3epWK2+iRGlDE Cn92yhmOAGIxO1E/CS/PLoFK7w== X-Google-Smtp-Source: ABdhPJyjJ8H1NpFeDlQn+xGsL91Qt74U+70PMsCon0l2ulukXYjBe8DWkJAd1GivnhE2Yf4PxinqOA== X-Received: by 2002:a17:90a:9503:: with SMTP id t3mr1816076pjo.171.1598323178682; Mon, 24 Aug 2020 19:39:38 -0700 (PDT) Received: from localhost.localdomain ([2605:a601:aaec:9b00:5122:8a61:cec2:28f4]) by smtp.gmail.com with ESMTPSA id y189sm628076pfb.135.2020.08.24.19.39.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2020 19:39:37 -0700 (PDT) From: Glenn Washburn To: Patrick Steinhardt Cc: Daniel Kiper , grub-devel@gnu.org, Glenn Washburn Subject: [CRYPTO-LUKS v3 03/19] cryptodisk: Incorrect calculation of start sector for grub_disk_read in grub_cryptodisk_read. Date: Mon, 24 Aug 2020 21:39:18 -0500 Message-Id: <20200825023918.1856369-1-development@efficientek.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200824051051.GA953@tanuki.pks.im> References: <20200824051051.GA953@tanuki.pks.im> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2607:f8b0:4864:20::1031; envelope-from=development@efficientek.com; helo=mail-pj1-x1031.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: Tue, 25 Aug 2020 02:39:42 -0000 Here dev is a grub_cryptodisk_t and dev->offset is offset in sectors of size native to the cryptodisk device. The sector is correctly transformed into native grub sector size, but then added to dev->offset which is not transformed. It would be nice if the type system would help us with this. 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