[vlc-devel] commit: live: fix unsafe use of setlocale() ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Jul 13 11:58:39 CEST 2008


vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Jul 13 12:59:14 2008 +0300| [2c2f5641c87b844c474783cc313a0d2f2b305a37]

live: fix unsafe use of setlocale()

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2c2f5641c87b844c474783cc313a0d2f2b305a37
---

 extras/contrib/src/Makefile                     |    1 +
 extras/contrib/src/Patches/live-uselocale.patch |  115 +++++++++++++++++++++++
 2 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/extras/contrib/src/Makefile b/extras/contrib/src/Makefile
index 01f6a20..26d5be0 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 0000000..667634c
--- /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 <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;




More information about the vlc-devel mailing list