On Tue, 2025-05-06 at 18:26 -0400, Benjamin Marzinski wrote:
> On Mon, May 05, 2025 at 06:29:52PM +0200, Martin Wilck wrote:
> > Xose has kindly informed me about the warnings from Fedora's static
> > code analysis tool.
> > 
> > I'm sending a couple of related fixes here. Most of the warnings
> > appear to be false positives though, see below (a second look by
> > another eye pair would be appreciated).
> 
> I mostly agree with you, except that I wouldn't call all the errors
> related to VECTOR_SLOT() returning NULL false postitives (so maybe I
> mostly disagree with you. I didn't count). If we are in a
> vector_foreach_slot_*() loop and we are looking at
> VECTOR_SLOT(<vector_we_are_looping_over>, <current_index_value>),
> then I
> agree, we can't see a NULL value. But most, if not all, of the "NULL
> value from a vector" errors that got flagged here were not protected
> by
> the checks in vector_foreach_slot_*(). 

No not all. I double checked quite a few. Maybe I got too sloppy at
some point and started dismissing these warnings prematurely.

> Now I don't know of any cases
> where we do have NULLs in a vector, but we certainly could. We
> manipulate them all over the code. If we ever call
> vector_alloc_slot()
> and not vector_set_slot() we would have a NULL.

I've been thinking for some time that we should have a single function
vector_alloc_and_set_slot().

>   There's also no check
> to make sure that we don't call vector_set_slot() with a NULL value.
> 
> We do have checks for NULL values when looping through vectors, and
> we
> even have vector_repack() to get rid of them. So, it's completely
> reasonable that a static analyzer would think that we might have a
> NULL
> value in a vector. And I'm pretty sure that NULL values in a vector
> are
> always a bug. 

Right. Then we should add assert() statements rather than NULL checks,
both when adding slots and when reading from vectors.


> They make vector_foreach_slot() unable to access any
> values past them, despite the fact that we can keep adding values to
> the
> vector.
> 
> Actually, cleaning this up, so that the code keeps us from having
> NULL
> values in vectors as long as we only manipulate them with the
> functions
> in vector.h has been on my todo list for a bit

Does this mean you intend to work on it and send patches?

Regards,
Martin


> . It would take some code
> auditing to make sure that there isn't a case where we do use vectors
> where NULL values are expected. But if there is, I think that should
> use
> a seperate set of functions, to clearly mark it out as special.




> 
> -Ben
> 
> > 
> > Regards
> > Martin
> > 
> > On Sat, 2025-05-03 at 23:29 +0200, Xose Vazquez Perez wrote:
> > > Findings by static analyzers in Fedora 43 Critical Path Packages:
> > > https://marc.info/?l=fedora-devel-list&m=174582743823723
> > > 
> > > device-mapper-multipath-0.11.1-1.fc43:
> > > https://openscanhub.fedoraproject.org/task/51915/
> > > 
> > > device-mapper-multipath-0.11.1-1.fc43 List of Findings:
> > > https://openscanhub.fedoraproject.org/task/51915/log/device-mapper-multipath-0.11.1-1.fc43/scan-results.html
> > 
> > I'll leave the shellcheck errors in mpathconf to Ben.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-775): [#def42]
> > > multipath-tools-0.11.1/kpartx/dasd.c:89:24: warning[-Wanalyzer-
> > > fd-leak]: leak of file descriptor ‘fd_dasd’
> > > multipath-tools-0.11.1/kpartx/dasd.c:69:1: enter_function: entry
> > > to ‘read_dasd_pt’
> > > ...
> > > multipath-tools-0.11.1/kpartx/dasd.c:134:20: branch_true:
> > > following ‘true’ branch (when ‘fd_dasd < 0’)...
> > > branch_true: ...to here
> > 
> > This one looks like a false positive to me. If fd_dasd < 0, it
> > can't be leaked.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def45]
> > > multipath-tools-0.11.1/libmpathutil/parser.c:139:29: warning[-
> > > Wanalyzer-null-dereference]: dereference of NULL ‘keyword’
> > 
> > False positive, too. VECTOR_SLOT won't return NULL here. 
> > We could add a test to make the compiler happy, but I don't quite
> > see the point.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-457): [#def49]
> > > multipath-tools-0.11.1/libmultipath/alias.c:201:31: warning[-
> > > Wanalyzer-use-of-uninitialized-value]: use of uninitialized value
> > > ‘bdg’
> > 
> > False positive. bdg won't be NULL here.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-465): [#def50]
> > > multipath-tools-0.11.1/libmultipath/dmparser.c:31:12: warning[-
> > > Wanalyzer-deref-before-check]: check of ‘p’ for NULL after
> > > already dereferencing it
> > 
> > False positive. *dst is non-NULL when we call merge_words(). We
> > must double-check
> > after calling realloc().
> > (That said, we should reimplement this using strbuf functions).
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def51]
> > > multipath-tools-0.11.1/libmultipath/dmparser.c:436:25: warning[-
> > > Wanalyzer-null-dereference]: dereference of NULL ‘pgp’
> > 
> > False positive. VECTOR_SLOT won't return NULL here. Same for the
> > next 3 errors.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def55]
> > > multipath-tools-0.11.1/libmultipath/dmparser.c:501:33: warning[-
> > > Wanalyzer-null-dereference]: dereference of NULL ‘pp’
> > 
> > Likewise. Same for the next 2 errors.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def58]
> > > multipath-tools-0.11.1/libmultipath/foreign/nvme.c:494:28:
> > > warning[-Wanalyzer-null-dereference]: dereference of NULL ‘path’
> > 
> > The nvme_pathgroup is a member of struct nvme_path.
> > nvme_pg_to_path() doesn't return NULL. Same for the next 2 errors
> > in nvme.c
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def62]
> > > multipath-tools-0.11.1/libmultipath/pgpolicies.c:191:17:
> > > warning[-Wanalyzer-null-dereference]: dereference of NULL ‘pp1’
> > 
> > Again, false positives; VECTOR_SLOT() doesn't return NULL here.
> > Same for the next 3 errors.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-401): [#def66]
> > > multipath-tools-0.11.1/libmultipath/print.c:920:16: warning[-
> > > Wanalyzer-malloc-leak]: leak of ‘alloc_path_layout()’
> > 
> > False positive. Strange one - gcc doesn't understand its own
> > __attribute__((cleanup))?
> > Or am I blind? Same for the next one.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-126): [#def70]
> > multipath-tools-0.11.1/libmultipath/uevent.c:122:9: warning[-
> > Wanalyzer-out-of-bounds]: stack-based buffer over-read
> > 
> > This one is somewhat harder because it involves list handling
> > macros, but I believe that our code is correct and that this is a
> > false positive, too.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-775): [#def69]
> > > multipath-tools-0.11.1/libmultipath/sysfs.c:309:22: warning[-
> > > Wanalyzer-fd-leak]: leak of file descriptor ‘open(&pathbuf, 0)’
> > 
> > Again, false positive; there's a cleanup function for fd.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-775): [#def71]
> > > multipath-tools-0.11.1/libmultipath/valid.c:208:34: warning[-
> > > Wanalyzer-file-leak]: leak of FILE ‘fopen(&mountinfo, "r")’
> > 
> > False positive, gcc doesn't understand the cleanup_fclose().
> > Same for the next error.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-415): [#def73]
> > > multipath-tools-0.11.1/multipathd/fpin_handlers.c:508:17:
> > > warning[-Wanalyzer-double-free]: double-‘free’ of
> > > ‘els_marginal_list_head.next + -2056’
> > 
> > I don't see an error in this code. Looks like another false
> > positive to me.
> > 
> > > Error: GCC_ANALYZER_WARNING: [#def74]
> > > multipath-tools-0.11.1/multipathd/fpin_handlers.c:624:23:
> > > warning[-Wanalyzer-fd-use-without-check]: ‘read’ on possibly
> > > invalid file descriptor ‘fd’
> > 
> > False positive, too. fd == -1 is checked beforehand.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-688): [#def75]
> > > multipath-tools-0.11.1/multipathd/main.c:3286:21: warning[-
> > > Wanalyzer-null-argument]: use of NULL ‘new’ where non-null
> > > expected
> > 
> > Similar to other false positives above, VECTOR_SLOT() won't return
> > NULL in a  loop like this.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-775): [#def77]
> > > multipath-tools-0.11.1/multipathd/main.c:3973:12: warning[-
> > > Wanalyzer-fd-leak]: leak of file descriptor
> > > ‘dup2(open("/dev/null", 2), 0)’
> > 
> > Yet another false positive, the fd is closed in the cleanup
> > handler. Same for the next 3 errors.
> > 
> > > Error: GCC_ANALYZER_WARNING (CWE-476): [#def81]
> > multipath-tools-0.11.1/multipathd/multipathc.c:97:30: warning[-
> > Wanalyzer-null-dereference]: dereference of NULL ‘kw’
> > 
> > Another case of VECTOR_SLOT() false positive. Same for the next
> > error.
> > 
> > Regards
> > Martin
> > 
> > Martin Wilck (6):
> >   kpartx_id: fix shellcheck reported errors
> >   kpartx: fix file descriptor leak
> >   libmpathpersist: fix memory leak in mpath_prout_rel()
> >   libmpathutil: silence compiler warning in vector_del_slot()
> >   libmultipath: fix undefined behavior in 31-bit shift
> >   libmultipath: prioritizers/iet: fix possible NULL dereference
> > 
> >  kpartx/kpartx.c                     | 14 +++++++-------
> >  kpartx/kpartx_id                    |  8 ++++----
> >  libmpathpersist/mpath_persist_int.c | 12 ++++++------
> >  libmpathutil/vector.c               | 16 ++++++++--------
> >  libmultipath/nvme/nvme-ioctl.c      |  2 +-
> >  libmultipath/prioritizers/iet.c     |  3 +++
> >  6 files changed, 29 insertions(+), 26 deletions(-)
> > 
> > -- 
> > 2.49.0

Reply via email to