This was probably intended as a helper to facilitate reference counted
pointers, but this isn't used anywhere, and the only "allocator" in use
is the default wrapper around `delete`. If reference counted pointers
are ever relevant, they can be done using a shared_ptr.
Change-Id: I2adb561b76efcaf5fb119939f25a7c2438196a5b
Obviously the intent was to have reference-counted pointers as table
value, but this isn't used anywhere, and anyway would be better
implemented using a shared_ptr.
Change-Id: I4df6e874d402d615f654f3a8df3195fe6dda46bb
Cover the whole conditioning with the lock,
because otherwise two threads competing on execution
can suddenly come across the `(m_playout_type != type)` getting
true (for both) and one of them by acquiring the lock can potentially
manage to modify that, what can actually make `(m_playout_type != type)`
not true anymore for the other thread in race condition here.
Change-Id: Ie352da10a515837efc696063837b70dc2c9a304d
Refactor it so, that it's not possible to go over what
`unsigned long` offers (so 4,294,967,295).
We are accumulating read bytes there, which can potentially
be more than proposed 4,3Gb, for that case check out if
the possible end result will overflow and close connection
if this is likely to happen.
Change-Id: I4e758292e77649ddfbcaaa7f8dc9f133e74c4600
Make it quasi infinite, on cases with wrong
read of config parameter `cps_limit`,
so that if int has undefined value it doesn't
suddenly cause undefined behavior of the license
limitation agent.
Change-Id: If1ca5442135793929eb96d47642ea4314cd82803
Before using the `clock_rate` or `payload_type`
always initialize, because might be used non-defined,
which will give whatever value.
Fixes:
Uninitialized scalar variable (UNINIT)
35. uninit_use_in_call: Using uninitialized
value (int)clock_rate when calling SdpPayload.
Change-Id: Ie7cea4289ace93a169ad2dce8a402b9a469c65f8
The memory referenced via it could have been freed already
(by the `update_uac_request()`). Set the original pointer to NULL
and check in the caller's function if it has been assigned to NULL
before actually using.
Fixes:
Read from pointer after free (USE_AFTER_FREE)
41. deref_after_free: Dereferencing freed pointer p_msg.
Change-Id: I07ee9360f996c8723ba46c99f512ef9562ff75c3
To be able to set msg's ptr to NULL in the `update_uac_request()`
after the memory referenced via it is freed.
Change-Id: Id8d89a6a64b78e5fd06d43e0b99aaf83c4623908
Create the unique pointer based on the AmSession raw
pointer right away and assign, instead of doing
separately the declaration and initialization.
Change-Id: I71cd7084ae03768431b1eded130b0c70d58db78b
To make the Coverity Scan happy and also
make the code a bit more excplicit in terms of
managing the ownership over the session in
(`startSessionUAS()` and `startSessionUAC()`)
just add a code commentary describing what's going on.
Change-Id: I6383c50bf99cbacc29cd77085b787c51bdbee039
startSessionUAC():
Move the session smart pointer into the try statement,
on the same manner as done in `startSessionUAS()`.
Change-Id: I34d9176fd9c740614f822083b4a3f2dcde53b0f8
Make it using spaces, instead of the EMACS based
tabulation/space combination, which makes it
messy for modern IDEs.
Change-Id: I44b632a5a3a5451bee58726370d907e3634ea709
When building up the AmSession and assigning
the app parameters to it, do the move operation
instead of copying.
Fixes defect:
569 // ... and do nothing !
570
571 DBG("onInvite/onRefer returned NULL\n");
572 }
573 else {
574 // save session parameters
>>> CID 550234: Performance inefficiencies (COPY_INSTEAD_OF_MOVE)
>>> "app_params" is copied in call to copy assignment for class
"std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > > > >", when it could be moved instead.
575 session->app_params = app_params;
576 }
577
578 return session;
579 }
580
Change-Id: I3502a4c36ab6ef24fe53d57e2d5fb01777232b2b
We are now ready to use the default constructors and assignment
operators. Add move semantics as well.
Change-Id: I89738bff6498979ff9df6bfe1f9489568c4564cf
Directly contain the ValueArray in the variant instead of manually
managing a pointer. Requires updating the return type of some const
functions to also be const, which in turn requires some of their users
to have the type const qualified as well.
Change-Id: I2ec31d659eef521a3f68d642ee431b5c38f27fdf
Update the AmArg argument to const as these functions never change it,
and it may come from a const source. (The `string` counterpart in the
other overload is already const qualified.)
Change-Id: I1e527425a70e0c6468b8b59de7e4a20fa1f5c218
We still have raw pointers in the variant and so we need to deal with
copying the contained objects ourselves.
Change-Id: I0e5f1b56430ffeda9d34ede30ec87cfd45a61662
This doesn't yet do much in terms of memory management as it still uses
pointers for arrays and structs, but it does move management of strings
and blobs into the variant. Further refactoring will bring the full
benefits.
Add specialised == operator to avoid implicit conversions to temporary
AmArg.
Includes white space cleanups.
Change-Id: I1e4bce6b96c2187294044f9f2a30fa7013912139
Add missing initialisers and fix order.
In some cases the member was actually unused and could just be removed.
Change-Id: I0f0c927eb8271c35dcfd371f225847f62bea2812
Warned-by: Coverity
These are all instances of an object being put into a container just
before it goes out of scope. Use move semantics to avoid copying.
Change-Id: I9c40a56c4a67df2b8e244d51f068b50ec286f5bf
Warned-by: Coverity
Otherwise we can end up with:
Program terminated with signal SIGSEGV, Segmentation fault.
104 ./core/AmSession.cpp: No such file or directory.
[Current thread is 1 (Thread 0x7fc7dd677e40 (LWP 176249))]
Change-Id: Ia61de0caa9b1764839c740e62bc3f463da4ed4dc
Introduce `ILOG_SDLG()` call-id logging based on
specific getter provided to the macro func as a param.
This is required for those implementations,
where there is no within-file common dialog id getter.
Change-Id: I90501a0da32c7b8075e181796cf4c7c3f980e81e
Make the way we get call-id when calling ILOG_DLG()
file specific, which allows to define locally
(within a target file) how to get the call-id value.
Change-Id: I4af87edf9d1ea52d9678b3354bc797cf1f5f0b54
A fix-up for 3745ff0778d6a55.
This must fix:
Program terminated with signal SIGSEGV, Segmentation fault.
"*\302\3242R \204\vg\266f9\356\277[\252\336J\205\371\020Ŵ\313ٛ\v\231\214\360\355\243\034g\022\001\n\025")
at ./core/sip/sip_parser_async.cpp:205
205 ./core/sip/sip_parser_async.cpp: No such file or directory.
[Current thread is 1 (Thread 0x7f80c07ea6c0 (LWP 3928994))]
(gdb) bt full
"*\302\3242R \204\vg\266f9\356\277[\252\336J\205\371\020Ŵ\313ٛ\v\231\214\360\355\243\034g\022\001\n\025")
at ./core/sip/sip_parser_async.cpp:205
err = 0
c = @0x7f807c001390: 0x7f807c00140e "*\302\3242R \204\vg\266f9\356\277[\252\336J\205\371\020Ŵ\313ٛ\v\231\214\360\355\243\034g\022\001\n\025"
st = @0x7f807c0013a4: 102
saved_st = @0x7f807c0013a8: 0
hdr = 0x0
Change-Id: Icde152783b9dc5a68dde9d29f96d1d87b36e0671
In some cases it can happen that ::join() is called from multiple
threads at the same time. Checking the ::joinable() flag is not
race-free and so is unreliable to make sure that only one other thread
attempts to join at any given time. Add a mutex and a state variable to
make sure only one thread attempts to join, and make any other threads
wait.
Change-Id: I02fd236a416b035c98642535f1521be4a3a63fd9
Fall through so that the shutdown flag gets set and so that the SIP
control sockets get shut down.
Change-Id: I205db4c7aa72dd9576f42b0d9bc2ec4960fd5415
On shutdown, call shutdown() in the socket, so that a thread blocked in
recv() wakes up and gets a chance to exit cleanly.
Change-Id: I24b1b7c608ec1307019b424becef31e8db02e7bb
Zero is a valid file descriptor. Anything that's not -1 can in fact be a
valid file descriptor.
Make sure `sd` is set to -1 whenever no socket is open.
Add dtor to socket class to close the socket if it's open.
Add a few related formatting fixes as well.
Change-Id: Id9d3ad74b986c82ac6ab698a1e8f1f38e0f92414
Classes that inherit from both AmThread and AmEventHandler must inherit
from AmEventQueue first and from AmThread after. This is needed so that
the AmThread dtor is called first, which will trigger the thread to shut
down, which in turn makes sure nothing is waiting on the AmEventQueue's
condition variable.
Otherwise, if AmEventQueue is destroyed first while the corresponding
thread is still running and waiting on the condition variable, it will
be a deadlock.
With this, sems finally can shut down cleanly without having to be
killed by systemd.
Change-Id: I914455763b517c96561acb0b64fce26f127f44bc
Request a thread shutdown in the dtor in case the thread is still
running. Prevents destruction of std::thread with an active thread.
Change-Id: I51c4a43cf8d6402f4a690add936c95c2f700129d
Provide a single place for a running thread to check if it ought to shut
down. Use it in AmThreadWatcher.
Change-Id: I206111b34e3c658f0c2ce55627274b463b1e98d5
Use a std::list instead of a std::queue so that we can use iterators,
which allows us to delete elements directly without having to rebuild a
new queue with every loop iteration. This eliminates the n_thread_queue
and the swap.
Eliminate the wait condition _run_cond. This is only woken up when a
thread is added, which we don't care about. We only care when a thread
finishes, and there is no condition for that.
Use a lock guard. With this we can make sure the lock is in a consistent
state in case of an exception. Still catch and report exceptions.
Remove stub methods.
Change-Id: I59903f6a03863e5c106631e3db8706109915c8fb
Use an atomic enum to track state: idle, running, stopping, or stopped.
Use atomic compare and exchange to ensure consistency without requiring
a mutex.
Never detach threads. Always require a join. This makes for an easy and
reliable way to wait for a thread to finish.
Provide a default on_stop so that it can be omitted in child classes.
Change-Id: Id59942638b7f769090ac91c2049b7d934e876ffc