lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <202502170319.1LAHKJlm-lkp@intel.com>
Date: Mon, 17 Feb 2025 03:50:51 +0800
From: kernel test robot <lkp@...el.com>
To: Mikulas Patocka <mpatocka@...hat.com>
Cc: oe-kbuild-all@...ts.linux.dev, linux-kernel@...r.kernel.org
Subject: drivers/md/dm-integrity.c:3212 integrity_recalc_inline() warn:
 unsigned '_x' is never less than zero.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   ad1b832bf1cf2df9304f8eb72943111625c7e5a7
commit: 90da77987dd59c8f6ec6d508d23d5a77c7af64f1 dm-integrity: support recalculation in the 'I' mode
date:   5 months ago
config: riscv-randconfig-r073-20250213 (https://download.01.org/0day-ci/archive/20250217/202502170319.1LAHKJlm-lkp@intel.com/config)
compiler: riscv32-linux-gcc (GCC) 14.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502170319.1LAHKJlm-lkp@intel.com/

New smatch warnings:
drivers/md/dm-integrity.c:3212 integrity_recalc_inline() warn: unsigned '_x' is never less than zero.

Old smatch warnings:
drivers/md/dm-integrity.c:518 sb_mac() error: memcmp() 'actual_mac' too small (64 vs 448)
drivers/md/dm-integrity.c:2515 dm_integrity_map_inline() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:2559 dm_integrity_inline_recheck() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:2575 dm_integrity_inline_recheck() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:2530 dm_integrity_free_payload() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:3229 integrity_recalc_inline() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:3237 integrity_recalc_inline() warn: unsigned '_x' is never less than zero.
include/linux/scatterlist.h:189 sg_set_buf() warn: unsigned '_x' is never less than zero.
drivers/md/dm-integrity.c:5149 dm_integrity_ctr() warn: Function too hairy.  No more merges.

vim +/_x +3212 drivers/md/dm-integrity.c

  3148	
  3149	static void integrity_recalc_inline(struct work_struct *w)
  3150	{
  3151		struct dm_integrity_c *ic = container_of(w, struct dm_integrity_c, recalc_work);
  3152		size_t recalc_tags_size;
  3153		u8 *recalc_buffer = NULL;
  3154		u8 *recalc_tags = NULL;
  3155		struct dm_integrity_range range;
  3156		struct bio *bio;
  3157		struct bio_integrity_payload *bip;
  3158		__u8 *t;
  3159		unsigned int i;
  3160		int r;
  3161		unsigned ret;
  3162		unsigned int super_counter = 0;
  3163		unsigned recalc_sectors = RECALC_SECTORS;
  3164	
  3165	retry:
  3166		recalc_buffer = kmalloc(recalc_sectors << SECTOR_SHIFT, GFP_NOIO | __GFP_NOWARN);
  3167		if (!recalc_buffer) {
  3168	oom:
  3169			recalc_sectors >>= 1;
  3170			if (recalc_sectors >= 1U << ic->sb->log2_sectors_per_block)
  3171				goto retry;
  3172			DMCRIT("out of memory for recalculate buffer - recalculation disabled");
  3173			goto free_ret;
  3174		}
  3175	
  3176		recalc_tags_size = (recalc_sectors >> ic->sb->log2_sectors_per_block) * ic->tuple_size;
  3177		if (crypto_shash_digestsize(ic->internal_hash) > ic->tuple_size)
  3178			recalc_tags_size += crypto_shash_digestsize(ic->internal_hash) - ic->tuple_size;
  3179		recalc_tags = kmalloc(recalc_tags_size, GFP_NOIO | __GFP_NOWARN);
  3180		if (!recalc_tags) {
  3181			kfree(recalc_buffer);
  3182			recalc_buffer = NULL;
  3183			goto oom;
  3184		}
  3185	
  3186		spin_lock_irq(&ic->endio_wait.lock);
  3187	
  3188	next_chunk:
  3189		if (unlikely(dm_post_suspending(ic->ti)))
  3190			goto unlock_ret;
  3191	
  3192		range.logical_sector = le64_to_cpu(ic->sb->recalc_sector);
  3193		if (unlikely(range.logical_sector >= ic->provided_data_sectors))
  3194			goto unlock_ret;
  3195		range.n_sectors = min((sector_t)recalc_sectors, ic->provided_data_sectors - range.logical_sector);
  3196	
  3197		add_new_range_and_wait(ic, &range);
  3198		spin_unlock_irq(&ic->endio_wait.lock);
  3199	
  3200		if (unlikely(++super_counter == RECALC_WRITE_SUPER)) {
  3201			recalc_write_super(ic);
  3202			super_counter = 0;
  3203		}
  3204	
  3205		if (unlikely(dm_integrity_failed(ic)))
  3206			goto err;
  3207	
  3208		DEBUG_print("recalculating: %llx - %llx\n", range.logical_sector, range.n_sectors);
  3209	
  3210		bio = bio_alloc_bioset(ic->dev->bdev, 1, REQ_OP_READ, GFP_NOIO, &ic->recalc_bios);
  3211		bio->bi_iter.bi_sector = ic->start + SB_SECTORS + range.logical_sector;
> 3212		__bio_add_page(bio, virt_to_page(recalc_buffer), range.n_sectors << SECTOR_SHIFT, offset_in_page(recalc_buffer));
  3213		r = submit_bio_wait(bio);
  3214		bio_put(bio);
  3215		if (unlikely(r)) {
  3216			dm_integrity_io_error(ic, "reading data", r);
  3217			goto err;
  3218		}
  3219	
  3220		t = recalc_tags;
  3221		for (i = 0; i < range.n_sectors; i += ic->sectors_per_block) {
  3222			memset(t, 0, ic->tuple_size);
  3223			integrity_sector_checksum(ic, range.logical_sector + i, recalc_buffer + (i << SECTOR_SHIFT), t);
  3224			t += ic->tuple_size;
  3225		}
  3226	
  3227		bio = bio_alloc_bioset(ic->dev->bdev, 1, REQ_OP_WRITE, GFP_NOIO, &ic->recalc_bios);
  3228		bio->bi_iter.bi_sector = ic->start + SB_SECTORS + range.logical_sector;
  3229		__bio_add_page(bio, virt_to_page(recalc_buffer), range.n_sectors << SECTOR_SHIFT, offset_in_page(recalc_buffer));
  3230	
  3231		bip = bio_integrity_alloc(bio, GFP_NOIO, 1);
  3232		if (unlikely(IS_ERR(bip))) {
  3233			bio_put(bio);
  3234			DMCRIT("out of memory for bio integrity payload - recalculation disabled");
  3235			goto err;
  3236		}
  3237		ret = bio_integrity_add_page(bio, virt_to_page(recalc_tags), t - recalc_tags, offset_in_page(recalc_tags));
  3238		if (unlikely(ret != t - recalc_tags)) {
  3239			bio_put(bio);
  3240			dm_integrity_io_error(ic, "attaching integrity tags", -ENOMEM);
  3241			goto err;
  3242		}
  3243	
  3244		r = submit_bio_wait(bio);
  3245		bio_put(bio);
  3246		if (unlikely(r)) {
  3247			dm_integrity_io_error(ic, "writing data", r);
  3248			goto err;
  3249		}
  3250	
  3251		cond_resched();
  3252		spin_lock_irq(&ic->endio_wait.lock);
  3253		remove_range_unlocked(ic, &range);
  3254	#ifdef CONFIG_64BIT
  3255		/* Paired with smp_load_acquire in dm_integrity_map_inline. */
  3256		smp_store_release(&ic->sb->recalc_sector, cpu_to_le64(range.logical_sector + range.n_sectors));
  3257	#else
  3258		ic->sb->recalc_sector = cpu_to_le64(range.logical_sector + range.n_sectors);
  3259	#endif
  3260		goto next_chunk;
  3261	
  3262	err:
  3263		remove_range(ic, &range);
  3264		goto free_ret;
  3265	
  3266	unlock_ret:
  3267		spin_unlock_irq(&ic->endio_wait.lock);
  3268	
  3269		recalc_write_super(ic);
  3270	
  3271	free_ret:
  3272		kfree(recalc_buffer);
  3273		kfree(recalc_tags);
  3274	}
  3275	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ