### Description
If possible, I would like that the `kamailio/src/modules/app_perl/lib/perl/Kamailio.pm`
file does not generate error messages to the system log files, which are not actual errors
and are caused by `eval` blocks of third-party Perl modules that my code depends on.
To illustrate the current setup, let's consider the following:
- In file `/etc/kamailio/kamailio_52.cfg`
```perl
modparam( "app_perl", "filename",
"/opt/myprogram/perllib/MyKamailio.pm" )
```
- In file `/opt/myprogram/perllib/MyKamailio.pm`:
```perl
use Crypt::JWT qw( decode_jwt encode_jwt );
```
- It happens that `Crypt::JWT` depends on `CryptX`, which in turn needs a `JSON::XS`
implementation, which could be either `Cpanel::JSON::XS` or `JSON::XS`or `JSON::PP`, in
that order of preference. That need is resolved at runtime, as we can see in the following
code fragment taken from the file at
https://github.com/DCIT/perl-CryptX/blob/master/lib/CryptX.pm:
```perl
BEGIN {
if (eval { require Cpanel::JSON::XS }) {
Cpanel::JSON::XS->import(qw(encode_json decode_json));
$has_json = 1;
}
elsif (eval { require JSON::XS }) {
JSON::XS->import(qw(encode_json decode_json));
$has_json = 2;
}
elsif (eval { require JSON::PP }) {
JSON::PP->import(qw(encode_json decode_json));
$has_json = 3;
}
else {
$has_json = 0;
}
}
```
- In my system, `Cpanel::JSON::XS` is not installed because it is not needed. I could
install it, but unfortunately that module intermittently causes a segmentation fault, as
described in the issue report at
https://github.com/rurban/Cpanel-JSON-XS/issues/179.
### Expected behavior
I would expect two things:
- The operating system log files, like `/var/log/syslog`, adds only entries like the
following ones after restarting Kamailio:
May 25 14:30:06 myserver systemd[1]: kamailio.service: Succeeded.
May 25 14:30:06 myserver systemd[1]: Stopped Kamailio server.
May 25 14:30:06 myserver systemd[1]: Starting Kamailio server...
May 25 14:30:06 myserver systemd[1]: Started Kamailio server.
- The output of commands like `systemctl status kamailio.service` only shows informational
messages of success.
### Actual observed behavior
- The operating system log files, like `/var/log/syslog`, also adds error messages like
the following one after restarting Kamailio:
May 25 14:30:06 myserver /sbin/kamailio[1827476]: ERROR: app_perl
[kamailioxs.xs:1041]: XS_Kamailio__Message_log(): perl error: Can't locate
Cpanel/JSON/XS.pm in @INC (you may need to install the Cpanel::JSON::XS module) (@INC
contains: /opt/myprogram/perllib /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0
/usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl) at
/usr/local/lib/x86_64-linux-gnu/perl/5.30.0/CryptX.pm line 14.
- The output of commands like `systemctl status kamailio.service` adds that same error
message at its end.
### What could be changed in Kamailio?
The `kamailio/src/modules/app_perl/lib/perl/Kamailio.pm` file could ignore, or bypass, the
`__DIE__` signals coming from `eval` blocks, like this changed code fragment shows:
```perl
$SIG{'__DIE__'} = sub {
die @_ if( $^S or not defined $^S );
Kamailio::Message::log(undef, L_ERR, "perl error: $_[0]\n");
};
```
That changed is based on the following references:
- The [Override die with END or
CORE::GLOBAL::die](https://www.effectiveperlprogramming.com/2011/05/overrid…
article, which says:
There’s a Perl special variable that can help. The
documentation for die recommends that you start your `__DIE__` handler by checking `$^S`
before you continue. Inside the handler, the special handler is turned off so `die` inside
`$SIG{__DIE__}` is the real `die`. The value of `$^S` will be true if it came from within
an `eval`, so this just re-throws the exception without handling it.
- The [Perl documentation for the `$^S`
variable](https://perldoc.perl.org/perlvar#%24%5ES), which says:
Current state of the interpreter.
$^S State
--------- -------------------------------------
undef Parsing module, eval, or main program
true (1) Executing an eval
false (0) Otherwise
The first state may happen in `$SIG{__DIE__}` and
`$SIG{__WARN__}` handlers.
- The [Perl documentation for the `die`
function](https://perldoc.perl.org/functions/die),
which says:
You can arrange for a callback to be run just before
the `die` does its deed, by setting the `$SIG{__DIE__}` hook. The associated handler is
called with the exception as an argument, and can change the exception, if it sees fit, by
calling `die` again. See `"%SIG"` in perlvar for details on setting `%SIG`
entries, and `eval` for some examples. Although this feature was to be run only right
before your program was to exit, this is not currently so: the `$SIG{__DIE__}` hook is
currently called even inside `eval`ed blocks/strings! If one wants the hook to do nothing
in such situations, put
```perl
die @_ if $^S;
```
as the first line of the handler (see
"`$^S`" in perlvar). Because this promotes strange action at a distance, this
counterintuitive behavior may be fixed in a future release.
### Additional Information
* **Kamailio Version** - output of `kamailio -v`
```bash
root@myserver:~# kamailio -V
version: kamailio 5.4.3 (x86_64/linux) e19ae3
flags: USE_TCP, USE_TLS, USE_SCTP, TLS_HOOKS, USE_RAW_SOCKS, DISABLE_NAGLE, USE_MCAST,
DNS_IP_HACK, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, TLSF_MALLOC, DBG_SR_MEMORY,
USE_FUTEX, FAST_LOCK-ADAPTIVE_WAIT, USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR,
USE_DST_BLACKLIST, HAVE_RESOLV_RES, TLS_PTHREAD_MUTEX_SHARED
ADAPTIVE_WAIT_LOOPS 1024, MAX_RECV_BUFFER_SIZE 262144, MAX_URI_SIZE 1024, BUF_SIZE 65535,
DEFAULT PKG_SIZE 8MB
poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
id: e19ae3
compiled on 17:51:35 Feb 14 2021 with gcc 9.3.0
```
* **Operating System**:
```bash
root@myserver:~# uname -a
Linux myserver 5.4.0-54-generic #60-Ubuntu SMP Fri Nov 6 10:37:59 UTC 2020 x86_64 x86_64
x86_64 GNU/Linux
```
```bash
root@myserver:~# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/pr…
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
* **Perl version**:
```bash
root@myserver:~# perl -V
Summary of my perl5 (revision 5 version 30 subversion 0) configuration:
Platform:
osname=linux
osvers=4.19.0
archname=x86_64-linux-gnu-thread-multi
uname='linux localhost 4.19.0 #1 smp debian 4.19.0 x86_64 gnulinux '
config_args='-Dmksymlinks -Dusethreads -Duselargefiles -Dcc=x86_64-linux-gnu-gcc
-Dcpp=x86_64-linux-gnu-cpp -Dld=x86_64-linux-gnu-gcc -Dccflags=-DDEBIAN -Wdate-time
-D_FORTIFY_SOURCE=2 -g -O2 -fdebug-prefix-map=/build/perl-Wfb2Cd/perl-5.30.0=.
-fstack-protector-strong -Wformat -Werror=format-security -Dldflags=
-Wl,-Bsymbolic-functions -Wl,-z,relro -Dlddlflags=-shared -Wl,-Bsymbolic-functions
-Wl,-z,relro -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.30 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.30
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.30 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.30.0
-Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.30.0 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -Ui_libutil
-Ui_xlocale -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -dEs -Duseshrplib
-Dlibperl=libperl.so.5.30.0'
hint=recommended
useposix=true
d_sigaction=define
useithreads=define
usemultiplicity=define
use64bitint=define
use64bitall=define
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
bincompat5005=undef
Compiler:
cc='x86_64-linux-gnu-gcc'
ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe
-I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
optimize='-O2 -g'
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe
-I/usr/local/include'
ccversion=''
gccversion='9.3.0'
gccosandvers=''
intsize=4
longsize=8
ptrsize=8
doublesize=8
byteorder=12345678
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=16
longdblkind=3
ivtype='long'
ivsize=8
nvtype='double'
nvsize=8
Off_t='off_t'
lseeksize=8
alignbytes=8
prototype=define
Linker and Libraries:
ld='x86_64-linux-gnu-gcc'
ldflags =' -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu
/lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=libc-2.31.so
so=so
useshrplib=true
libperl=libperl.so.5.30
gnulibc_version='2.31'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E'
cccdlflags='-fPIC'
lddlflags='-shared -L/usr/local/lib -fstack-protector-strong'
Characteristics of this binary (from libperl):
Compile-time options:
HAS_TIMES
MULTIPLICITY
PERLIO_LAYERS
PERL_COPY_ON_WRITE
PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT
PERL_MALLOC_WRAP
PERL_OP_PARENT
PERL_PRESERVE_IVUV
USE_64_BIT_ALL
USE_64_BIT_INT
USE_ITHREADS
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_COLLATE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_PERLIO
USE_PERL_ATOF
USE_REENTRANT_API
USE_THREAD_SAFE_LOCALE
Locally applied patches:
DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules
installed from CPAN.
DEBPKG:debian/db_file_ver -
https://bugs.debian.org/340047 Remove overly restrictive
DB_File version check.
DEBPKG:debian/doc_info - Replace generic man(1) instructions with Debian-specific
information.
DEBPKG:debian/enc2xs_inc -
https://bugs.debian.org/290336 Tweak enc2xs to follow
symlinks and ignore missing @INC directories.
DEBPKG:debian/errno_ver -
https://bugs.debian.org/343351 Remove Errno version check
due to upgrade problems with long-running processes.
DEBPKG:debian/libperl_embed_doc -
https://bugs.debian.org/186778 Note that libperl-dev
package is required for embedded linking
DEBPKG:fixes/respect_umask - Respect umask during installation
DEBPKG:debian/writable_site_dirs - Set umask approproately for site install
directories
DEBPKG:debian/extutils_set_libperl_path - EU:MM: set location of libperl.a under
/usr/lib
DEBPKG:debian/no_packlist_perllocal - Don't install .packlist or perllocal.pod for
perl or vendor
DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets.
DEBPKG:debian/instmodsh_doc - Debian policy doesn't install .packlist files for
core or vendor.
DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian
policy.
DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr
may not be writable.
DEBPKG:debian/perlivp -
https://bugs.debian.org/510895 Make perlivp skip include
directories in /usr/local
DEBPKG:debian/squelch-locale-warnings -
https://bugs.debian.org/508764 Squelch locale
warnings in Debian package maintainer scripts
DEBPKG:debian/patchlevel -
https://bugs.debian.org/567489 List packaged patches for
5.30.0-9ubuntu0.2 in patchlevel.h
DEBPKG:fixes/document_makemaker_ccflags -
https://bugs.debian.org/628522 [
rt.cpan.org
#68613] Document that CCFLAGS should include $Config{ccflags}
DEBPKG:debian/find_html2text -
https://bugs.debian.org/640479 Configure
CPAN::Distribution with correct name of html2text
DEBPKG:debian/perl5db-x-terminal-emulator.patch -
https://bugs.debian.org/668490
Invoke x-terminal-emulator rather than xterm in perl5db.pl
DEBPKG:debian/cpan-missing-site-dirs -
https://bugs.debian.org/688842 Fix
CPAN::FirstTime defaults with nonexisting site dirs if a parent is writable
DEBPKG:fixes/memoize_storable_nstore - [
rt.cpan.org #77790]
https://bugs.debian.org/587650 Memoize::Storable: respect 'nstore' option not
respected
DEBPKG:debian/makemaker-pasthru -
https://bugs.debian.org/758471 Pass LD settings
through to subdirectories
DEBPKG:debian/makemaker-manext -
https://bugs.debian.org/247370 Make EU::MakeMaker
honour MANnEXT settings in generated manpage headers
DEBPKG:debian/kfreebsd-softupdates -
https://bugs.debian.org/796798 Work around Debian
Bug#796798
DEBPKG:fixes/autodie-scope -
https://bugs.debian.org/798096 Fix a scoping issue with
"no autodie" and the "system" sub
DEBPKG:fixes/memoize-pod - [
rt.cpan.org #89441] Fix POD errors in Memoize
DEBPKG:debian/hurd-softupdates -
https://bugs.debian.org/822735 Fix t/op/stat.t
failures on hurd
DEBPKG:fixes/math_complex_doc_great_circle -
https://bugs.debian.org/697567
[
rt.cpan.org #114104] Math::Trig: clarify definition of great_circle_midpoint
DEBPKG:fixes/math_complex_doc_see_also -
https://bugs.debian.org/697568 [
rt.cpan.org
#114105] Math::Trig: add missing SEE ALSO
DEBPKG:fixes/math_complex_doc_angle_units -
https://bugs.debian.org/731505
[
rt.cpan.org #114106] Math::Trig: document angle units
DEBPKG:fixes/cpan_web_link -
https://bugs.debian.org/367291 CPAN: Add link to main
CPAN web site
DEBPKG:debian/hppa_op_optimize_workaround -
https://bugs.debian.org/838613 Temporarily
lower the optimization of op.c on hppa due to gcc-6 problems
DEBPKG:debian/installman-utf8 -
https://bugs.debian.org/840211 Generate man pages with
UTF-8 characters
DEBPKG:fixes/getopt-long-4 -
https://bugs.debian.org/864544 [
rt.cpan.org #122068] Fix
issue #122068.
DEBPKG:debian/hppa_opmini_optimize_workaround -
https://bugs.debian.org/869122 Lower
the optimization level of opmini.c on hppa
DEBPKG:debian/sh4_op_optimize_workaround -
https://bugs.debian.org/869373 Also lower
the optimization level of op.c and opmini.c on sh4
DEBPKG:debian/perldoc-pager -
https://bugs.debian.org/870340 [
rt.cpan.org #120229] Fix
perldoc terminal escapes when sensible-pager is less
DEBPKG:debian/prune_libs -
https://bugs.debian.org/128355 Prune the list of libraries
wanted to what we actually need.
DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
DEBPKG:debian/configure-regen -
https://bugs.debian.org/762638 Regenerate Configure et
al. after probe unit changes
DEBPKG:debian/deprecate-with-apt -
https://bugs.debian.org/747628 Point users to
Debian packages of deprecated core modules
DEBPKG:debian/disable-stack-check -
https://bugs.debian.org/902779 [perl #133327]
Disable debugperl stack extension checks for binary compatibility with perl
DEBPKG:fixes/eumm-usrmerge -
https://bugs.debian.org/913637 Avoid mangling /bin
non-perl shebangs on merged-/usr systems
DEBPKG:debian/perlbug-editor -
https://bugs.debian.org/922609 Use "editor"
as the default perlbug editor, as per Debian policy
DEBPKG:fixes/gid-parsing - [79e302e]
https://bugs.debian.org/941985 [perl #134169]
(perl #134169) mg.c reset endptr after use
DEBPKG:fixes/CVE-2020-10543.patch - [PATCH v530 1/4] regcomp.c: Prevent integer
overflow from nested regex quantifiers.
DEBPKG:fixes/CVE-2020-10878-1.patch - [PATCH v530 2/4] study_chunk: extract
rck_elide_nothing
DEBPKG:fixes/CVE-2020-10878-2.patch - [PATCH v530 3/4] regcomp: use long jumps if
there is any possibility of overflow
DEBPKG:fixes/CVE-2020-12723.patch - [PATCH v530 4/4] study_chunk: avoid mutating
regexp program within GOSUB
Built under linux
Compiled at Oct 19 2020 10:56:54
@INC:
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.30.0
/usr/local/share/perl/5.30.0
/usr/lib/x86_64-linux-gnu/perl5/5.30
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.30
/usr/share/perl/5.30
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base
```
Please evaluate the situation and let me know your feedback and what I could help with.
Thanks in advance for your time and attention.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/kamailio/kamailio/issues/2745