From 86c7e905ba7872fa3a4b3e96b0d8b6ca4fa35e56 Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Fri, 13 Nov 2015 10:06:01 +0900 Subject: [PATCH] Silence some MSVC security warnings by replacing strdup() with _strdup(). Backported from taglib2. --- ConfigureChecks.cmake | 10 ++++++++ bindings/c/tag_c.cpp | 53 ++++++++++++++++++++++++++++++++----------- config.h.cmake | 3 +++ 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 88980ea1..5c740756 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -190,6 +190,16 @@ if(NOT HAVE_VSNPRINTF) " HAVE_VSPRINTF_S) endif() +# Determine whether your compiler supports ISO _strdup. + +check_cxx_source_compiles(" + #include + int main() { + _strdup(0); + return 0; +} +" HAVE_ISO_STRDUP) + # Check for libz using the cmake supplied FindZLIB.cmake if(NOT ZLIB_SOURCE) diff --git a/bindings/c/tag_c.cpp b/bindings/c/tag_c.cpp index 6e507b19..41dd15eb 100644 --- a/bindings/c/tag_c.cpp +++ b/bindings/c/tag_c.cpp @@ -19,6 +19,10 @@ * USA * ***************************************************************************/ +#ifdef HAVE_CONFIG_H +# include +#endif + #include #include #include @@ -40,9 +44,32 @@ using namespace TagLib; -static List strings; -static bool unicodeStrings = true; -static bool stringManagementEnabled = true; +namespace +{ + List 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(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(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(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(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(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); - 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); - 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); - 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); - 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); - t->setGenre(String(genre, unicodeStrings ? String::UTF8 : String::Latin1)); + t->setGenre(charArrayToString(genre)); } void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year) diff --git a/config.h.cmake b/config.h.cmake index ee0e67ac..12e713fc 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -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