From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kAM7T-0007n7-OV for mharc-grub-devel@gnu.org; Mon, 24 Aug 2020 19:43:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39272) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kAM7S-0007my-ED for grub-devel@gnu.org; Mon, 24 Aug 2020 19:43:18 -0400 Received: from mail-qk1-x735.google.com ([2607:f8b0:4864:20::735]:34524) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kAM7Q-0002YM-I5 for grub-devel@gnu.org; Mon, 24 Aug 2020 19:43:18 -0400 Received: by mail-qk1-x735.google.com with SMTP id x69so9384848qkb.1 for ; Mon, 24 Aug 2020 16:43:16 -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=sAoweglRpCzUFYkDO+4ciKeEDKIzIOXzn4gAvGj41Nk=; b=TdZXVlkMz4+4ogRMvBcb/Wcm3SmRzO+TdQaUIBDrAYv1uyayMV0vehz+AIquxW6RKT FA6Ks1i8E2/p4yxMNbtfCWwf2kfg5DbyEHQMNRhwbI/BOfehMBHQBwcsIbU0XY82iM+S bcsjF8HKogTMQqm7n5ejyQtvHRZwM5YRf9z1Gj02uOZK8nWv/lnEzBOVNah7g+vPuHV1 2YN2LR1MUHlbQo6Q6SxG4husOJ2Ry09vvWskNWfP5kFA3WddJICJW3vdl3r9E/Ev6jjw hLeHEiODBuT4NJ3eSQrH2OrUX5D+o/vjx8Y5+S+EUII4KC3g1curmIPfw9uut2HnDJQG g8Rw== 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=sAoweglRpCzUFYkDO+4ciKeEDKIzIOXzn4gAvGj41Nk=; b=BxMz3I5ERq8uaR8FPzUjK4K2vb+iQKtiK1QoHI1w8hNpciWpUExCMkR8LGosi9W87l JadCEOvKfl+Ex7XJjCa2t1vRv+mtwIoH8i/rGI07zxZ0JHxEt8dneJ6kc2mZaR9mv3Y6 WL8u9nPGfhM0hP+b3yO4nhGXLPHVqLwbJI3My6bN29QD+8uKR2CW8J3wsBFsaa/ClGn7 3cSEkuIJWD5fz61lxr7aaqo8Qeeo4tC1FwIfqeLEi1DgL9x0Oe5PRGTaBzAxdmvSdjYl p4Wy0aD7GWtOvoW+PZbFi1gXAi56sYDmxb7/rbZHw8uWzhxINdtSS0InTjkNVtHenB0e xSTg== X-Gm-Message-State: AOAM5308trhh2O6qNKssm2wFDT6lF+TG7XiDBoZUI+k9Ygw/x8l/Gt/R Hjm273K7DObVhMlGjAiGGLGRLg== X-Google-Smtp-Source: ABdhPJy2ZkZui2xt5RVCKtckumhGAd9pBIEs50wpwrg0FyQo/yzTKYVvEwC5MZZvOp8h3lQNhurBiQ== X-Received: by 2002:a37:4c84:: with SMTP id z126mr7109514qka.130.1598312595280; Mon, 24 Aug 2020 16:43:15 -0700 (PDT) Received: from localhost.localdomain ([2605:a601:aaec:9b00:5122:8a61:cec2:28f4]) by smtp.gmail.com with ESMTPSA id x12sm13410581qta.67.2020.08.24.16.43.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2020 16:43:14 -0700 (PDT) From: Glenn Washburn To: Patrick Steinhardt Cc: Daniel Kiper , grub-devel@gnu.org, Glenn Washburn Subject: [CRYPTO-LUKS v2 03/19] cryptodisk: Incorrect calculation of sector in grub_cryptodisk_read/write. Date: Mon, 24 Aug 2020 18:42:30 -0500 Message-Id: <20200824234230.1738014-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::735; envelope-from=development@efficientek.com; helo=mail-qk1-x735.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: Mon, 24 Aug 2020 23:43:18 -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. Create function grub_disk_from_native_sector to do the native disk sector to grub sector size conversion. Signed-off-by: Glenn Washburn --- grub-core/disk/cryptodisk.c | 12 +++++------- include/grub/disk.h | 7 +++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index b87925ad3..b3610a1b6 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -761,10 +761,10 @@ grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector, PRIxGRUB_UINT64_T " with offset of %" PRIuGRUB_UINT64_T "\n", size, sector, dev->offset); + sector = 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), + 0, size << disk->log_sector_size, buf); if (err) { grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err); @@ -821,12 +821,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