From: Rémi Denis-Courmont Date: Sat, 17 Apr 2010 16:54:52 +0000 (+0300) Subject: live: use inet_ntop() instead of inet_ntoa() X-Git-Tag: 1.2.0-pre1~7020 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=ef3e8fb116b32ceda63f2d52d1b7bf6cb0d238c6;p=vlc live: use inet_ntop() instead of inet_ntoa() inet_ntoa() is not thread-safe (except with Winsock) --- diff --git a/extras/contrib/src/Makefile b/extras/contrib/src/Makefile index 54bba7dcda..1c0a17a9c9 100644 --- a/extras/contrib/src/Makefile +++ b/extras/contrib/src/Makefile @@ -1220,6 +1220,7 @@ live555-$(LIVEDOTCOM_VERSION).tar.gz: live: live555-$(LIVEDOTCOM_VERSION).tar.gz $(EXTRACT_GZ) patch -p0 < Patches/live-uselocale.patch + patch -p0 < Patches/live-inet_ntop.patch ifdef HAVE_WIN64 patch -p0 < Patches/live-win64.patch endif diff --git a/extras/contrib/src/Patches/live-inet_ntop.patch b/extras/contrib/src/Patches/live-inet_ntop.patch new file mode 100644 index 0000000000..812987461d --- /dev/null +++ b/extras/contrib/src/Patches/live-inet_ntop.patch @@ -0,0 +1,302 @@ +Copyright (C) 2010 Rémi Denis-Courmont. +Licensed under GNU General Public License version 2 or higher. +diff -ru live.orig//groupsock/Groupsock.cpp live//groupsock/Groupsock.cpp +--- live.orig//groupsock/Groupsock.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/Groupsock.cpp 2010-04-17 19:51:07.000000000 +0300 +@@ -331,8 +331,10 @@ + } + } + if (DebugLevel >= 3) { ++ char buf[16]; ++ + env() << *this << ": read " << bytesRead << " bytes from "; +- env() << our_inet_ntoa(fromAddress.sin_addr); ++ env() << our_inet_ntoa(fromAddress.sin_addr, buf); + if (numMembers > 0) { + env() << "; relayed to " << numMembers << " members"; + } +@@ -441,13 +443,14 @@ + } + + UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g) { ++ char buf[16]; + UsageEnvironment& s1 = s << timestampString() << " Groupsock(" + << g.socketNum() << ": " +- << our_inet_ntoa(g.groupAddress()) ++ << our_inet_ntoa(g.groupAddress(), buf) + << ", " << g.port() << ", "; + if (g.isSSM()) { + return s1 << "SSM source: " +- << our_inet_ntoa(g.sourceFilterAddress()) << ")"; ++ << our_inet_ntoa(g.sourceFilterAddress(), buf) << ")"; + } else { + return s1 << (unsigned)(g.ttl()) << ")"; + } +diff -ru live.orig//groupsock/include/GroupsockHelper.hh live//groupsock/include/GroupsockHelper.hh +--- live.orig//groupsock/include/GroupsockHelper.hh 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/include/GroupsockHelper.hh 2010-04-17 19:43:44.000000000 +0300 +@@ -124,7 +124,7 @@ + + // The following are implemented in inet.c: + extern "C" netAddressBits our_inet_addr(char const*); +-extern "C" char* our_inet_ntoa(struct in_addr); ++extern "C" char* our_inet_ntoa(struct in_addr, char *); + extern "C" struct hostent* our_gethostbyname(char* name); + extern "C" void our_srandom(int x); + extern "C" long our_random(); +diff -ru live.orig//groupsock/inet.c live//groupsock/inet.c +--- live.orig//groupsock/inet.c 2010-04-09 22:27:39.000000000 +0300 ++++ live//groupsock/inet.c 2010-04-17 19:42:52.000000000 +0300 +@@ -21,26 +21,18 @@ + } + + char * +-our_inet_ntoa(in) +- struct in_addr in; ++our_inet_ntoa(in, result) ++ struct in_addr in; ++ char *result; + { +-#ifndef VXWORKS +- return inet_ntoa(in); ++#ifdef WIN32 ++ char *ret = inet_ntoa(in); ++ if(ret != NULL) ++ strncpy(result, ret, 16); ++ return ret; ++#elif !defined (VXWORKS) ++ return inet_ntop(AF_INET, &in, result, 16); + #else +- /* according the man pages of inet_ntoa : +- +- NOTES +- The return value from inet_ntoa() points to a buffer which +- is overwritten on each call. This buffer is implemented as +- thread-specific data in multithreaded applications. +- +- the vxworks version of inet_ntoa allocates a buffer for each +- ip address string, and does not reuse the same buffer. +- +- this is merely to simulate the same behaviour (not multithread +- safe though): +- */ +- static char result[INET_ADDR_LEN]; + inet_ntoa_b(in, result); + return(result); + #endif +diff -ru live.orig//liveMedia/DarwinInjector.cpp live//liveMedia/DarwinInjector.cpp +--- live.orig//liveMedia/DarwinInjector.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/DarwinInjector.cpp 2010-04-17 19:45:19.000000000 +0300 +@@ -128,7 +128,8 @@ + NetAddress const* address = addresses.firstAddress(); + addr.s_addr = *(unsigned*)(address->data()); + } +- char const* remoteRTSPServerAddressStr = our_inet_ntoa(addr); ++ char buf[16]; ++ char const* remoteRTSPServerAddressStr = our_inet_ntoa(addr, buf); + + // Construct a SDP description for the session that we'll be streaming: + char const* const sdpFmt = +diff -ru live.orig//liveMedia/OnDemandServerMediaSubsession.cpp live//liveMedia/OnDemandServerMediaSubsession.cpp +--- live.orig//liveMedia/OnDemandServerMediaSubsession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/OnDemandServerMediaSubsession.cpp 2010-04-17 19:50:05.000000000 +0300 +@@ -365,7 +365,8 @@ + char const* mediaType = rtpSink->sdpMediaType(); + unsigned char rtpPayloadType = rtpSink->rtpPayloadType(); + struct in_addr serverAddrForSDP; serverAddrForSDP.s_addr = fServerAddressForSDP; +- char* const ipAddressStr = strDup(our_inet_ntoa(serverAddrForSDP)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(serverAddrForSDP, ipAddressStr); + char* rtpmapLine = rtpSink->rtpmapLine(); + char const* rangeLine = rangeSDPLine(); + char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource); +@@ -398,7 +399,7 @@ + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: +- delete[] (char*)rangeLine; delete[] rtpmapLine; delete[] ipAddressStr; ++ delete[] (char*)rangeLine; delete[] rtpmapLine; + + fSDPLines = strDup(sdpLines); + delete[] sdpLines; +diff -ru live.orig//liveMedia/PassiveServerMediaSubsession.cpp live//liveMedia/PassiveServerMediaSubsession.cpp +--- live.orig//liveMedia/PassiveServerMediaSubsession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/PassiveServerMediaSubsession.cpp 2010-04-17 19:46:28.000000000 +0300 +@@ -54,7 +54,8 @@ + char const* auxSDPLine = fRTPSink.auxSDPLine(); + if (auxSDPLine == NULL) auxSDPLine = ""; + +- char* const ipAddressStr = strDup(our_inet_ntoa(ipAddress)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(ipAddress, ipAddressStr); + + char const* const sdpFmt = + "m=%s %d RTP/AVP %d\r\n" +@@ -84,7 +85,7 @@ + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: +- delete[] ipAddressStr; delete[] (char*)rangeLine; delete[] rtpmapLine; ++ delete[] (char*)rangeLine; delete[] rtpmapLine; + + fSDPLines = strDup(sdpLines); + delete[] sdpLines; +diff -ru live.orig//liveMedia/RTCP.cpp live//liveMedia/RTCP.cpp +--- live.orig//liveMedia/RTCP.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTCP.cpp 2010-04-17 19:46:44.000000000 +0300 +@@ -359,7 +359,8 @@ + } + + #ifdef DEBUG +- fprintf(stderr, "[%p]saw incoming RTCP packet (from address %s, port %d)\n", this, our_inet_ntoa(fromAddress.sin_addr), ntohs(fromAddress.sin_port)); ++ char buf[16]; ++ fprintf(stderr, "[%p]saw incoming RTCP packet (from address %s, port %d)\n", this, our_inet_ntoa(fromAddress.sin_addr, buf), ntohs(fromAddress.sin_port)); + unsigned char* p = pkt; + for (unsigned i = 0; i < packetSize; ++i) { + if (i%4 == 0) fprintf(stderr, " "); +diff -ru live.orig//liveMedia/RTSPOverHTTPServer.cpp live//liveMedia/RTSPOverHTTPServer.cpp +--- live.orig//liveMedia/RTSPOverHTTPServer.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTSPOverHTTPServer.cpp 2010-04-17 19:50:41.000000000 +0300 +@@ -128,7 +128,8 @@ + makeSocketNonBlocking(clientSocket); + increaseSendBufferTo(envir(), clientSocket, 50*1024); + #if defined(DEBUG) || defined(DEBUG_CONNECTIONS) +- fprintf(stderr, "accept()ed connection from %s\n", our_inet_ntoa(clientAddr.sin_addr)); ++ char buf[16]; ++ fprintf(stderr, "accept()ed connection from %s\n", our_inet_ntoa(clientAddr.sin_addr, buf)); + #endif + + // Create a new object for handling this HTTP connection: +diff -ru live.orig//liveMedia/RTSPServer.cpp live//liveMedia/RTSPServer.cpp +--- live.orig//liveMedia/RTSPServer.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/RTSPServer.cpp 2010-04-17 19:49:32.000000000 +0300 +@@ -112,11 +112,12 @@ + char urlBuffer[100]; // more than big enough for "rtsp://:/" + + portNumBits portNumHostOrder = ntohs(fServerPort.num()); ++ char buf[16]; + if (portNumHostOrder == 554 /* the default port number */) { +- sprintf(urlBuffer, "rtsp://%s/", our_inet_ntoa(ourAddress.sin_addr)); ++ sprintf(urlBuffer, "rtsp://%s/", our_inet_ntoa(ourAddress.sin_addr, buf)); + } else { + sprintf(urlBuffer, "rtsp://%s:%hu/", +- our_inet_ntoa(ourAddress.sin_addr), portNumHostOrder); ++ our_inet_ntoa(ourAddress.sin_addr, buf), portNumHostOrder); + } + + return strDup(urlBuffer); +@@ -233,7 +234,8 @@ + increaseSendBufferTo(envir(), clientSocket, 50*1024); + + #if defined(DEBUG) || defined(DEBUG_CONNECTIONS) +- envir() << "accept()ed connection from " << our_inet_ntoa(clientAddr.sin_addr) << '\n'; ++ char buf[16]; ++ envir() << "accept()ed connection from " << our_inet_ntoa(clientAddr.sin_addr, buf) << '\n'; + #endif + + // Create a new object for this RTSP session. +@@ -747,10 +749,12 @@ + serverRTPPort, serverRTCPPort, + fStreamStates[streamNum].streamToken); + struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress; +- char* destAddrStr = strDup(our_inet_ntoa(destinationAddr)); ++ char destAddrStr[16]; ++ our_inet_ntoa(destinationAddr, destAddrStr); + struct sockaddr_in sourceAddr; SOCKLEN_T namelen = sizeof sourceAddr; + getsockname(fClientSocket, (struct sockaddr*)&sourceAddr, &namelen); +- char* sourceAddrStr = strDup(our_inet_ntoa(sourceAddr.sin_addr)); ++ char sourceAddrStr[16]; ++ our_inet_ntoa(sourceAddr.sin_addr, sourceAddrStr); + if (fIsMulticast) { + switch (streamingMode) { + case RTP_UDP: +@@ -825,7 +829,7 @@ + } + } + } +- delete[] destAddrStr; delete[] sourceAddrStr; delete[] streamingModeString; ++ delete[] streamingModeString; + } + + void RTSPServer::RTSPClientSession +@@ -1226,7 +1230,8 @@ + // If this gets called, the client session is assumed to have timed out, + // so delete it: + #ifdef DEBUG +- fprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr)); ++ char buf[16]; ++ fprintf(stderr, "RTSP client session from %s has timed out (due to inactivity)\n", our_inet_ntoa(clientSession->fClientAddr.sin_addr, buf)); + #endif + delete clientSession; + } +diff -ru live.orig//liveMedia/ServerMediaSession.cpp live//liveMedia/ServerMediaSession.cpp +--- live.orig//liveMedia/ServerMediaSession.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/ServerMediaSession.cpp 2010-04-17 19:50:31.000000000 +0300 +@@ -185,7 +185,8 @@ + char* ServerMediaSession::generateSDPDescription() { + struct in_addr ipAddress; + ipAddress.s_addr = ourIPAddress(envir()); +- char* const ipAddressStr = strDup(our_inet_ntoa(ipAddress)); ++ char ipAddressStr[16]; ++ our_inet_ntoa(ipAddress, ipAddressStr); + unsigned ipAddressStrSize = strlen(ipAddressStr); + + // For a SSM sessions, we need a "a=source-filter: incl ..." line also: +@@ -281,7 +282,7 @@ + } + } while (0); + +- delete[] rangeLine; delete[] sourceFilterLine; delete[] ipAddressStr; ++ delete[] rangeLine; delete[] sourceFilterLine; + return sdp; + } + +diff -ru live.orig//liveMedia/SIPClient.cpp live//liveMedia/SIPClient.cpp +--- live.orig//liveMedia/SIPClient.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//liveMedia/SIPClient.cpp 2010-04-17 19:47:42.000000000 +0300 +@@ -60,13 +60,14 @@ + + struct in_addr ourAddress; + ourAddress.s_addr = ourIPAddress(env); // hack +- fOurAddressStr = strDup(our_inet_ntoa(ourAddress)); ++ char buf[16]; ++ fOurAddressStr = strDup(our_inet_ntoa(ourAddress, buf)); + fOurAddressStrSize = strlen(fOurAddressStr); + + fOurSocket = new Groupsock(env, ourAddress, 0, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " +- << our_inet_ntoa(ourAddress) << ": " ++ << our_inet_ntoa(ourAddress, buf) << ": " + << env.getResultMsg() << "\n"; + } + +@@ -84,7 +85,7 @@ + fOurSocket = new Groupsock(env, ourAddress, fOurPortNum, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " +- << our_inet_ntoa(ourAddress) << ", port " ++ << our_inet_ntoa(ourAddress, buf) << ", port " + << fOurPortNum << ": " + << env.getResultMsg() << "\n"; + } +diff -ru live.orig//testProgs/sapWatch.cpp live//testProgs/sapWatch.cpp +--- live.orig//testProgs/sapWatch.cpp 2010-04-09 22:27:39.000000000 +0300 ++++ live//testProgs/sapWatch.cpp 2010-04-17 19:51:29.000000000 +0300 +@@ -49,13 +49,14 @@ + struct sockaddr_in fromAddress; + while (inputGroupsock.handleRead(packet, maxPacketSize, + packetSize, fromAddress)) { ++ char buf[16]; + printf("\n[packet from %s (%d bytes)]\n", +- our_inet_ntoa(fromAddress.sin_addr), packetSize); ++ our_inet_ntoa(fromAddress.sin_addr, buf), packetSize); + + // Ignore the first 8 bytes (SAP header). + if (packetSize < 8) { + *env << "Ignoring short packet from " +- << our_inet_ntoa(fromAddress.sin_addr) << "%s!\n"; ++ << our_inet_ntoa(fromAddress.sin_addr, buf) << "%s!\n"; + continue; + } +