]> granicus.if.org Git - taglib/commitdiff
Silence some MSVC security warnings by replacing strdup() with _strdup().
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 13 Nov 2015 01:06:01 +0000 (10:06 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 13 Nov 2015 01:06:01 +0000 (10:06 +0900)
Backported from taglib2.

ConfigureChecks.cmake
bindings/c/tag_c.cpp
config.h.cmake

index 88980ea13126390b501dff130110ac1e2dad2566..5c740756fc93896a797f18237807ced18de6839a 100644 (file)
@@ -190,6 +190,16 @@ if(NOT HAVE_VSNPRINTF)
   " HAVE_VSPRINTF_S)
 endif()
 
+# Determine whether your compiler supports ISO _strdup.
+
+check_cxx_source_compiles("
+  #include <cstring>
+  int main() {
+    _strdup(0);
+    return 0;
+}
+" HAVE_ISO_STRDUP)
+
 # Check for libz using the cmake supplied FindZLIB.cmake
 
 if(NOT ZLIB_SOURCE)
index 6e507b191484a2986a19b9a5d37254be9e94cb38..41dd15eb40bca7a0e227a931f4a7fc6fbe1275d3 100644 (file)
  *   USA                                                                   *
  ***************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <fileref.h>
 #include <tfile.h>
 
 using namespace TagLib;
 
-static List<char *> strings;
-static bool unicodeStrings = true;
-static bool stringManagementEnabled = true;
+namespace
+{
+  List<char *> strings;
+  bool unicodeStrings = true;
+  bool stringManagementEnabled = true;
+
+  inline char *stringToCharArray(const String &s)
+  {
+    const std::string str = s.to8Bit(unicodeStrings);
+
+#ifdef HAVE_ISO_STRDUP
+
+    return ::_strdup(str.c_str());
+
+#else
+
+    return ::strdup(str.c_str());
+
+#endif
+  }
+
+  inline String charArrayToString(const char *s)
+  {
+    return String(s, unicodeStrings ? String::UTF8 : String::Latin1);
+  }
+}
 
 void taglib_set_strings_unicode(BOOL unicode)
 {
@@ -132,7 +159,7 @@ BOOL taglib_file_save(TagLib_File *file)
 char *taglib_tag_title(const TagLib_Tag *tag)
 {
   const Tag *t = reinterpret_cast<const Tag *>(tag);
-  char *s = ::strdup(t->title().toCString(unicodeStrings));
+  char *s = stringToCharArray(t->title().toCString(unicodeStrings));
   if(stringManagementEnabled)
     strings.append(s);
   return s;
@@ -141,7 +168,7 @@ char *taglib_tag_title(const TagLib_Tag *tag)
 char *taglib_tag_artist(const TagLib_Tag *tag)
 {
   const Tag *t = reinterpret_cast<const Tag *>(tag);
-  char *s = ::strdup(t->artist().toCString(unicodeStrings));
+  char *s = stringToCharArray(t->artist().toCString(unicodeStrings));
   if(stringManagementEnabled)
     strings.append(s);
   return s;
@@ -150,7 +177,7 @@ char *taglib_tag_artist(const TagLib_Tag *tag)
 char *taglib_tag_album(const TagLib_Tag *tag)
 {
   const Tag *t = reinterpret_cast<const Tag *>(tag);
-  char *s = ::strdup(t->album().toCString(unicodeStrings));
+  char *s = stringToCharArray(t->album().toCString(unicodeStrings));
   if(stringManagementEnabled)
     strings.append(s);
   return s;
@@ -159,7 +186,7 @@ char *taglib_tag_album(const TagLib_Tag *tag)
 char *taglib_tag_comment(const TagLib_Tag *tag)
 {
   const Tag *t = reinterpret_cast<const Tag *>(tag);
-  char *s = ::strdup(t->comment().toCString(unicodeStrings));
+  char *s = stringToCharArray(t->comment().toCString(unicodeStrings));
   if(stringManagementEnabled)
     strings.append(s);
   return s;
@@ -168,7 +195,7 @@ char *taglib_tag_comment(const TagLib_Tag *tag)
 char *taglib_tag_genre(const TagLib_Tag *tag)
 {
   const Tag *t = reinterpret_cast<const Tag *>(tag);
-  char *s = ::strdup(t->genre().toCString(unicodeStrings));
+  char *s = stringToCharArray(t->genre().toCString(unicodeStrings));
   if(stringManagementEnabled)
     strings.append(s);
   return s;
@@ -189,31 +216,31 @@ unsigned int taglib_tag_track(const TagLib_Tag *tag)
 void taglib_tag_set_title(TagLib_Tag *tag, const char *title)
 {
   Tag *t = reinterpret_cast<Tag *>(tag);
-  t->setTitle(String(title, unicodeStrings ? String::UTF8 : String::Latin1));
+  t->setTitle(charArrayToString(title));
 }
 
 void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist)
 {
   Tag *t = reinterpret_cast<Tag *>(tag);
-  t->setArtist(String(artist, unicodeStrings ? String::UTF8 : String::Latin1));
+  t->setArtist(charArrayToString(artist));
 }
 
 void taglib_tag_set_album(TagLib_Tag *tag, const char *album)
 {
   Tag *t = reinterpret_cast<Tag *>(tag);
-  t->setAlbum(String(album, unicodeStrings ? String::UTF8 : String::Latin1));
+  t->setAlbum(charArrayToString(album));
 }
 
 void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment)
 {
   Tag *t = reinterpret_cast<Tag *>(tag);
-  t->setComment(String(comment, unicodeStrings ? String::UTF8 : String::Latin1));
+  t->setComment(charArrayToString(comment));
 }
 
 void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre)
 {
   Tag *t = reinterpret_cast<Tag *>(tag);
-  t->setGenre(String(genre, unicodeStrings ? String::UTF8 : String::Latin1));
+  t->setGenre(charArrayToString(genre));
 }
 
 void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year)
index ee0e67ac6537bab86f6e49ab96452e58717cfac7..12e713fc5db636b3e8ac2c1183098a8841d4d4e8 100644 (file)
@@ -19,6 +19,9 @@
 #cmakedefine   HAVE_VSNPRINTF 1
 #cmakedefine   HAVE_VSPRINTF_S 1
 
+/* Defined if your compiler supports ISO _strdup. */
+#cmakedefine   HAVE_ISO_STRDUP 1
+
 /* Defined if you have libz */
 #cmakedefine   HAVE_ZLIB 1