summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de>2010-05-03 19:16:35 +0200
committerRalf Habacker <ralf.habacker@freenet.de>2010-05-10 21:52:34 +0200
commitb65a3f8ccae8123b4889ebaf3c240aa6e17ad996 (patch)
tree73aafb1cb945ee0786204f245a8425c22072184c
parentd5a6e590b85f5ad4567218491d0f848e005b5f48 (diff)
downloaddbus-b65a3f8ccae8123b4889ebaf3c240aa6e17ad996.tar.gz
Fix GetModuleFileNameA and RegQueryValueExA for Windows CE.
-rw-r--r--dbus/dbus-sysdeps-wince-glue.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/dbus/dbus-sysdeps-wince-glue.c b/dbus/dbus-sysdeps-wince-glue.c
index 5dd6ee1c..4d505f43 100644
--- a/dbus/dbus-sysdeps-wince-glue.c
+++ b/dbus/dbus-sysdeps-wince-glue.c
@@ -848,7 +848,10 @@ RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
/* If err is ERROR_MORE_DATA, there probably was a race condition.
We can punt this to the caller just as well. */
if (err)
- return err;
+ {
+ free (data);
+ return err;
+ }
/* NOTE: REG_MULTI_SZ and REG_EXPAND_SZ not supported, because they
are not needed in this module. */
@@ -860,10 +863,15 @@ RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
/* This is valid since we allocated one more above. */
data[data_len] = '\0';
data[data_len + 1] = '\0';
-
+
+ /* The cast is valid because malloc guarantees alignment of
+ basic types. */
data_c = _dbus_win_utf16_to_utf8 ((wchar_t*) data, NULL);
if (!data_c)
- return GetLastError();
+ {
+ free (data);
+ return GetLastError();
+ }
data_c_len = strlen (data_c) + 1;
_dbus_assert (data_c_len <= data_len + sizeof (wchar_t));
@@ -880,6 +888,7 @@ RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
else
memcpy (lpData, data, data_len);
}
+ free (data);
*lpcbData = data_len;
return err;
}
@@ -941,18 +950,33 @@ FormatMessageA (DWORD dwFlags, PCVOID lpSource, DWORD dwMessageId,
DWORD
GetModuleFileNameA (HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
{
- wchar_t filename_w[MAX_PATH];
+ wchar_t *filename_w;
char *filename_c;
DWORD len;
- _dbus_assert (MAX_PATH >= nSize);
+ if (nSize == 0)
+ {
+ /* Windows XP/2000. */
+ SetLastError (0);
+ return 0;
+ }
+
+ filename_w = malloc (sizeof (wchar_t) * nSize);
+ if (! filename_w)
+ return 0;
len = GetModuleFileNameW (hModule, filename_w, nSize);
if (len == 0)
- return 0;
+ {
+ /* Note: If we fail with ERROR_INSUFFICIENT_BUFFER, this is still
+ (approximately) correct. */
+ free (filename_w);
+ return 0;
+ }
filename_w[nSize - 1] = '\0';
filename_c = _dbus_win_utf16_to_utf8 (filename_w, NULL);
+ free (filename_w);
if (! filename_c)
return 0;