[bug report] fs/ntfs3: inconsistent NULL checking in attr_set_size()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Konstantin Komarov,

This is a semi-automatic email about new static checker warnings.

The patch be71b5cba2e6: "fs/ntfs3: Add attrib operations" from Aug
13, 2021, leads to the following Smatch complaint:

    fs/ntfs3/attrib.c:764 attr_set_size()
    error: we previously assumed 'le' could be null (see line 703)

fs/ntfs3/attrib.c
   702					goto out;
   703			} else if (le && le->vcn) {
                                   ^^
This code assumes "le" can be NULL.

   704				u16 le_sz = le16_to_cpu(le->size);
   705	
   706				/*
   707				 * NOTE: list entries for one attribute are always
   708				 * the same size. We deal with last entry (vcn==0)
   709				 * and it is not first in entries array
   710				 * (list entry for std attribute always first)
   711				 * So it is safe to step back
   712				 */
   713				mi_remove_attr(mi, attr);
   714	
   715				if (!al_remove_le(ni, le)) {
   716					err = -EINVAL;
   717					goto out;
   718				}
   719	
   720				le = (struct ATTR_LIST_ENTRY *)((u8 *)le - le_sz);
   721			} else {
   722				attr->nres.evcn = cpu_to_le64((u64)vcn - 1);
   723				mi->dirty = true;
   724			}
   725	
   726			attr_b->nres.alloc_size = cpu_to_le64(new_alloc_tmp);
   727	
   728			if (vcn == new_alen) {
   729				attr_b->nres.data_size = cpu_to_le64(new_size);
   730				if (new_size < old_valid)
   731					attr_b->nres.valid_size =
   732						attr_b->nres.data_size;
   733			} else {
   734				if (new_alloc_tmp <=
   735				    le64_to_cpu(attr_b->nres.data_size))
   736					attr_b->nres.data_size =
   737						attr_b->nres.alloc_size;
   738				if (new_alloc_tmp <
   739				    le64_to_cpu(attr_b->nres.valid_size))
   740					attr_b->nres.valid_size =
   741						attr_b->nres.alloc_size;
   742			}
   743	
   744			if (is_ext)
   745				le64_sub_cpu(&attr_b->nres.total_size,
   746					     ((u64)alen << cluster_bits));
   747	
   748			mi_b->dirty = true;
   749	
   750			if (new_alloc_tmp <= new_alloc)
   751				goto ok;
   752	
   753			old_size = new_alloc_tmp;
   754			vcn = svcn - 1;
   755	
   756			if (le == le_b) {
   757				attr = attr_b;
   758				mi = mi_b;
   759				evcn = svcn - 1;
   760				svcn = 0;
   761				goto next_le;
   762			}
   763	
   764			if (le->type != type || le->name_len != name_len ||
                            ^^^^^^^^
Unchecked dereference.

   765			    memcmp(le_name(le), name, name_len * sizeof(short))) {
   766				err = -EINVAL;

regards,
dan carpenter




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux