On 32 bit systems I noticed the following warnings when compiling which I think 
indicate that 32 bit systems can crash with an illegal memory access:

-------------------------------------------------------

ucontact.c: In function ‘ucontact_coords_cmp’:
ucontact.c:1036:6: warning: cast to pointer from integer of different size 
[-Wint-to-pointer-cast]
  a = (ucontact_sip_coords *)_a;
      ^
ucontact.c:1037:6: warning: cast to pointer from integer of different size 
[-Wint-to-pointer-cast]
  b = (ucontact_sip_coords *)_b;
      ^
In file included from ../../resolve.h:45,
                 from ../../proxy.h:75,
                 from ucontact.h:44,
                 from ucontact.c:34:
ucontact.c: In function ‘free_ucontact_coords’:
ucontact.c:1049:12: warning: cast to pointer from integer of different size 
[-Wint-to-pointer-cast]
   shm_free((ucontact_sip_coords *)coords);
            ^
../../mem/shm_mem.h:513:38: note: in definition of macro ‘shm_free’
 #define shm_free( _ptr ) _shm_free( (_ptr), \
                                      ^~~~

dlist.c: In function ‘delete_ucontact_from_coords’:
dlist.c:1216:34: warning: cast to pointer from integer of different size 
[-Wint-to-pointer-cast]
   if (cdb_delete_ucontact_coords((ucontact_sip_coords *)ct_coords)) {
                                  ^
-------------------------------------------------------

The variables in question are of type ucontact_coords which is a 64 bit 
integer. Whenever that type is cast into a pointer it will be truncated to 32 
bits on 32 bit platforms which can result in illegal memory access. I have not 
yet run opensips on a 32 bit system, but I noticed these while compiling it.


Next I got this warning when compiling on both 32 and 64 bit systems:

32 bit warning:
-------------------------------------------------------------

In file included from /usr/include/string.h:494,
                 from /usr/include/i386-linux-gnu/sys/un.h:37,
                 from timeout_process.c:27:
In function ‘memcpy’,
    inlined from ‘sockaddr2ip_addr’ at ../../parser/../ip_addr.h:212:4,
    inlined from ‘timeout_listener_process’ at timeout_process.c:248:6:
/usr/include/i386-linux-gnu/bits/string_fortified.h:34:10: warning: 
‘__builtin_memcpy’ forming offset [17, 24] is ou
t of the bounds [0, 16] of object ‘rtpp_info’ with type ‘struct sockaddr’ 
[-Warray-bounds]
   return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
timeout_process.c: In function ‘timeout_listener_process’:
timeout_process.c:76:18: note: ‘rtpp_info’ declared here
  struct sockaddr rtpp_info;
                  ^~~~~~~~~
timeout_process.c:235:8: warning: ‘__builtin_memcmp_eq’ reading 16 bytes from a 
region of size 8 [-Wstringop-overflow=]
        memcmp(rtpp_lst->addr, s_in6->sin6_addr.s6_addr, 16) == 0)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-------------------------------------------------------------


64 bit warning:
-------------------------------------------------------------

timeout_process.c: In function ‘timeout_listener_process’:
timeout_process.c:235:8: warning: ‘__builtin_memcmp_eq’ reading 16 bytes from a 
region of size 8 [-Wstringop-overflow=]
        memcmp(rtpp_lst->addr, s_in6->sin6_addr.s6_addr, 16) == 0)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-------------------------------------------------------------

which also seems to indicate accessing memory out of bounds.

The next warnings I only noticed when compiling on 64 bit. Not sure why they do 
not show up on 32 bit, if the problem depends on architecture or is caused by 
the slight difference in compilers (I used gcc 8.2.0 on 32 bit and gcc 8.3.0 on 
64 bit):

-------------------------------------------------------------

libsms_getsms.c: In function ‘splitascii.isra.1’:
libsms_getsms.c:286:2: warning: ‘strncpy’ specified bound 500 equals 
destination size [-Wstringop-truncation]
  strncpy(sms->ascii,start,sizeof(sms->ascii));
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libsms_getsms.c:302:2: warning: ‘strncpy’ specified bound 31 equals destination 
size [-Wstringop-truncation]
  strncpy(sms->sender,start,sizeof(sms->sender));
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libsms_getsms.c:316:3: warning: ‘strncpy’ specified bound 64 equals destination 
size [-Wstringop-truncation]
   strncpy(sms->name,start,sizeof(sms->name));
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


esl/src/esl.c: In function ‘esl_recv_event’:
esl/src/esl.c:1406:4: warning: ‘strncpy’ specified bound 1024 equals 
destination size [-Wstringop-truncation]
    strncpy(handle->last_reply, hval, sizeof(handle->last_reply));
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In function ‘esl_send_recv_timed.part.6’,
    inlined from ‘esl_send_recv_timed’ at esl/src/esl.c:1537:27:
esl/src/esl.c:1604:5: warning: ‘strncpy’ specified bound 1024 equals 
destination size [-Wstringop-truncation]
     strncpy(handle->last_sr_reply, hval, sizeof(handle->last_sr_reply));
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In file included from esl/src/esl_config.c:34:
esl/src/esl_config.c: In function ‘esl_config_open_file’:
esl/src/include/esl.h:43:37: warning: ‘strncpy’ output may be truncated copying 
511 bytes from a string of length 1023 [-Wstringop-truncation]
 #define esl_copy_string(_x, _y, _z) strncpy(_x, _y, _z - 1)
                                     ^~~~~~~~~~~~~~~~~~~~~~~
esl/src/include/esl.h:44:32: note: in expansion of macro ‘esl_copy_string’
 #define esl_set_string(_x, _y) esl_copy_string(_x, _y, sizeof(_x))
                                ^~~~~~~~~~~~~~~
esl/src/esl_config.c:72:4: note: in expansion of macro ‘esl_set_string’
    esl_set_string(cfg->path, path);
    ^~~~~~~~~~~~~~


xjab_wlist.c: In function ‘xj_wlist_set_aliases’:
xjab_wlist.c:473:3: warning: ‘strncpy’ output truncated before terminating nul 
copying as many bytes from a string as its length [-Wstringop-truncation]
   strncpy(p0, pa, i);
   ^~~~~~~~~~~~~~~~~~
xjab_wlist.c:455:34: note: length computed here
   i = jwl->aliases->proxy->len = strlen(pa);
                                  ^~~~~~~~~~


iniparser.c: In function ‘iniparser_add_entry’:
iniparser.c:568:4: warning: ‘strncpy’ specified bound depends on the length of 
the source argument [-Wstringop-overflow=]
    strncpy(longkey, sec, len + 1);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
iniparser.c:565:17: note: length computed here
    size_t len = strlen(sec);
                 ^~~~~~~~~~~


rest_methods.c: In function ‘trace_rest_request_cb’:
rest_methods.c:142:4: warning: ‘strncpy’ specified bound 46 equals destination 
size [-Wstringop-truncation]
    strncpy( tparam->local_ip, ip, INET6_ADDRSTRLEN);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rest_methods.c:152:4: warning: ‘strncpy’ specified bound 46 equals destination 
size [-Wstringop-truncation]
    strncpy( tparam->remote_ip, ip, INET6_ADDRSTRLEN);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


opensipsunix.c: In function ‘main’:
opensipsunix.c:93:2: warning: ‘strncpy’ output truncated before terminating nul 
copying as many bytes from a string as its length [-Wstringop-truncation]
  strncpy(from.sun_path, name, strlen(name));
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


bdb_recover.c: In function ‘extract_key’:
bdb_recover.c:487:2: warning: ‘strncpy’ output truncated before terminating nul 
copying as many bytes from a string as its length [-Wstringop-truncation]
  strncpy(buf, d, len);
  ^~~~~~~~~~~~~~~~~~~~
bdb_recover.c:486:8: note: length computed here
  len = strlen(d);
        ^~~~~~~~~
bdb_recover.c:498:5: warning: ‘strncpy’ output truncated before terminating nul 
copying as many bytes from a string as its length [-Wstringop-truncation]
     strncpy(p, s, len);
     ^~~~~~~~~~~~~~~~~~
bdb_recover.c:493:9: note: length computed here
   len = strlen(s);
         ^~~~~~~~~
bdb_recover.c: In function ‘create_table’:
bdb_recover.c:795:2: warning: ‘strncpy’ specified bound depends on the length 
of the source argument [-Wstringop-overflow=]
  strncpy(tp->name, _s, i);
  ^~~~~~~~~~~~~~~~~~~~~~~~
bdb_recover.c:793:4: note: length computed here
  i=strlen(_s)+1;
    ^~~~~~~~~~

-------------------------------------------------------------

--
Dan





_______________________________________________
Devel mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel

Reply via email to