Successfully identified regression in *linux* in CI configuration 
tcwg_kernel/llvm-release-arm-next-allmodconfig.  So far, this commit has 
regressed CI configurations:
 - tcwg_kernel/llvm-release-arm-next-allmodconfig

Culprit:
<cut>
commit fad7cd3310db3099f95dd34312c77740fbc455e5
Author: Baokun Li <libaok...@huawei.com>
Date:   Wed Aug 4 10:12:12 2021 +0800

    nbd: add the check to prevent overflow in __nbd_ioctl()
    
    If user specify a large enough value of NBD blocks option, it may trigger
    signed integer overflow which may lead to nbd->config->bytesize becomes a
    large or small value, zero in particular.
    
    UBSAN: Undefined behaviour in drivers/block/nbd.c:325:31
    signed integer overflow:
    1024 * 4611686155866341414 cannot be represented in type 'long long int'
    [...]
    Call trace:
    [...]
     handle_overflow+0x188/0x1dc lib/ubsan.c:192
     __ubsan_handle_mul_overflow+0x34/0x44 lib/ubsan.c:213
     nbd_size_set drivers/block/nbd.c:325 [inline]
     __nbd_ioctl drivers/block/nbd.c:1342 [inline]
     nbd_ioctl+0x998/0xa10 drivers/block/nbd.c:1395
     __blkdev_driver_ioctl block/ioctl.c:311 [inline]
    [...]
    
    Although it is not a big deal, still silence the UBSAN by limit
    the input value.
    
    Reported-by: Hulk Robot <hul...@huawei.com>
    Signed-off-by: Baokun Li <libaok...@huawei.com>
    Reviewed-by: Josef Bacik <jo...@toxicpanda.com>
    Link: https://lore.kernel.org/r/20210804021212.990223-1-libaok...@huawei.com
    [axboe: dropped unlikely()]
    Signed-off-by: Jens Axboe <ax...@kernel.dk>
</cut>

Results regressed to (for first_bad == fad7cd3310db3099f95dd34312c77740fbc455e5)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_llvm:
-5
# build_abe qemu:
-2
# linux_n_obj:
21709
# First few build errors in logs:
# 00:07:12 make[1]: *** [modules-only.symvers] Error 1
# 00:07:12 make: *** [modules] Error 2

from (for last_good == da20b58d5bbbb0d23ae9530992a37d0f0d1787a4)
# reset_artifacts:
-10
# build_abe binutils:
-9
# build_llvm:
-5
# build_abe qemu:
-2
# linux_n_obj:
29751
# linux build successful:
all

Artifacts of last_good build: 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/build-da20b58d5bbbb0d23ae9530992a37d0f0d1787a4/
Artifacts of first_bad build: 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/build-fad7cd3310db3099f95dd34312c77740fbc455e5/
Build top page/logs: 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/

Configuration details:
rr[linux_git]="https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git#ecf93431963a95c0f475921101bedc0dd62ec96d";

Reproduce builds:
<cut>
mkdir investigate-linux-fad7cd3310db3099f95dd34312c77740fbc455e5
cd investigate-linux-fad7cd3310db3099f95dd34312c77740fbc455e5

git clone https://git.linaro.org/toolchain/jenkins-scripts

mkdir -p artifacts/manifests
curl -o artifacts/manifests/build-baseline.sh 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/manifests/build-baseline.sh
 --fail
curl -o artifacts/manifests/build-parameters.sh 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/manifests/build-parameters.sh
 --fail
curl -o artifacts/test.sh 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/test.sh
 --fail
chmod +x artifacts/test.sh

# Reproduce the baseline build (build all pre-requisites)
./jenkins-scripts/tcwg_kernel-build.sh @@ artifacts/manifests/build-baseline.sh

# Save baseline build state (which is then restored in artifacts/test.sh)
mkdir -p ./bisect
rsync -a --del --delete-excluded --exclude /bisect/ --exclude /artifacts/ 
--exclude /linux/ ./ ./bisect/baseline/

cd linux

# Reproduce first_bad build
git checkout --detach fad7cd3310db3099f95dd34312c77740fbc455e5
../artifacts/test.sh

# Reproduce last_good build
git checkout --detach da20b58d5bbbb0d23ae9530992a37d0f0d1787a4
../artifacts/test.sh

cd ..
</cut>

History of pending regressions and results: 
https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/ci/tcwg_kernel/llvm-release-arm-next-allmodconfig

Artifacts: 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/artifact/artifacts/
Build log: 
https://ci.linaro.org/job/tcwg_kernel-llvm-bisect-llvm-release-arm-next-allmodconfig/31/consoleText

Full commit (up to 1000 lines):
<cut>
commit fad7cd3310db3099f95dd34312c77740fbc455e5
Author: Baokun Li <libaok...@huawei.com>
Date:   Wed Aug 4 10:12:12 2021 +0800

    nbd: add the check to prevent overflow in __nbd_ioctl()
    
    If user specify a large enough value of NBD blocks option, it may trigger
    signed integer overflow which may lead to nbd->config->bytesize becomes a
    large or small value, zero in particular.
    
    UBSAN: Undefined behaviour in drivers/block/nbd.c:325:31
    signed integer overflow:
    1024 * 4611686155866341414 cannot be represented in type 'long long int'
    [...]
    Call trace:
    [...]
     handle_overflow+0x188/0x1dc lib/ubsan.c:192
     __ubsan_handle_mul_overflow+0x34/0x44 lib/ubsan.c:213
     nbd_size_set drivers/block/nbd.c:325 [inline]
     __nbd_ioctl drivers/block/nbd.c:1342 [inline]
     nbd_ioctl+0x998/0xa10 drivers/block/nbd.c:1395
     __blkdev_driver_ioctl block/ioctl.c:311 [inline]
    [...]
    
    Although it is not a big deal, still silence the UBSAN by limit
    the input value.
    
    Reported-by: Hulk Robot <hul...@huawei.com>
    Signed-off-by: Baokun Li <libaok...@huawei.com>
    Reviewed-by: Josef Bacik <jo...@toxicpanda.com>
    Link: https://lore.kernel.org/r/20210804021212.990223-1-libaok...@huawei.com
    [axboe: dropped unlikely()]
    Signed-off-by: Jens Axboe <ax...@kernel.dk>
---
 drivers/block/nbd.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index c38317979f74..f82264835794 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1384,6 +1384,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct 
nbd_device *nbd,
                       unsigned int cmd, unsigned long arg)
 {
        struct nbd_config *config = nbd->config;
+       loff_t bytesize;
 
        switch (cmd) {
        case NBD_DISCONNECT:
@@ -1398,8 +1399,9 @@ static int __nbd_ioctl(struct block_device *bdev, struct 
nbd_device *nbd,
        case NBD_SET_SIZE:
                return nbd_set_size(nbd, arg, config->blksize);
        case NBD_SET_SIZE_BLOCKS:
-               return nbd_set_size(nbd, arg * config->blksize,
-                                   config->blksize);
+               if (check_mul_overflow((loff_t)arg, config->blksize, &bytesize))
+                       return -EINVAL;
+               return nbd_set_size(nbd, bytesize, config->blksize);
        case NBD_SET_TIMEOUT:
                nbd_set_cmd_timeout(nbd, arg);
                return 0;
</cut>
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to