Use snprintf instead of sprintf if possible.

This commit is contained in:
Tsuda Kageyu 2013-05-01 14:54:17 +09:00
parent ffc7bcfef0
commit fbe329bb70
3 changed files with 56 additions and 21 deletions

View File

@ -84,13 +84,25 @@ if(NOT HAVE_STD_SHARED_PTR AND NOT HAVE_TR1_SHARED_PTR AND NOT HAVE_BOOST_SHARED
endif()
endif()
# Determine whether your compiler supports codecvt header.
check_cxx_source_compiles("
#include <codecvt>
int main() { std::codecvt_utf8_utf16<wchar_t> x; return 0; }
" HAVE_CODECVT)
# Determine whether your compiler supports some safer version of sprintf.
check_cxx_source_compiles("
#include <cstdio>
int main() { char buf[20]; snprintf(buf, 20, \"%d\", 1); return 0; }
" HAVE_SNPRINTF)
if(NOT HAVE_SNPRINTF)
check_cxx_source_compiles("
#include <cstdio>
int main() { char buf[20]; sprintf_s(buf, \"%d\", 1); return 0; }
" HAVE_SPRINTF_S)
endif()
# check for libz using the cmake supplied FindZLIB.cmake
find_package(ZLIB)
if(ZLIB_FOUND)

View File

@ -14,6 +14,10 @@
#cmakedefine HAVE_WIN_ATOMIC 1
#cmakedefine HAVE_IA64_ATOMIC 1
/* Defined if your compiler supports some safer version of sprintf */
#cmakedefine HAVE_SNPRINTF 1
#cmakedefine HAVE_SPRINTF_S 1
/* Defined if your compiler has <codecvt> header */
#cmakedefine HAVE_CODECVT 1

View File

@ -27,19 +27,44 @@
# include <config.h>
#endif
#include <stdio.h>
#include <cstdarg>
#include <cstdio>
#include <taglib.h>
#include <tdebug.h>
#include "mp4item.h"
#if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later
# define SPRINTF sprintf_s
using namespace TagLib;
namespace
{
String format(const char *fmt, ...)
{
va_list args;
va_start(args,fmt);
char buf[256];
#if defined(HAVE_SNPRINTF)
vsnprintf(buf, sizeof(buf), fmt, args);
#elif defined(HAVE_SPRINTF_S)
vsprintf_s(buf, fmt, args);
#else
# define SPRINTF sprintf
// Be careful. May cause a buffer overflow.
vsprintf(buf, fmt, args);
#endif
using namespace TagLib;
va_end(args);
return String(buf);
}
}
class MP4::Item::ItemPrivate
{
@ -242,37 +267,31 @@ String
MP4::Item::toString() const
{
StringList desc;
char tmp[256];
switch (d->type) {
case TypeBool:
return d->m_bool ? "true" : "false";
case TypeInt:
SPRINTF(tmp, "%d", d->m_int);
return tmp;
return format("%d", d->m_int);
case TypeIntPair:
SPRINTF(tmp, "%d/%d", d->m_intPair.first, d->m_intPair.second);
return tmp;
return format("%d/%d", d->m_intPair.first, d->m_intPair.second);
case TypeByte:
SPRINTF(tmp, "%d", d->m_byte);
return tmp;
return format("%d", d->m_byte);
case TypeUInt:
SPRINTF(tmp, "%u", d->m_uint);
return tmp;
return format("%u", d->m_uint);
case TypeLongLong:
SPRINTF(tmp, "%lld", d->m_longlong);
return tmp;
return format("%lld", d->m_longlong);
case TypeStringList:
return d->m_stringList.toString(" / ");
case TypeByteVectorList:
for(TagLib::uint i = 0; i < d->m_byteVectorList.size(); i++) {
SPRINTF(tmp, "[%d bytes of data]", static_cast<int>(d->m_byteVectorList[i].size()));
desc.append(tmp);
desc.append(format(
"[%d bytes of data]", static_cast<int>(d->m_byteVectorList[i].size())));
}
return desc.toString(", ");
case TypeCoverArtList:
for(TagLib::uint i = 0; i < d->m_coverArtList.size(); i++) {
SPRINTF(tmp, "[%d bytes of data]", static_cast<int>(d->m_coverArtList[i].data().size()));
desc.append(tmp);
desc.append(format(
"[%d bytes of data]", static_cast<int>(d->m_coverArtList[i].data().size())));
}
return desc.toString(", ");
case TypeUndefined: