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).

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