From 2c2f5641c87b844c474783cc313a0d2f2b305a37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 13 Jul 2008 12:59:14 +0300 Subject: [PATCH] live: fix unsafe use of setlocale() --- extras/contrib/src/Makefile | 1 + .../contrib/src/Patches/live-uselocale.patch | 115 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 extras/contrib/src/Patches/live-uselocale.patch diff --git a/extras/contrib/src/Makefile b/extras/contrib/src/Makefile index 01f6a209a7..26d5be0f9a 100644 --- a/extras/contrib/src/Makefile +++ b/extras/contrib/src/Makefile @@ -1252,6 +1252,7 @@ live555-$(LIVEDOTCOM_VERSION).tar.gz: live: live555-$(LIVEDOTCOM_VERSION).tar.gz $(EXTRACT_GZ) patch -p0 < Patches/live-noapps.patch + patch -p0 < Patches/live-uselocale.patch .live: live ifdef HAVE_WIN32 diff --git a/extras/contrib/src/Patches/live-uselocale.patch b/extras/contrib/src/Patches/live-uselocale.patch new file mode 100644 index 0000000000..667634c667 --- /dev/null +++ b/extras/contrib/src/Patches/live-uselocale.patch @@ -0,0 +1,115 @@ +Copyright (C) 2008 Rémi Denis-Courmont. +Licensed under GNU General Public License version 2 or higher. +diff -ru live.old/liveMedia/include/Locale.hh live/liveMedia/include/Locale.hh +--- live.old/liveMedia/include/Locale.hh 2008-07-06 04:10:57.000000000 +0300 ++++ live/liveMedia/include/Locale.hh 2008-07-13 12:54:21.000000000 +0300 +@@ -27,23 +27,26 @@ + + #ifndef LOCALE_NOT_USED + #include ++#ifdef __APPLE__ ++#include ++#endif + #else +-#ifndef LC_ALL +-#define LC_ALL 0 ++#ifndef LC_ALL_MASK ++#define LC_ALL_MASK 0 + #endif +-#ifndef LC_NUMERIC +-#define LC_NUMERIC 4 ++#ifndef LC_NUMERIC_MASK ++#define LC_NUMERIC_MASK 0 + #endif ++typedef int locale_t; + #endif + + class Locale { + public: +- Locale(char const* newLocale, int category = LC_ALL); ++ Locale(char const* newLocale, int category = LC_ALL_MASK); + virtual ~Locale(); + + private: +- int fCategory; +- char* fPrevLocale; ++ locale_t fLocale, fPrevLocale; + }; + + #endif +diff -ru live.old/liveMedia/Locale.cpp live/liveMedia/Locale.cpp +--- live.old/liveMedia/Locale.cpp 2008-07-06 04:10:57.000000000 +0300 ++++ live/liveMedia/Locale.cpp 2008-07-13 12:55:32.000000000 +0300 +@@ -22,19 +22,18 @@ + #include "Locale.hh" + #include + +-Locale::Locale(char const* newLocale, int category) +- : fCategory(category) { ++Locale::Locale(char const* newLocale, int category) { + #ifndef LOCALE_NOT_USED +- fPrevLocale = strDup(setlocale(category, NULL)); +- setlocale(category, newLocale); ++ fLocale = newlocale(category, newLocale, NULL); ++ fPrevLocale = uselocale(fLocale); + #endif + } + + Locale::~Locale() { + #ifndef LOCALE_NOT_USED +- if (fPrevLocale != NULL) { +- setlocale(fCategory, fPrevLocale); +- delete[] fPrevLocale; ++ if (fLocale != (locale_t)0) { ++ uselocale(fPrevLocale); ++ freelocale(fLocale); + } + #endif + } +diff -ru live.old/liveMedia/RTSPClient.cpp live/liveMedia/RTSPClient.cpp +--- live.old/liveMedia/RTSPClient.cpp 2008-07-06 04:10:57.000000000 +0300 ++++ live/liveMedia/RTSPClient.cpp 2008-07-13 12:53:35.000000000 +0300 +@@ -1017,7 +1017,7 @@ + // This is the default value; we don't need a "Scale:" header: + buf[0] = '\0'; + } else { +- Locale("C", LC_NUMERIC); ++ Locale("C", LC_NUMERIC_MASK); + sprintf(buf, "Scale: %f\r\n", scale); + } + +@@ -1031,11 +1031,11 @@ + buf[0] = '\0'; + } else if (end < 0) { + // There's no end time: +- Locale("C", LC_NUMERIC); ++ Locale("C", LC_NUMERIC_MASK); + sprintf(buf, "Range: npt=%.3f-\r\n", start); + } else { + // There's both a start and an end time; include them both in the "Range:" hdr +- Locale("C", LC_NUMERIC); ++ Locale("C", LC_NUMERIC_MASK); + sprintf(buf, "Range: npt=%.3f-%.3f\r\n", start, end); + } + +@@ -2306,7 +2306,7 @@ + if (_strncasecmp(line, "Scale: ", 7) != 0) return False; + line += 7; + +- Locale("C", LC_NUMERIC); ++ Locale("C", LC_NUMERIC_MASK); + return sscanf(line, "%f", &scale) == 1; + } + +diff -ru live.old/liveMedia/RTSPCommon.cpp live/liveMedia/RTSPCommon.cpp +--- live.old/liveMedia/RTSPCommon.cpp 2008-07-06 04:10:57.000000000 +0300 ++++ live/liveMedia/RTSPCommon.cpp 2008-07-13 12:53:20.000000000 +0300 +@@ -146,7 +146,7 @@ + char const* fields = buf + 7; + while (*fields == ' ') ++fields; + float start, end; +- Locale("C", LC_NUMERIC); ++ Locale("C", LC_NUMERIC_MASK); + if (sscanf(fields, "npt = %f - %f", &start, &end) == 2) { + rangeStart = start; + rangeEnd = end; -- 2.39.2