The former respects the `--atexit=no` from Kamailio command line.

See note on `atexit` in TLS module "Overview".

<!-- Kamailio Pull Request Template -->

<!--
IMPORTANT:
  - for detailed contributing guidelines, read:
    https://github.com/kamailio/kamailio/blob/master/.github/CONTRIBUTING.md
  - pull requests must be done to master branch, unless they are backports
    of fixes from master branch to a stable branch
  - backports to stable branches must be done with 'git cherry-pick -x 
...'
  - code is contributed under BSD for core and main components (tm, sl, auth, 
tls)
  - code is contributed GPLv2 or a compatible license for the other components
  - GPL code is contributed with OpenSSL licensing exception
-->

#### Pre-Submission Checklist
<!-- Go over all points below, and after creating the PR, tick all the 
checkboxes that apply -->
<!-- All points should be verified, otherwise, read the CONTRIBUTING 
guidelines from above-->
<!-- If you're unsure about any of these, don't hesitate to ask on 
sr-dev mailing list -->
- [x] Commit message has the format required by CONTRIBUTING guide
- [x] Commits are split per component (core, individual modules, libs, utils, 
...)
- [x] Each component has a single commit (if not, squash them into one commit)
- [x] No commits to README files for modules (changes must be done to docbook 
files
in `doc/` subfolder, the README file is autogenerated)

#### Type Of Change
- [x] Small bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds new functionality)
- [ ] Breaking change (fix or feature that would change existing functionality)

#### Checklist:
<!-- Go over all points below, and after creating the PR, tick the 
checkboxes that apply -->
- [ ] PR should be backported to stable branches
- [ ] Tested changes locally
- [ ] Related to issue #XXXX (replace XXXX with an open issue number)

#### Description
<!-- Describe your changes in detail -->

I'm using `tls` module along with some other modules. On Kamailio 
termination there are a lot of "freeing already freed pointer" 
messages from `qm_free()`. Also there may be a corrupted memory report 
(followed by `abort()`) from `qm_debug_check_frag()`.

I'm aware of `--atexit=no` required for `tls`, and Kamailio is indeed 
started as `kamailio --atexit=no -m 16 -n 1 -w . -f some.cfg`.

The `tls` module is loaded and configured something like this:

```
disable_core_dump=no

debug=2
memdbg=2
# mem_safety=0

enable_tls=yes
listen=tls:127.0.0.1:5060

mpath="lib64/kamailio/modules"

loadmodule "tls.so"
modparam("tls", "init_mode", 1)
modparam("tls", "config", "tls.cfg");

loadmodule "snmpstats.so"
modparam("snmpstats", "sipEntityType", 
"proxyServer")
modparam("snmpstats", "snmpgetPath",  "/usr/bin/")
modparam("snmpstats", "snmpCommunity", 
"MySNMPComunity")
modparam("snmpstats", "snmpVersion", "2c")

loadmodule "xlog.so"

route {
  xlog("L_NOTICE", "Hello\n");
}
```

Running Kamailio and then stopping it with `SIGTERM` yields the following.

Some blocks of shared memory are allocated by the main process (PID 62575). 
E.g., one of the blocks:
```
 0(62575) INFO: <core> [core/mem/q_malloc.c:429]: qm_malloc(): 
qm_malloc(0x7facc5dc0000, 8) returns address 0x7facc5e55810 frag. 
0x7facc5e557d8 (size=8) on 1 -th hit
```

On termination, this address is freed by another process (PID 62583). Somewhere 
after "sig_usr(): signal 15 received" message there's the 
following entry in the log:
```
 5(62583) INFO: <core> [core/mem/q_malloc.c:495]: qm_free(): 
qm_free(0x7facc5dc0000, 0x7facc5e55810), called from tls: tls_init.c: 
ser_free(400)
```

Then later the same address is freed again, by the main process (PID 62575). 
That's due to explicit call to `OPENSSL_cleanup()` from 
`tls_h_mod_destroy_f()` in `tls` module:
```
 0(62575) INFO: tls [tls_init.c:1063]: tls_h_mod_destroy_f(): executing openssl 
v1.1+ cleanup
 0(62575) INFO: <core> [core/mem/q_malloc.c:495]: qm_free(): 
qm_free(0x7facc5dc0000, 0x7facc5e55810), called from tls: tls_init.c: 
ser_free(400)
 0(62575) CRITICAL: <core> [core/mem/q_malloc.c:535]: qm_free(): BUG: 
freeing already freed pointer (0x7facc5e55810), called from tls: tls_init.c: 
ser_free(400), first free tls: tls_init.c: ser_free(400) - ignoring
```

It depends on initial conditions (which modules are loaded, what is the 
configuration, etc.), but sometimes `qm_debug_check_frag()` detects memory 
corruption and calls `abort()`:
```
 0(62575) CRITICAL: <core> [core/mem/q_malloc.c:126]: 
qm_debug_check_frag(): BUG: qm: fragm. 0x7facc5e891e0 (address 0x7facc5e89218) 
beginning overwritten (7facc5e85498)! Memory allocator was called from tls: 
tls_init.c:400. Fragment marked by :140376711102467. Exec from 
core/mem/q_malloc.c:526.
```

The output of `kamcmd core.ps` suggests that the offending process (PID 62583) 
is related to SNMP:
```
62575
main process - attendant
…
62583
SNMP AgentX
```

The "SNMP AgentX" process in `snmpstats` overrides some signal 
handlers (including the `SIGTERM` one) and calls `exit()`:

```
/*! Creates a child that will become the AgentX sub-agent.  The child will
 * insulate itself from the rest of Kamailio by overriding most of signal
 * handlers. */
void agentx_child(int rank)
{
        …

        /* Setup a SIGTERM handler */
        sigfillset(&new_sigterm_handler.sa_mask);
        new_sigterm_handler.sa_flags = 0;
        new_sigterm_handler.sa_handler = sigterm_handler;
        sigaction(SIGTERM, &new_sigterm_handler, NULL);

        …
}
```
```
static void sigterm_handler(int signal)
{
        /* Just exit.  The master agent will clean everything up for us */
        exit(0);
}
```

Looks like this `exit()` triggers an extra call to `OPENSSL_cleanup`, 
implicitly armed by OpenSSL itself on startup. So, the OpenSSL cleanup gets 
called twice.

As for now I've fixed the issue by replacing this `exit(0)` with 
`ksr_exit(0)` which respects the `--atexit=no` command line option. But I 
wonder is it a right way to do it.

As far as I can see, code in `src/modules/` ignores `ksr_exit()` and uses plain 
`exit()`. Is it for a reason? Shouldn't modules also exit with `ksr_exit`?

You can view, comment on, or merge this pull request online at:

  https://github.com/kamailio/kamailio/pull/3993

-- Commit Summary --

  * modules/snmpstats: exit with ksr_exit() instead of standard exit()

-- File Changes --

    M src/modules/snmpstats/snmpstats.c (5)
    M src/modules/snmpstats/sub_agent.c (5)

-- Patch Links --

https://github.com/kamailio/kamailio/pull/3993.patch
https://github.com/kamailio/kamailio/pull/3993.diff

-- 
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/pull/3993
You are receiving this because you are subscribed to this thread.

Message ID: <kamailio/kamailio/pull/3...@github.com>
_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org

Reply via email to