gpgme static analysis findings

Michal Hlavinka via Gnupg-devel <[email protected]>
Newsgroups gmane.comp.encryption.gpg.devel
Message-ID <[email protected]>
Hi,

we've started to run static analysis on some system components including 
gpgme where the scanner reported a few issues:


1) in src/engine.c
"""
"Error: OVERRUN (CWE-119):
src/engine.c:121: cond_between: Checking ""proto > 7UL"" implies that 
""proto"" is between 0 and 7 (inclusive) on the false branch.
src/engine.c:125: overrun-local: Overrunning array ""engine_ops"" of 7 
8-byte elements at element index 7 (byte offset 63) using index 
""proto"" (which evaluates to 7).
#  123|
#  124|     if (engine_ops[proto] && engine_ops[proto]->get_req_version)
#  125|->     return (*engine_ops[proto]->get_req_version) ();
#  126|     else
#  127|       return NULL;"
"""

121:   if (proto > DIM (engine_ops))

this checks if 'proto' is bigger than number of elements in engine_ops

DIM is defined in util.h:
44: #define DIM(v) (sizeof(v)/sizeof((v)[0]))

the above condition allows for proto = DIM(engine_ops)
which later at:
125:    return (*engine_ops[proto]->get_req_version) ();
allows to access (proto+1)th element

seems that the condition should actually be proto >= DIM(engine_ops)

the same condition check is present several times:
at engine_get_file_name (...) line 76,
at engine_get_home_dir (...) line 90,
at engine_get_version (...) line 106,
at engine_get_req_version (...) line 121,
at _gpgme_set_engine_info (...) line 406





2) in src/gpgme-tool.c
simple list assignment as used at gt_get_keylist_mode () does not 
prevent out of bound access.

"""
Error: OVERRUN (CWE-119):
src/gpgme-tool.c:1445: assignment: Assigning: ""idx"" = ""0"".
src/gpgme-tool.c:1449: incr: Incrementing ""idx"". The value of ""idx"" 
is now 1.
src/gpgme-tool.c:1451: incr: Incrementing ""idx"". The value of ""idx"" 
is now 2.
src/gpgme-tool.c:1453: incr: Incrementing ""idx"". The value of ""idx"" 
is now 3.
src/gpgme-tool.c:1455: incr: Incrementing ""idx"". The value of ""idx"" 
is now 4.
src/gpgme-tool.c:1457: incr: Incrementing ""idx"". The value of ""idx"" 
is now 5.
src/gpgme-tool.c:1459: incr: Incrementing ""idx"". The value of ""idx"" 
is now 6.
src/gpgme-tool.c:1461: incr: Incrementing ""idx"". The value of ""idx"" 
is now 7.
src/gpgme-tool.c:1463: incr: Incrementing ""idx"". The value of ""idx"" 
is now 8.
src/gpgme-tool.c:1464: overrun-local: Overrunning array ""modes"" of 7 
8-byte elements at element index 8 (byte offset 71) using index 
""idx++"" (which evaluates to 8).
# 1462|     if (mode & GPGME_KEYLIST_MODE_FORCE_EXTERN)
# 1463|       modes[idx++] = ""force_extern"";
# 1464|->   modes[idx++] = NULL;
# 1465|
# 1466|     gt_write_status (gt, STATUS_KEYLIST_MODE, modes[0], 
modes[1], modes[2],
"""


Let me know if you need more information.

Cheers,
Michal Hlavinka
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.