These security functions are available when building with MSVC++. With mingw, they can be used at build time, but their availability will depend on the version of MSVCRT the user has installed on their system. In particular, a default install of Windows XP will not have a new enough MSVCRT version, causing runtime failures as the binary built with mingw and using strcat_s will not be able to find the necessary entry point in the MSVCRT runtime. This commit adds some strcat_s/strcpy_s-like functions used with mingw which will always be available. --- common/vdcommon.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ common/vdcommon.h | 22 ++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/common/vdcommon.cpp b/common/vdcommon.cpp index 4dc50b4..4f80a2c 100644 --- a/common/vdcommon.cpp +++ b/common/vdcommon.cpp @@ -34,3 +34,45 @@ int supported_system_version() } return 0; } + +#ifndef HAVE_STRCAT_S +errno_t vdagent_strcat_s(char *strDestination, + size_t numberOfElements, + const char *strSource) +{ + if (strDestination == NULL) + return EINVAL; + if (strSource == NULL) { + strDestination[0] = '\0'; + return EINVAL; + } + if (strlen(strDestination) + strlen(strSource) + 1 > numberOfElements) { + strDestination[0] = '\0'; + return ERANGE; + } + + strcat(strDestination, strSource); + + return 0; +} +#endif + +#ifndef HAVE_STRCPY_S +errno_t vdagent_strcpy_s(char *strDestination, + size_t numberOfElements, + const char *strSource) +{ + if (strDestination == NULL) + return EINVAL; + strDestination[0] = '\0'; + if (strSource == NULL) + return EINVAL; + if (strlen(strSource) + 1 > numberOfElements) { + return ERANGE; + } + + strcpy(strDestination, strSource); + + return 0; +} +#endif diff --git a/common/vdcommon.h b/common/vdcommon.h index af270db..002ac23 100644 --- a/common/vdcommon.h +++ b/common/vdcommon.h @@ -22,6 +22,7 @@ #pragma warning(disable:4200) #endif +#include <errno.h> #include <windows.h> #include "spice/vd_agent.h" #include "vdlog.h" @@ -69,6 +70,27 @@ typedef CRITICAL_SECTION mutex_t; #endif /* OLDMSVCRT */ #ifdef _MSC_VER // compiling with Visual Studio +#define HAVE_STRCAT_S 1 +#define HAVE_STRCPY_S 1 +#endif + +#ifdef HAVE_STRCAT_S +#define vdagent_strcat_s strcat_s +#else +errno_t vdagent_strcat_s(char *strDestination, + size_t numberOfElements, + const char *strSource); +#endif + +#ifdef HAVE_STRCPY_S +#define vdagent_strcpy_s strcpy_s +#else +errno_t vdagent_strcpy_s(char *strDestination, + size_t numberOfElements, + const char *strSource); +#endif + +#ifdef _MSC_VER // compiling with Visual Studio #define snprintf sprintf_s #define strncpy(d,s,n) strcpy_s(s, __min(n+1, sizeof(d)), s) #define strcat(d,s) strcat_s(d, sizeof(d), s) -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel