[Live-devel] Valgrind uninitialised values inside live555

Костромин Дмитрий Андреевич kostromin at bolid.ru
Wed Aug 18 02:51:40 PDT 2021


18.08.2021 10:12, Ross Finlayson пишет:
>> On Aug 17, 2021, at 11:25 PM, Ulrich Teichert <ulrich.teichert at luminator.com> wrote:
>>
>> In setPortNum, testAddr.ss_family is read to find out if an IP4 or IP6 address is being
>> dealt with:
> Yes, and this was fixed in the most recent release (2021.08.17) of the code.
>
>
> Ross Finlayson
> Live Networks, Inc.
> http://www.live555.com/
>
>
> _______________________________________________
> live-devel mailing list
> live-devel at lists.live555.com
> http://lists.live555.com/mailman/listinfo/live-devel

Now i builded version release (2021.08.17) - but some leaks still 
persists. See log below


==115264== Thread 23:
==115264== Conditional jump or move depends on uninitialised value(s)
==115264==    at 0x6507BD7: readSocket(UsageEnvironment&, int, unsigned 
char*, unsigned int, sockaddr_storage&) (GroupsockHelper.cpp:411)
==115264==    by 0x6479EFA: SocketDescriptor::tcpReadHandler1(int) 
(RTPInterface.cpp:510)
==115264==    by 0x647A0CA: 
SocketDescriptor::tcpReadHandler(SocketDescriptor*, int) 
(RTPInterface.cpp:493)
==115264==    by 0x63BB33A: BasicTaskScheduler::SingleStep(unsigned int) 
(BasicTaskScheduler.cpp:171)
==115264==    by 0x63BA452: BasicTaskScheduler0::doEventLoop(char 
volatile*) (BasicTaskScheduler0.cpp:80)
==115264==    by 0x3ABB91: video_network::rtsp_player::run() 
(rtsp_player.cpp:591)
==115264==    by 0x3B4E71: void std::__invoke_impl<void, void 
(video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(std::__invoke_memfun_deref, void 
(video_network::rtsp_player::*&&)(), video_network::rtsp_player*&&) 
(invoke.h:73)
==115264==    by 0x3B4DA0: std::__invoke_result<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*>::type 
std::__invoke<void (video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(void (video_network::rtsp_player::*&&)(), 
video_network::rtsp_player*&&) (invoke.h:95)
==115264==    by 0x3B4D00: void std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (thread:264)
==115264==    by 0x3B4CB5: std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::operator()() (thread:271)
==115264==    by 0x3B4B37: 
std::thread::_State_impl<std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> > 
 >::_M_run() (thread:215)
==115264==    by 0x697BDE3: ??? (in 
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==115264==
==115264== Conditional jump or move depends on uninitialised value(s)
==115264==    at 0x6507BDD: readSocket(UsageEnvironment&, int, unsigned 
char*, unsigned int, sockaddr_storage&) (GroupsockHelper.cpp:411)
==115264==    by 0x6479EFA: SocketDescriptor::tcpReadHandler1(int) 
(RTPInterface.cpp:510)
==115264==    by 0x647A0CA: 
SocketDescriptor::tcpReadHandler(SocketDescriptor*, int) 
(RTPInterface.cpp:493)
==115264==    by 0x63BB33A: BasicTaskScheduler::SingleStep(unsigned int) 
(BasicTaskScheduler.cpp:171)
==115264==    by 0x63BA452: BasicTaskScheduler0::doEventLoop(char 
volatile*) (BasicTaskScheduler0.cpp:80)
==115264==    by 0x3ABB91: video_network::rtsp_player::run() 
(rtsp_player.cpp:591)
==115264==    by 0x3B4E71: void std::__invoke_impl<void, void 
(video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(std::__invoke_memfun_deref, void 
(video_network::rtsp_player::*&&)(), video_network::rtsp_player*&&) 
(invoke.h:73)
==115264==    by 0x3B4DA0: std::__invoke_result<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*>::type 
std::__invoke<void (video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(void (video_network::rtsp_player::*&&)(), 
video_network::rtsp_player*&&) (invoke.h:95)
==115264==    by 0x3B4D00: void std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (thread:264)
==115264==    by 0x3B4CB5: std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::operator()() (thread:271)
==115264==    by 0x3B4B37: 
std::thread::_State_impl<std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> > 
 >::_M_run() (thread:215)
==115264==    by 0x697BDE3: ??? (in 
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==115264==
==115264== Conditional jump or move depends on uninitialised value(s)
==115264==    at 0x6509858: 
Groupsock::wasLoopedBackFromUs(UsageEnvironment&, sockaddr_storage 
const&) (Groupsock.cpp:319)
==115264==    by 0x647AFD2: RTCPInstance::incomingReportHandler1() 
(RTCP.cpp:460)
==115264==    by 0x647A028: SocketDescriptor::tcpReadHandler1(int) 
(RTPInterface.cpp:589)
==115264==    by 0x647A0CA: 
SocketDescriptor::tcpReadHandler(SocketDescriptor*, int) 
(RTPInterface.cpp:493)
==115264==    by 0x63BB33A: BasicTaskScheduler::SingleStep(unsigned int) 
(BasicTaskScheduler.cpp:171)
==115264==    by 0x63BA452: BasicTaskScheduler0::doEventLoop(char 
volatile*) (BasicTaskScheduler0.cpp:80)
==115264==    by 0x3ABB91: video_network::rtsp_player::run() 
(rtsp_player.cpp:591)
==115264==    by 0x3B4E71: void std::__invoke_impl<void, void 
(video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(std::__invoke_memfun_deref, void 
(video_network::rtsp_player::*&&)(), video_network::rtsp_player*&&) 
(invoke.h:73)
==115264==    by 0x3B4DA0: std::__invoke_result<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*>::type 
std::__invoke<void (video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(void (video_network::rtsp_player::*&&)(), 
video_network::rtsp_player*&&) (invoke.h:95)
==115264==    by 0x3B4D00: void std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (thread:264)
==115264==    by 0x3B4CB5: std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::operator()() (thread:271)
==115264==    by 0x3B4B37: 
std::thread::_State_impl<std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> > 
 >::_M_run() (thread:215)
==115264==
==115264== Conditional jump or move depends on uninitialised value(s)
==115264==    at 0x6507BD7: readSocket(UsageEnvironment&, int, unsigned 
char*, unsigned int, sockaddr_storage&) (GroupsockHelper.cpp:411)
==115264==    by 0x64794A8: RTPInterface::handleRead(unsigned char*, 
unsigned int, unsigned int&, sockaddr_storage&, int&, unsigned char&, 
unsigned char&) (RTPInterface.cpp:285)
==115264==    by 0x6472A3B: BufferedPacket::fillInData(RTPInterface&, 
sockaddr_storage&, unsigned char&) (MultiFramedRTPSource.cpp:405)
==115264==    by 0x6473812: MultiFramedRTPSource::networkReadHandler1() 
(MultiFramedRTPSource.cpp:241)
==115264==    by 0x647A028: SocketDescriptor::tcpReadHandler1(int) 
(RTPInterface.cpp:589)
==115264==    by 0x647A0CA: 
SocketDescriptor::tcpReadHandler(SocketDescriptor*, int) 
(RTPInterface.cpp:493)
==115264==    by 0x63BB33A: BasicTaskScheduler::SingleStep(unsigned int) 
(BasicTaskScheduler.cpp:171)
==115264==    by 0x63BA452: BasicTaskScheduler0::doEventLoop(char 
volatile*) (BasicTaskScheduler0.cpp:80)
==115264==    by 0x3ABB91: video_network::rtsp_player::run() 
(rtsp_player.cpp:591)
==115264==    by 0x3B4E71: void std::__invoke_impl<void, void 
(video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(std::__invoke_memfun_deref, void 
(video_network::rtsp_player::*&&)(), video_network::rtsp_player*&&) 
(invoke.h:73)
==115264==    by 0x3B4DA0: std::__invoke_result<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*>::type 
std::__invoke<void (video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(void (video_network::rtsp_player::*&&)(), 
video_network::rtsp_player*&&) (invoke.h:95)
==115264==    by 0x3B4D00: void std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (thread:264)
==115264==
==115264== Conditional jump or move depends on uninitialised value(s)
==115264==    at 0x6507BDD: readSocket(UsageEnvironment&, int, unsigned 
char*, unsigned int, sockaddr_storage&) (GroupsockHelper.cpp:411)
==115264==    by 0x64794A8: RTPInterface::handleRead(unsigned char*, 
unsigned int, unsigned int&, sockaddr_storage&, int&, unsigned char&, 
unsigned char&) (RTPInterface.cpp:285)
==115264==    by 0x6472A3B: BufferedPacket::fillInData(RTPInterface&, 
sockaddr_storage&, unsigned char&) (MultiFramedRTPSource.cpp:405)
==115264==    by 0x6473812: MultiFramedRTPSource::networkReadHandler1() 
(MultiFramedRTPSource.cpp:241)
==115264==    by 0x647A028: SocketDescriptor::tcpReadHandler1(int) 
(RTPInterface.cpp:589)
==115264==    by 0x647A0CA: 
SocketDescriptor::tcpReadHandler(SocketDescriptor*, int) 
(RTPInterface.cpp:493)
==115264==    by 0x63BB33A: BasicTaskScheduler::SingleStep(unsigned int) 
(BasicTaskScheduler.cpp:171)
==115264==    by 0x63BA452: BasicTaskScheduler0::doEventLoop(char 
volatile*) (BasicTaskScheduler0.cpp:80)
==115264==    by 0x3ABB91: video_network::rtsp_player::run() 
(rtsp_player.cpp:591)
==115264==    by 0x3B4E71: void std::__invoke_impl<void, void 
(video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(std::__invoke_memfun_deref, void 
(video_network::rtsp_player::*&&)(), video_network::rtsp_player*&&) 
(invoke.h:73)
==115264==    by 0x3B4DA0: std::__invoke_result<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*>::type 
std::__invoke<void (video_network::rtsp_player::*)(), 
video_network::rtsp_player*>(void (video_network::rtsp_player::*&&)(), 
video_network::rtsp_player*&&) (invoke.h:95)
==115264==    by 0x3B4D00: void std::thread::_Invoker<std::tuple<void 
(video_network::rtsp_player::*)(), video_network::rtsp_player*> 
 >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (thread:264)
==115264==
==115264==

I found this issue - it is in MultiFramedRTPSource.cpp :

void MultiFramedRTPSource::networkReadHandler1() {
   BufferedPacket* bPacket = fPacketReadInProgress;
   if (bPacket == NULL) {
     // Normal case: Get a free BufferedPacket descriptor to hold the 
new network packet:
     bPacket = fReorderingBuffer->getFreePacket(this);
   }

   // Read the network packet, and perform sanity checks on the RTP header:
   Boolean readSuccess = False;
   do {
     struct sockaddr_storage fromAddress;
     Boolean packetReadWasIncomplete = fPacketReadInProgress != NULL;
     if (!bPacket->fillInData(fRTPInterface, fromAddress, 
packetReadWasIncomplete)) {
       if (bPacket->bytesAvailable() == 0) { // should not happen??
     envir() << "MultiFramedRTPSource internal error: Hit limit when 
reading incoming packet over TCP\n";
       }


struct sockaddr_storage fromAddress; again ununitialized here.

And if we going through the stack into GroupsockHelper.cpp:411 - again 
switch (from Address.sa_family)

int readSocket(UsageEnvironment& env,
            int socket, unsigned char* buffer, unsigned bufferSize,
            struct sockaddr_storage& fromAddress) {
   SOCKLEN_T addressSize = sizeof fromAddress;
   int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0,
                (struct sockaddr*)&fromAddress,
                &addressSize);
   if (bytesRead < 0) {
     //##### HACK to work around bugs in Linux and Windows:
     int err = env.getErrno();
     if (err == 111 /*ECONNREFUSED (Linux)*/
#if defined(__WIN32__) || defined(_WIN32)
     // What a piece of crap Windows is.  Sometimes
     // recvfrom() returns -1, but with an 'errno' of 0.
     // This appears not to be a real error; just treat
     // it as if it were a read of zero bytes, and hope
     // we don't have to do anything else to 'reset'
     // this alleged error:
     || err == 0 || err == EWOULDBLOCK
#else
     || err == EAGAIN
#endif
     || err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return 
this for datagram sock?
       switch (fromAddress.ss_family) {
     case AF_INET: {
       ((sockaddr_in&)fromAddress).sin_addr.s_addr = 0;
       break;
     }
         case AF_INET6: {
       for (unsigned i = 0; i < 16; ++i) 
((sockaddr_in6&)fromAddress).sin6_addr.s6_addr[i] = 0;
       break;
     }
       }
       return 0;
     }
     //##### END HACK
     socketErr(env, "recvfrom() error: ");
   } else if (bytesRead == 0) {
     // "recvfrom()" on a stream socket can return 0 if the remote end 
has closed the connection.  Treat this as an error:
     return -1;
   }

   return bytesRead;
}

here :

   switch (fromAddress.ss_family) {
     case AF_INET: {
       ((sockaddr_in&)fromAddress).sin_addr.s_addr = 0;
       break;
     }
         case AF_INET6: {
       for (unsigned i = 0; i < 16; ++i) 
((sockaddr_in6&)fromAddress).sin6_addr.s6_addr[i] = 0;
       break;
     }

-- 
С уважением, Костромин Дмитрий Андреевич,
руководитель подразделения ЗАО НВП "Болид"
г.Орехово-Зуево



More information about the live-devel mailing list