]> git.sesse.net Git - vlc/commitdiff
live: fix unsafe use of setlocale()
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 13 Jul 2008 09:59:14 +0000 (12:59 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 13 Jul 2008 10:00:37 +0000 (13:00 +0300)
extras/contrib/src/Makefile
extras/contrib/src/Patches/live-uselocale.patch [new file with mode: 0644]

index 01f6a209a7672efa1e66138b5b080372d50dc5e0..26d5be0f9a5497b885146cd4700ba06c7240a844 100644 (file)
@@ -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 (file)
index 0000000..667634c
--- /dev/null
@@ -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 <locale.h>
++#ifdef __APPLE__
++#include <xlocale.h>
++#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 <strDup.hh>
+-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;