SF Bug Tracker id 3499781 - msvc doesn't have snprintf

Submitted: Yoichi NAKAYAMA ( yoichi ) - 2012-03-08 10:18:39 PST

97a17ff5ad commit breaks build on
windows/msvc since there is no snprintf.

Note:
* Some existing sources use _snprintf when WIN32 is defined, but its
behavior is a bit different from C99 snprintf.
* snprintf does terminate the buffer, so the commit (use buffer size
minus 1 as argument) changes the behavior at the boundary.
* Truncation might be better than crash in some cases. But it may
result in not good.
This commit is contained in:
Fabrice Fontaine
2012-03-09 10:38:34 +01:00
parent 29ee36b1ca
commit e722d8c375
12 changed files with 231 additions and 93 deletions

View File

@@ -52,6 +52,9 @@
#include "uuid.h"
#include "upnpapi.h"
#ifdef WIN32
#define snprintf _snprintf
#endif
extern ithread_mutex_t GlobalClientSubscribeMutex;
@@ -289,6 +292,7 @@ static int gena_subscribe(
membuffer request;
uri_type dest_url;
http_parser_t response;
int rc = 0;
memset(timeout_str, 0, sizeof(timeout_str));
UpnpString_clear(sid);
@@ -300,11 +304,13 @@ static int gena_subscribe(
if (*timeout < 0) {
strncpy(timeout_str, "infinite", sizeof(timeout_str) - 1);
} else if(*timeout < CP_MINIMUM_SUBSCRIPTION_TIME) {
snprintf(timeout_str, sizeof(timeout_str) - 1,
rc = snprintf(timeout_str, sizeof(timeout_str),
"%d", CP_MINIMUM_SUBSCRIPTION_TIME);
} else {
snprintf(timeout_str, sizeof(timeout_str) - 1, "%d", *timeout);
rc = snprintf(timeout_str, sizeof(timeout_str), "%d", *timeout);
}
if (rc < 0 || (unsigned int) rc >= sizeof(timeout_str))
return UPNP_E_OUTOF_MEMORY;
/* parse url */
return_code = http_FixStrUrl(
@@ -520,6 +526,7 @@ int genaSubscribe(
UpnpString *ActualSID = UpnpString_new();
UpnpString *EventURL = UpnpString_new();
struct Handle_Info *handle_info;
int rc = 0;
memset(temp_sid, 0, sizeof(temp_sid));
memset(temp_sid2, 0, sizeof(temp_sid2));
@@ -556,7 +563,11 @@ int genaSubscribe(
/* generate client SID */
uuid_create(&uid );
uuid_unpack(&uid, temp_sid);
snprintf(temp_sid2, sizeof(temp_sid2) - 1, "uuid:%s", temp_sid);
rc = snprintf(temp_sid2, sizeof(temp_sid2), "uuid:%s", temp_sid);
if (rc < 0 || (unsigned int) rc >= sizeof(temp_sid2)) {
return_code = UPNP_E_OUTOF_MEMORY;
goto error_handler;
}
UpnpString_set_String(out_sid, temp_sid2);
/* create event url */