X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftrunk%2FETL%2F_stringf.h;h=3d0c020106dfb4bb373051cd9922d1d72b25d81c;hb=4cfe2b68ebd2556f9926965dcea2ca8f3fc050ea;hp=69627993cb45c9caffdaca59d415bd95af831399;hpb=cc91f4f6b469483cf8e01f8a0beec543ceed4bf6;p=synfig.git diff --git a/ETL/trunk/ETL/_stringf.h b/ETL/trunk/ETL/_stringf.h index 6962799..3d0c020 100644 --- a/ETL/trunk/ETL/_stringf.h +++ b/ETL/trunk/ETL/_stringf.h @@ -30,9 +30,14 @@ /* === H E A D E R S ======================================================= */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include +#include /* === M A C R O S ========================================================= */ @@ -58,22 +63,33 @@ _ETL_BEGIN_CDECLS #define ETL_NO_THROW throw() #endif +// Prefer prototypes from glibc headers, since defining them ourselves +// works around glibc security mechanisms + #ifdef HAVE_VASPRINTF // This is the preferred method - extern int vasprintf(char **,const char *,va_list)ETL_NO_THROW; + #ifndef __GLIBC__ + extern int vasprintf(char **,const char *,va_list)ETL_NO_THROW; + #endif #else # ifdef HAVE_VSNPRINTF // This is the secondary method - extern int vsnprintf(char *,size_t,const char*,va_list)ETL_NO_THROW; + #ifndef __GLIBC__ + extern int vsnprintf(char *,size_t,const char*,va_list)ETL_NO_THROW; + #endif # endif #endif #ifdef HAVE_VSSCANF -extern int vsscanf(const char *,const char *,va_list)ETL_NO_THROW; + #ifndef __GLIBC__ + extern int vsscanf(const char *,const char *,va_list)ETL_NO_THROW; + #endif #else #define ETL_NO_VSTRSCANF #ifdef HAVE_SSCANF -extern int sscanf(const char *buf, const char *format, ...)ETL_NO_THROW; + #ifndef __GLIBC__ + extern int sscanf(const char *buf, const char *format, ...)ETL_NO_THROW; + #endif #endif #endif @@ -91,9 +107,12 @@ vstrprintf(const char *format, va_list args) #ifdef HAVE_VASPRINTF // This is the preferred method (and safest) char *buffer; std::string ret; - vasprintf(&buffer,format,args); - ret=buffer; - free(buffer); + int i=vasprintf(&buffer,format,args); + if (i>-1) + { + ret=buffer; + free(buffer); + } return ret; #else #ifdef HAVE_VSNPRINTF // This is the secondary method (Safe, but bulky)