The FormatMessage API needs to LocalFree the delivered error messages.
In cases where messages are delivered in non ASCII compatible encoding,
the messages might be unreadable. This aligns the error message encoding
with the encoding settings in PHP, the focus is UTF-8 as default.
Initialize error buffer
Avoid code duplication
#ifdef ZEND_WIN32
# include <wincrypt.h>
# include <process.h>
+# include "win32/winutil.h"
#endif
#include <stdio.h>
void
stderr_last_error(char *msg)
{
- LPSTR buf = NULL;
DWORD err = GetLastError();
+ char *buf = php_win32_error_to_msg(err);
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&buf,
- 0, NULL)) {
+ if (!buf[0]) {
fprintf(stderr, "\n%s: [0x%08lx]\n", msg, err);
}
else {
fprintf(stderr, "\n%s: [0x%08lx] %s\n", msg, err, buf);
}
+
+ php_win32_error_msg_free(buf);
}
#endif
werr = php_win32_error_to_msg(res);
spprintf(&msg, 0, "Failed to create COM object `%s': %s", module_name, werr);
- LocalFree(werr);
+ php_win32_error_msg_free(werr);
php_com_throw_exception(res, msg);
efree(msg);
case DISP_E_TYPEMISMATCH:
desc = php_win32_error_to_msg(hr);
spprintf(&msg, 0, "Parameter %d: %s", arg_err, desc);
- LocalFree(desc);
+ php_win32_error_msg_free(desc);
break;
case DISP_E_BADPARAMCOUNT:
default:
desc = php_win32_error_to_msg(hr);
spprintf(&msg, 0, "Error [0x%08x] %s", hr, desc);
- LocalFree(desc);
+ php_win32_error_msg_free(desc);
break;
}
hr = php_com_get_id_of_name(obj, f->function_name->val, f->function_name->len, &dispid);
if (FAILED(hr)) {
- char *winerr = NULL;
char *msg = NULL;
- winerr = php_win32_error_to_msg(hr);
+ char *winerr = php_win32_error_to_msg(hr);
spprintf(&msg, 0, "Unable to lookup `%s': %s", f->function_name->val, winerr);
- LocalFree(winerr);
+ php_win32_error_msg_free(winerr);
php_com_throw_exception(hr, msg);
efree(msg);
return FAILURE;
{
DISPID dispid;
HRESULT hr;
- char *winerr = NULL;
char *msg = NULL;
hr = php_com_get_id_of_name(obj, name, namelen, &dispid);
if (FAILED(hr)) {
- winerr = php_win32_error_to_msg(hr);
+ char *winerr = php_win32_error_to_msg(hr);
spprintf(&msg, 0, "Unable to lookup `%s': %s", name, winerr);
- LocalFree(winerr);
+ php_win32_error_msg_free(winerr);
php_com_throw_exception(hr, msg);
efree(msg);
return FAILURE;
char buf[1024];
char *err = php_win32_error_to_msg(hr);
snprintf(buf, sizeof(buf), "Failed to init .Net runtime [%s] %s", where, err);
- if (err)
- LocalFree(err);
+ php_win32_error_msg_free(err);
php_com_throw_exception(hr, buf);
return;
}
char buf[1024];
char *err = php_win32_error_to_msg(hr);
snprintf(buf, sizeof(buf), "Failed to re-init .Net domain [%s] %s", where, err);
- if (err)
- LocalFree(err);
+ php_win32_error_msg_free(err);
php_com_throw_exception(hr, buf);
ZVAL_NULL(object);
return;
char buf[1024];
char *err = php_win32_error_to_msg(hr);
snprintf(buf, sizeof(buf), "Failed to re-init .Net domain [%s] %s", where, err);
- if (err)
- LocalFree(err);
+ php_win32_error_msg_free(err);
php_com_throw_exception(hr, buf);
ZVAL_NULL(object);
return;
char buf[1024];
char *err = php_win32_error_to_msg(hr);
snprintf(buf, sizeof(buf), "Failed to instantiate .Net object [%s] [0x%08x] %s", where, hr, err);
- if (err && err[0]) {
- LocalFree(err);
- }
+ php_win32_error_msg_free(err);
php_com_throw_exception(hr, buf);
return;
}
zend_throw_exception(php_com_exception_class_entry, message, (zend_long)code);
#endif
if (free_msg) {
- LocalFree(message);
+ php_win32_error_msg_free(message);
}
}
php_error_docref(NULL, E_WARNING,
"Could not convert string to unicode: `%s'", msg);
- LocalFree(msg);
+ php_win32_error_msg_free(msg);
}
return olestring;
php_error_docref(NULL, E_WARNING,
"Could not convert string from unicode: `%s'", msg);
- LocalFree(msg);
+ php_win32_error_msg_free(msg);
}
if (string_len) {
werr = php_win32_error_to_msg(res);
spprintf(&msg, 0, "Variant type conversion failed: %s", werr);
- LocalFree(werr);
+ php_win32_error_msg_free(werr);
php_com_throw_exception(res, msg);
efree(msg);
werr = php_win32_error_to_msg(res);
spprintf(&msg, 0, "Variant type conversion failed: %s", werr);
- LocalFree(werr);
+ php_win32_error_msg_free(werr);
php_com_throw_exception(res, msg);
efree(msg);
werr = php_win32_error_to_msg(res);
spprintf(&msg, 0, "Variant type conversion failed: %s", werr);
- LocalFree(werr);
+ php_win32_error_msg_free(werr);
php_com_throw_exception(res, msg);
efree(msg);
#include "zend_shared_alloc.h"
#include "zend_accelerator_util_funcs.h"
#include "tsrm_win32.h"
+#include "win32/winutil.h"
#include <winbase.h>
#include <process.h>
#include <LMCONS.H>
static void zend_win_error_message(int type, char *msg, int err)
{
- LPVOID lpMsgBuf;
HANDLE h;
char *ev_msgs[2];
-
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL
- );
+ char *buf = php_win32_error_to_msg(err);
h = RegisterEventSource(NULL, TEXT(ACCEL_EVENT_SOURCE));
ev_msgs[0] = msg;
- ev_msgs[1] = lpMsgBuf;
+ ev_msgs[1] = buf;
ReportEvent(h, // event log handle
EVENTLOG_ERROR_TYPE, // event type
0, // category zero
NULL); // pointer to data
DeregisterEventSource(h);
- LocalFree( lpMsgBuf );
-
zend_accel_error(type, "%s", msg);
+
+ php_win32_error_msg_free(buf);
}
static char *create_name_with_username(char *name)
OPENSSL_free(der_buf);
if (cert_ctx == NULL) {
- php_error_docref(NULL, E_WARNING, "Error creating certificate context: %s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "Error creating certificate context: %s", err);
+ php_win_err_free(err);
RETURN_CERT_VERIFY_FAILURE(SSL_R_CERTIFICATE_VERIFY_FAILED);
}
}
chain_flags = CERT_CHAIN_CACHE_END_CERT | CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT;
if (!CertGetCertificateChain(NULL, cert_ctx, NULL, NULL, &chain_params, chain_flags, NULL, &cert_chain_ctx)) {
- php_error_docref(NULL, E_WARNING, "Error getting certificate chain: %s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "Error getting certificate chain: %s", err);
+ php_win_err_free(err);
CertFreeCertificateContext(cert_ctx);
RETURN_CERT_VERIFY_FAILURE(SSL_R_CERTIFICATE_VERIFY_FAILED);
}
CertFreeCertificateContext(cert_ctx);
if (!verify_result) {
- php_error_docref(NULL, E_WARNING, "Error verifying certificate chain policy: %s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "Error verifying certificate chain policy: %s", err);
+ php_win_err_free(err);
RETURN_CERT_VERIFY_FAILURE(SSL_R_CERTIFICATE_VERIFY_FAILED);
}
# include <Ws2tcpip.h>
# include "php_sockets.h"
# include <win32/sockets.h>
+# include <win32/winutil.h>
#else
# include <sys/types.h>
# include <sys/socket.h>
}
#else
{
- LPTSTR tmp = NULL;
+ char *tmp = php_win32_error_to_msg(error);
buf = NULL;
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &tmp, 0, NULL)
- ) {
+ if (tmp[0]) {
if (SOCKETS_G(strerror_buf)) {
efree(SOCKETS_G(strerror_buf));
}
if (SOCKET_ERROR == WSADuplicateSocket(socket->bsd_socket, (DWORD)target_pid, &wi)) {
DWORD err = WSAGetLastError();
- LPSTR buf = NULL;
-
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&buf,
- 0, NULL)) {
+ char *buf = php_win32_error_to_msg(err);
+
+ if (!buf[0]) {
php_error_docref(NULL, E_WARNING, "Unable to export WSA protocol info [0x%08lx]", err);
} else {
php_error_docref(NULL, E_WARNING, "Unable to export WSA protocol info [0x%08lx]: %s", err, buf);
}
+ php_win32_error_msg_free(buf);
+
RETURN_FALSE;
}
sock = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &wi, 0, 0);
if (INVALID_SOCKET == sock) {
DWORD err = WSAGetLastError();
- LPSTR buf = NULL;
-
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR)&buf,
- 0, NULL)) {
+ char *buf = php_win32_error_to_msg(err);
+
+ if (!buf[0]) {
php_error_docref(NULL, E_WARNING, "Unable to import WSA protocol info [0x%08lx]", err);
} else {
php_error_docref(NULL, E_WARNING, "Unable to import WSA protocol info [0x%08lx]: %s", err, buf);
}
+ php_win32_error_msg_free(buf);
+
RETURN_FALSE;
}
if (err && (*err)) {
size_t i = strlen(err);
(*errp)=estrdup(err);
- LocalFree(err);
+ php_win32_error_msg_free(err);
while (i > 0 && isspace((*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; }
} else {
(*errp) = estrdup("<No message>");
php_ignore_value(nice(pri));
if (errno) {
#ifdef PHP_WIN32
- php_error_docref(NULL, E_WARNING, "%s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "%s", err);
+ php_win_err_free(err);
#else
php_error_docref(NULL, E_WARNING, "Only a super user may attempt to increase the priority of a process");
#endif
PHP_WIN32_IOUTIL_INIT_W(path)
if (GetDiskFreeSpaceExW(pathw, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == 0) {
- php_error_docref(NULL, E_WARNING, "%s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "%s", err);
+ php_win_err_free(err);
PHP_WIN32_IOUTIL_CLEANUP_W()
return FAILURE;
}
PHP_WIN32_IOUTIL_INIT_W(path)
if (GetDiskFreeSpaceExW(pathw, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == 0) {
- php_error_docref(NULL, E_WARNING, "%s", php_win_err());
+ char *err = php_win_err();
+ php_error_docref(NULL, E_WARNING, "%s", err);
+ php_win_err_free(err);
PHP_WIN32_IOUTIL_CLEANUP_W()
return FAILURE;
}
-/* Generated by re2c 1.0.1 */
+/* Generated by re2c 1.0.3 */
#line 1 "ext/standard/var_unserializer.re"
/*
+----------------------------------------------------------------------+
/* }}} */
#ifdef PHP_WIN32
-#define PHP_WIN32_ERROR_MSG_BUFFER_SIZE 512
PHPAPI ZEND_COLD void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2) {
- if (error == 0) {
- php_error_docref2(NULL, param1, param2, E_WARNING, "%s", strerror(errno));
- } else {
- char buf[PHP_WIN32_ERROR_MSG_BUFFER_SIZE + 1];
- size_t buf_len;
-
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, buf, PHP_WIN32_ERROR_MSG_BUFFER_SIZE, NULL);
- buf_len = strlen(buf);
- if (buf_len >= 2) {
- buf[buf_len - 1] = '\0';
- buf[buf_len - 2] = '\0';
- }
- php_error_docref2(NULL, param1, param2, E_WARNING, "%s (code: %lu)", (char *)buf, error);
+ char *buf = php_win32_error_to_msg(error);
+ size_t buf_len;
+
+ buf_len = strlen(buf);
+ if (buf_len >= 2) {
+ buf[buf_len - 1] = '\0';
+ buf[buf_len - 2] = '\0';
}
+ php_error_docref2(NULL, param1, param2, E_WARNING, "%s (code: %lu)", buf, error);
+ php_win32_error_msg_free(buf);
}
-#undef PHP_WIN32_ERROR_MSG_BUFFER_SIZE
#endif
/* {{{ php_html_puts */
#ifdef PHP_WIN32
# include <Ws2tcpip.h>
# include "win32/inet.h"
+# include "win32/winutil.h"
# define O_RDONLY _O_RDONLY
# include "win32/param.h"
#else
}
return buf;
#else
- char *sysbuf;
- int free_it = 1;
-
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR)&sysbuf,
- 0,
- NULL)) {
- free_it = 0;
+ char *sysbuf = php_win32_error_to_msg(err);
+ if (!sysbuf[0]) {
sysbuf = "Unknown Error";
}
buf[bufsize?(bufsize-1):0] = 0;
}
- if (free_it) {
- LocalFree(sysbuf);
- }
+ php_win32_error_msg_free(sysbuf);
return buf;
#endif
return zend_string_init(errstr, strlen(errstr), 0);
#else
zend_string *ret;
- char *sysbuf;
- int free_it = 1;
-
- if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR)&sysbuf,
- 0,
- NULL)) {
- free_it = 0;
+
+ char *sysbuf = php_win32_error_to_msg(err);
+ if (!sysbuf[0]) {
sysbuf = "Unknown Error";
}
ret = zend_string_init(sysbuf, strlen(sysbuf), 0);
- if (free_it) {
- LocalFree(sysbuf);
- }
+ php_win32_error_msg_free(sysbuf);
return ret;
#endif
#include "php_scandir.h"
#ifdef PHP_WIN32
#include "win32/php_registry.h"
+#include "win32/winutil.h"
#endif
#if HAVE_SCANDIR && HAVE_ALPHASORT && HAVE_DIRENT_H
char *err_text = php_win32_error_to_msg(err);
fprintf(stderr, "unable to get current command line: [0x%08lx]: %s\n", err, err_text);
+ php_win32_error_msg_free(err_text);
goto parent_out;
}
fprintf(stderr, "unable to create job object: [0x%08lx]: %s\n", err, err_text);
+ php_win32_error_msg_free(err_text);
+
goto parent_out;
}
char *err_text = php_win32_error_to_msg(err);
fprintf(stderr, "unable to configure job object: [0x%08lx]: %s\n", err, err_text);
+ php_win32_error_msg_free(err_text);
}
while (parent) {
char *err_text = php_win32_error_to_msg(err);
fprintf(stderr, "unable to assign child process to job object: [0x%08lx]: %s\n", err, err_text);
+ php_win32_error_msg_free(err_text);
}
CloseHandle(pi.hThread);
} else {
kid_cgi_ps[i] = NULL;
fprintf(stderr, "unable to spawn: [0x%08lx]: %s\n", err, err_text);
+ php_win32_error_msg_free(err_text);
}
}
char *err = GET_DL_ERROR();
if (err && err[0]) {
phpdbg_error("dl", "type=\"unknown\"", "%s", err);
- LocalFree(err);
+ php_win32_error_msg_free(err);
} else {
phpdbg_error("dl", "type=\"unknown\"", "Unknown reason");
}
#include "php.h"
#include "winutil.h"
+#include "codepage.h"
#include <bcrypt.h>
#include <lmcons.h>
PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error)
{/*{{{*/
- char *buf = NULL;
+ wchar_t *bufw = NULL;
+ char *buf;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, 0, NULL
+ DWORD ret = FormatMessageW(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&bufw, 0, NULL
);
- return (buf ? (char *) buf : "");
+ if (!ret || !bufw) {
+ return "";
+ }
+
+ buf = php_win32_cp_conv_w_to_any(bufw, ret, PHP_WIN32_CP_IGNORE_LEN_P);
+
+ LocalFree(bufw);
+
+ return (buf ? buf : "");
+}/*}}}*/
+
+PHP_WINUTIL_API void php_win32_error_msg_free(char *msg)
+{/*{{{*/
+ if (msg && msg[0]) {
+ free(msg);
+ }
}/*}}}*/
int php_win32_check_trailing_space(const char * path, const size_t path_len)
#endif
PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error);
+PHP_WINUTIL_API void php_win32_error_msg_free(char *msg);
#define php_win_err() php_win32_error_to_msg(GetLastError())
+#define php_win_err_free(err) php_win32_error_msg_free(err)
int php_win32_check_trailing_space(const char * path, const size_t path_len);
PHP_WINUTIL_API int php_win32_get_random_bytes(unsigned char *buf, size_t size);
#ifdef PHP_EXPORTS