From 14263044aac31fb9b570850708a3c29a4f44f95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 22 Feb 2019 18:31:09 +0100 Subject: [PATCH] exfat: avoid overflow in Volume::ClusterToBlock(). --- src/add-ons/kernel/file_systems/exfat/Volume.cpp | 7 ++++--- src/add-ons/kernel/file_systems/exfat/exfat.h | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/exfat/Volume.cpp b/src/add-ons/kernel/file_systems/exfat/Volume.cpp index 44f6d2e189..aa9dbbe5e3 100644 --- a/src/add-ons/kernel/file_systems/exfat/Volume.cpp +++ b/src/add-ons/kernel/file_systems/exfat/Volume.cpp @@ -1,6 +1,6 @@ /* * Copyright 2008-2010, Axel Dörfler, axeld@pinc-software.de. - * Copyright 2011, Jérôme Duval, korli@users.berlios.de. + * Copyright 2011-2019, Jérôme Duval, jerome.duval@gmail.com. * Copyright 2014 Haiku, Inc. All rights reserved. * * Distributed under the terms of the MIT License. @@ -416,9 +416,10 @@ Volume::LoadSuperBlock() status_t Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block) { - if (cluster < 2) + if (cluster < EXFAT_FIRST_DATA_CLUSTER) return B_BAD_VALUE; - block = ((cluster - 2) << SuperBlock().BlocksPerClusterShift()) + block = ((fsblock_t)(cluster - EXFAT_FIRST_DATA_CLUSTER) + << SuperBlock().BlocksPerClusterShift()) + SuperBlock().FirstDataBlock(); TRACE("Volume::ClusterToBlock() cluster %" B_PRIu32 " %u %" B_PRIu32 ": %" B_PRIu64 ", %" B_PRIu32 "\n", cluster, diff --git a/src/add-ons/kernel/file_systems/exfat/exfat.h b/src/add-ons/kernel/file_systems/exfat/exfat.h index b08a715018..6c5ea1a13f 100644 --- a/src/add-ons/kernel/file_systems/exfat/exfat.h +++ b/src/add-ons/kernel/file_systems/exfat/exfat.h @@ -1,5 +1,5 @@ /* - * Copyright 2011, Jérôme Duval, korli@users.berlios.de. + * Copyright 2011-2019, Jérôme Duval, jerome.duval@gmail.com. * Copyright 2014 Haiku, Inc. All Rights reserved. * * Distributed under the terms of the MIT License. @@ -26,6 +26,7 @@ typedef uint32 cluster_t; #define EXFAT_SUPER_BLOCK_OFFSET 0x0 +#define EXFAT_FIRST_DATA_CLUSTER 2 struct exfat_super_block {