2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-29 15:28:56 +00:00

util: Pre-allocate buffer for ovs_lasterror_to_string().

This lets us call ovs_lasterror_to_string() and not having
to do an extra call of LocalFree() on the returned string.

Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Gurucharan Shetty
2014-02-14 08:12:32 -08:00
parent f4c340e1d9
commit 315ea327a6
5 changed files with 21 additions and 32 deletions

View File

@@ -60,10 +60,8 @@ get_entropy(void *buffer, size_t n)
CryptAcquireContext(&crypt_prov, NULL, NULL,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
if (!CryptGenRandom(crypt_prov, n, buffer)) {
char *msg_buf = ovs_lasterror_to_string();
VLOG_ERR("CryptGenRandom: read error (%s)", ovs_lasterror_to_string());
error = EINVAL;
VLOG_ERR("CryptGenRandom: read error (%s)", msg_buf);
LocalFree(msg_buf);
}
CryptReleaseContext(crypt_prov, 0);

View File

@@ -285,9 +285,7 @@ lockfile_try_lock_windows(const char *name, pid_t *pidp,
retval = LockFileEx(lock_handle, LOCKFILE_EXCLUSIVE_LOCK
| LOCKFILE_FAIL_IMMEDIATELY, 0, 1, 0, &overl);
if (!retval) {
char *msg_buf = ovs_lasterror_to_string();
VLOG_WARN("Failed to lock file : %s", msg_buf);
LocalFree(msg_buf);
VLOG_WARN("Failed to lock file : %s", ovs_lasterror_to_string());
return EEXIST;
}

View File

@@ -65,13 +65,6 @@ VLOG_DEFINE_THIS_MODULE(socket_util);
* space for a null terminator. */
#define MAX_UN_LEN (sizeof(((struct sockaddr_un *) 0)->sun_path) - 1)
#ifdef _WIN32
/* Buffer used by sock_strerror(). */
DEFINE_STATIC_PER_THREAD_DATA(struct { char s[128]; },
sockerror_buffer,
{ "" });
#endif
static int getsockopt_int(int fd, int level, int option, const char *optname,
int *valuep);
@@ -1355,21 +1348,15 @@ ss_length(const struct sockaddr_storage *ss)
/* For Windows socket calls, 'errno' is not set. One has to call
* WSAGetLastError() to get the error number and then pass it to
* FormatMessage() (through this function) to get the correct error string.
* this function to get the correct error string.
*
* ovs_strerror() calls strerror_r() and would not get the correct error
* string for Windows sockets, but is good for POSIX. */
const char *
sock_strerror(int error)
{
#ifdef _WIN32
enum { BUFSIZE = sizeof sockerror_buffer_get()->s };
char *buffer = sockerror_buffer_get()->s;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0,
buffer, BUFSIZE, NULL);
return buffer;
return ovs_format_message(error);
#else
return ovs_strerror(error);
#endif

View File

@@ -50,7 +50,7 @@ DEFINE_PER_THREAD_MALLOCED_DATA(char *, subprogram_name);
/* --version option output. */
static char *program_version;
/* Buffer used by ovs_strerror(). */
/* Buffer used by ovs_strerror() and ovs_format_message(). */
DEFINE_STATIC_PER_THREAD_DATA(struct { char s[128]; },
strerror_buffer,
{ "" });
@@ -1666,17 +1666,22 @@ exit:
#ifdef _WIN32
/* Calls FormatMessage() with GetLastError() as an argument. Returns
* pointer to a buffer that receives the null-terminated string that specifies
* the formatted message and that has to be freed by the caller with
* LocalFree(). */
char *
ovs_format_message(int error)
{
enum { BUFSIZE = sizeof strerror_buffer_get()->s };
char *buffer = strerror_buffer_get()->s;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, error, 0, buffer, BUFSIZE, NULL);
return buffer;
}
/* Returns a null-terminated string that explains the last error.
* Use this function to get the error string for WINAPI calls. */
char *
ovs_lasterror_to_string(void)
{
char *buffer;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0,
(char *)&buffer, 0, NULL);
return buffer;
return ovs_format_message(GetLastError());
}
#endif

View File

@@ -491,6 +491,7 @@ uint64_t bitwise_get(const void *src, unsigned int src_len,
#ifdef _WIN32
char *ovs_format_message(int error);
char *ovs_lasterror_to_string(void);
#endif