--- /dev/null
+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:<track-id>
+- 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:<track-id>
+- 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://<ip-address>:<port>/"
+
+ 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;
+ }
+