[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