Received: by 10.192.165.148 with SMTP id m20csp1713035imm; Thu, 3 May 2018 04:19:15 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoKUshjZhani+tkRQXX+BqyC+QBkayWrPdcV83YnhAxIrm5PYBwa36p1JRVZWzjhX8SbJC8 X-Received: by 10.167.131.134 with SMTP id u6mr5163805pfm.253.1525346355828; Thu, 03 May 2018 04:19:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525346355; cv=none; d=google.com; s=arc-20160816; b=HZRZSABy3SnE3RTVJfEZ6xRlydErbxni1iyNNU8acJxRRDq1gtLS5s4j7yK4JXbTf7 0ZP8itmfOWuXB0+hA+3eLxWTqb96U5JOAuduYQ4bIbV2zgSguNHXEaDvnj+4D1RDVgSZ SDEri/btEh+QR5GRKAMjzcbRrBJWzWrbYWWZaPpdFKFOAp0LTFKmqaIAibqeBGOh45EK 9YVwZ9quj5o5l3sWyUNuy1bMhlXHrzx/aX+RUeAzwDyouqD8W6b4lwIbvEB7QOZMu3+Y 38w64qXMGDk5vFZ/ikuIfxE3zevJPrU0rZrwUPs0c7TL/o7pRn499/chj13pKyrRMk+Z tr6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:mail-followup-to:message-id:subject:cc:to:from:date :dkim-signature:arc-authentication-results; bh=d/cLCMPf1qoYgQ/hxmrBn4Uvy4y9T+9HtwufPvX/3tM=; b=Vxjr8qw15feuQyxQNZkonAAEAosIoerk9DQkKqmbj0QwplQNF6ewUz3X92D8/D/oOQ gRNBH4VpvjB++ARDqMFi92pkHXY9OkSSvdbnhuFNddDdK2xERWGOfF8YaZ+3kyOX4ky2 tjq4lGa1PGUrIRf2zQs5CX6oHolYUNUBcYPInQY1FjtReyuyVmbgs+46w8jGtA2lZlx7 CbhlpYbLuoBivcQGD+K2nVdadraicRGeb3flgmi8k/EG74n6N7vnkXctgtEtJqOJsnbL VucBKfOTZuxlbUJ32yM/Qkc1ZZmRy5JMrsIwPhRFl7I0u5b62heuoJQriwdpVnVztfqu ccpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ujaeEuGc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f131si7979969pfc.316.2018.05.03.04.19.01; Thu, 03 May 2018 04:19:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ujaeEuGc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751493AbeECLRr (ORCPT + 99 others); Thu, 3 May 2018 07:17:47 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:32820 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751075AbeECLRn (ORCPT ); Thu, 3 May 2018 07:17:43 -0400 Received: by mail-pg0-f68.google.com with SMTP id i194-v6so12901793pgd.0; Thu, 03 May 2018 04:17:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mail-followup-to:mime-version :content-disposition:user-agent; bh=d/cLCMPf1qoYgQ/hxmrBn4Uvy4y9T+9HtwufPvX/3tM=; b=ujaeEuGcNhKYFSQEtj7nQ6F9vn1lzQZwqYMN9BxWnx7dWsDqQW/vxfzpiy1tS+3qE7 iecMPgut+Mm7UX+S5ZwAg9evrk7VqwdS6GxctWOmmYe6Z830hmwKuSLBkfpcCarMaBjz FXO0dvMLictHg2ZrdK2QILcTTBkEJEjLR0TmjFjKkFweaPKmgkx2EfKd2TzEUvPInEJ2 dkTOZZ1Re1XqOL4OcLH3ed7BbFYmJbsfoDCJidTeTR6uuIEuLx3nfAC2f7G8NnxWZeuR hAeNezlsz+d99/B+ORiGgVa8CD2cPjoXMThrSJQqpIvBUWeQtERtSZGB44D5AKcCpTr5 SR1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:mime-version:content-disposition:user-agent; bh=d/cLCMPf1qoYgQ/hxmrBn4Uvy4y9T+9HtwufPvX/3tM=; b=SxntgELqtFO12+d286bTqDw9zfaYmCOVrbG2KDaswgZOU0TyRnJ6QK/zv2heLCf1a0 jZRpq1x180Ppw50mAjrB9IRh7Q4PE+NOxpI0+7KhAVWWnbYDX3zYsw/s+ndNl2lke4TQ R/gwHvJ/ieD0t2A8oGVejE82l/Ai32sv46o8L3W6iGBzn5+KjUrwtJ2LR9Pm9DxeKrLD AJLM0JcHKCWE/VHXqRMikgpSgUAfoaGZlLL/jxX8OfJ6NJ07IMHphHUWDbhvrA70W3NI IbTBbmj1wZ8ZJouHnvdq0Wd48A91qY47eCZaPurRpfaIJwV517SuRfyXsfHU6+fqkV+V A16A== X-Gm-Message-State: ALQs6tBjVymtxMqVCgGOXgGr6BIlkoGzP2NBLZ0vG/OTlRPbHRMmCd2s 2xIJidrIlUrS03TtNHEdCZSO8DQi X-Received: by 10.98.131.69 with SMTP id h66mr22945871pfe.0.1525346263332; Thu, 03 May 2018 04:17:43 -0700 (PDT) Received: from udknight.localhost ([183.90.36.235]) by smtp.gmail.com with ESMTPSA id z21sm21680272pfn.182.2018.05.03.04.17.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 04:17:42 -0700 (PDT) Received: from udknight.localhost (localhost [127.0.0.1]) by udknight.localhost (8.14.9/8.14.9) with ESMTP id w43BHph7000925; Thu, 3 May 2018 19:17:51 +0800 Received: (from root@localhost) by udknight.localhost (8.14.9/8.14.9/Submit) id w43BHmfZ000922; Thu, 3 May 2018 19:17:48 +0800 Date: Thu, 3 May 2018 19:17:48 +0800 From: Wang YanQing To: axboe@kernel.dk Cc: gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@huawei.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] block: add verifier for cmdline partition Message-ID: <20180503111748.GA904@udknight> Mail-Followup-To: Wang YanQing , axboe@kernel.dk, gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@huawei.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.7.1 (2016-10-04) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I meet strange filesystem corruption issue recently, the reason is there are overlaps partitions in cmdline partition argument. This patch add verifier for cmdline partition, then if there are overlaps partitions, cmdline_partition will return error and log a error message. Signed-off-by: Wang YanQing --- block/partitions/cmdline.c | 63 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index e333583..6754c2a 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c @@ -58,6 +58,62 @@ static int __init cmdline_parts_setup(char *s) } __setup("blkdevparts=", cmdline_parts_setup); +static bool has_overlaps(sector_t from, sector_t size, + sector_t from2, sector_t size2) +{ + sector_t end = from + size; + sector_t end2 = from2 + size2; + + if (from >= from2 && from < end2) + return true; + + if (end > from2 && end <= end2) + return true; + + if (from2 >= from && from2 < end) + return true; + + if (end2 > from && end2 <= end) + return true; + + return false; +} + +static bool cmdline_parts_verifier(int slot, struct parsed_partitions *state) +{ + int i, j = slot; + bool ret = true; + + for (; state->parts[slot].has_info; slot++) { + for (i = j; state->parts[i].has_info; i++) { + if (i == slot) + continue; + + if (has_overlaps(state->parts[slot].from, + state->parts[slot].size, + state->parts[i].from, + state->parts[i].size)) { + pr_err("Invalid cmdline partition:" + "%s[%llu,%llu] overlaps with " + "%s[%llu,%llu]", + state->parts[slot].info.volname, + (u64)state->parts[slot].from << 9, + (u64)state->parts[slot].size << 9, + state->parts[i].info.volname, + (u64)state->parts[i].from << 9, + (u64)state->parts[i].size << 9); + ret = false; + break; + } + } + + if (!ret) + break; + } + + return ret; +} + /* * Purpose: allocate cmdline partitions. * Returns: @@ -70,6 +126,7 @@ int cmdline_partition(struct parsed_partitions *state) sector_t disk_size; char bdev[BDEVNAME_SIZE]; struct cmdline_parts *parts; + int ret; if (cmdline) { if (bdev_parts) @@ -93,8 +150,12 @@ int cmdline_partition(struct parsed_partitions *state) disk_size = get_capacity(state->bdev->bd_disk) << 9; cmdline_parts_set(parts, disk_size, 1, add_part, (void *)state); + if (!cmdline_parts_verifier(1, (void *)state)) + ret = -1; + else + ret = 1; strlcat(state->pp_buf, "\n", PAGE_SIZE); - return 1; + return ret; } -- 1.8.5.6.2.g3d8a54e.dirty