Received: by 10.192.165.148 with SMTP id m20csp1771822imm; Sat, 5 May 2018 22:25:31 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoBvtJxS/xqOU+kaoLV5KuyuOaeR+j4S7Gki2na04VgUvYyEMzfwRWddBMgkbFw+jhqxapO X-Received: by 2002:a65:6414:: with SMTP id a20-v6mr5312556pgv.324.1525584331692; Sat, 05 May 2018 22:25:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525584331; cv=none; d=google.com; s=arc-20160816; b=Z7nd/0H7Zj8ErdVQBpq5qRqJpUte6KnMOZSTKVnG1Erg7bwE1oW2bYWvb2OwmVPoJa kqpuDOKd5Dsq5fgIRCkt7bb1rLV0BtZMwC1ppqc9IVFHtjpoyPWLL2uGrbXil0xovD5E Ejd3K3cW+thIpyjiqijwCxCQZVzzUnv1FYaoskAJEbcO5RpgoAtErs/vp/PwBprv+u/v gzd9ObLp+ZVaCSTIFLqhKLlQjjnWYkRhxbZmuqggs2xUbztSAiCaFGTzf8IdhpicK6zF g/QFYpmCYFxCa5kxySTgfKDXTWOyON/wBjVHtV9PZbGQq834z40y9bkzqGW2zH056LPP kWgA== 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=lBctqYJO3nJYcA6+wg9jmVBMWfjN54WqVNNJzg0dSvw=; b=rGAJiD0UDa/5IQifmOnFiaNWsLQqJs83tBUZyofOGaaAF/JUBY9u6M21jGj6p29yLk k5XCrjHML6KpNH4jkWBI8xoW3RtpTOq+YNC1ayPdnedDc7zI7Qcazh43K6RWCZsV72Qz R8b7s4RtbaQe9WP5GmX3MXUp31uOKT9O2A/wWzFcwlsdlNh4ePcL0aOC2j8XqmYAHUol e9hKSqiFm2WEQZf+BipMw2daKWpFMiZ1pLl9JgI+dO7VNu1wMUQlWMe7+ART1F6lAoLX gfYJT63par6yU5tirJtVeYiKU7DCtUw+tYzxsl+6Jz+tlgn/Kxd8AD1+dI0Xv7Udqxl8 slQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ddUO5kLU; 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 a17-v6si1299343pgd.187.2018.05.05.22.25.17; Sat, 05 May 2018 22:25:31 -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=ddUO5kLU; 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 S1751123AbeEFFZF (ORCPT + 99 others); Sun, 6 May 2018 01:25:05 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:41221 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750824AbeEFFZD (ORCPT ); Sun, 6 May 2018 01:25:03 -0400 Received: by mail-pf0-f196.google.com with SMTP id v63so20357580pfk.8; Sat, 05 May 2018 22:25:03 -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=lBctqYJO3nJYcA6+wg9jmVBMWfjN54WqVNNJzg0dSvw=; b=ddUO5kLUYvcAML/ZtOAXrRRpqkAQGqG2eqOS+z0/Z15h8jbBfo5AlPWZtJd/L6NVRU of1Z9lombHQCtaV5Hv5jmFOQLIhtCiqc54mbhV4MR1p06s98NPeJHUDmRTDdidIuNKig KyoTZ8KUjwfiLdBPbK/Oe8+KshaP2A4FEJltiTy0xNNoJzAE/4DVlxStcQO+natt9dA7 MFa9HJCpI2sjZvHAGmUy9UbJYURCtXPEghQQ9sOLAuL+D7MCXTx0GbAipsNsdSHylkZt DG87iiikbxDL7ocgKzikCqdPBi7upsxgOkPVUiCor0egLg+COhYrQbCbHoeOBdAyVr9J zT2w== 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=lBctqYJO3nJYcA6+wg9jmVBMWfjN54WqVNNJzg0dSvw=; b=qKcyyEiXIGalruPkAEX18CqYXDHqXmZLxU1YRa35rbt3eci68n7zvSbKs7sSw8O/NE vcSZbCS5fkOFZuBAn+uDh8CVuf/gt3AEmiURTis4+ZnjPoN04ugEOBjSwoMYvI70+RtG fwjfvikK6HOb7pgzTCYFBt0v1nG+h5iNhXugrprpXIeucYIw7I2VCOsz+7CL4k/bxrT8 Mms6lInMf/d70Ktk641jOdt+DVWQ0smKZrbGoCkrBwHZxxQTCqWFkntT3fZfnjSp2903 5RnA2A4OUZbZm4LZNj37UgTsL7AajqL04OCgA8atwabgpbUFpiWrFg/prQyquYGzdoOg mfwg== X-Gm-Message-State: ALQs6tBnSDHqZnWLsJ5ZrkmCVL20XP9exYeOd5WLDtO70kUYHPEBWBG/ hGHwZB3UGFBYZLk31oUTZ38= X-Received: by 2002:a63:af4b:: with SMTP id s11-v6mr11131799pgo.346.1525584303001; Sat, 05 May 2018 22:25:03 -0700 (PDT) Received: from udknight.localhost ([183.90.36.235]) by smtp.gmail.com with ESMTPSA id d3-v6sm31532833pgc.12.2018.05.05.22.25.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 May 2018 22:25:02 -0700 (PDT) Received: from udknight.localhost (localhost [127.0.0.1]) by udknight.localhost (8.14.9/8.14.9) with ESMTP id w465Nw9c011201; Sun, 6 May 2018 13:23:59 +0800 Received: (from root@localhost) by udknight.localhost (8.14.9/8.14.9/Submit) id w465NuLd011199; Sun, 6 May 2018 13:23:56 +0800 Date: Sun, 6 May 2018 13:23:56 +0800 From: Wang YanQing To: axboe@kernel.dk Cc: gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@hisilicon.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3] block: add verifier for cmdline partition Message-ID: <20180506052356.GA11163@udknight> Mail-Followup-To: Wang YanQing , axboe@kernel.dk, gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@hisilicon.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 log a warning. Signed-off-by: Wang YanQing --- Changes v2-v3: 1:Fix log one pair of overlaps partitions twice in cmdline_parts_verifier. 2:Fix out of bound access in cmdline_parts_verifier. v1-v2: 1:Don't treat overlaps partition as a error, but log a warning. block/partitions/cmdline.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index e333583..fefcc72 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c @@ -58,6 +58,71 @@ 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 inline void overlaps_warns_header(void) +{ + pr_warn("\n"); + pr_warn("Overlaps partitions being used in command line partition.\n"); + pr_warn("Don't use filesystems on overlaps partitions:\n"); +} + +static inline void overlaps_warns_tailer(void) +{ + pr_warn("\n"); +} + +static void cmdline_parts_verifier(int slot, struct parsed_partitions *state) +{ + int i; + bool header = true; + + for (; slot < state->limit && state->parts[slot].has_info; slot++) { + for (i = slot+1; i < state->limit && state->parts[i].has_info; + i++) { + if (has_overlaps(state->parts[slot].from, + state->parts[slot].size, + state->parts[i].from, + state->parts[i].size)) { + if (header) { + header = false; + overlaps_warns_header(); + } + pr_warn("%s[%llu,%llu] overlaps with " + "%s[%llu,%llu].\n", + 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); + } + } + } + + if (!header) + overlaps_warns_tailer(); +} + /* * Purpose: allocate cmdline partitions. * Returns: @@ -93,6 +158,7 @@ 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); + cmdline_parts_verifier(1, (void *)state); strlcat(state->pp_buf, "\n", PAGE_SIZE); -- 1.8.5.6.2.g3d8a54e.dirty