shell32: Dynamically allocate argify buffer if the static one is too small.
This commit is contained in:
parent
eeeca57072
commit
9b2968dc77
@ -781,7 +781,9 @@ static unsigned dde_connect(const WCHAR* key, const WCHAR* start, WCHAR* ddeexec
|
|||||||
static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0};
|
static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0};
|
||||||
WCHAR regkey[256];
|
WCHAR regkey[256];
|
||||||
WCHAR * endkey = regkey + strlenW(key);
|
WCHAR * endkey = regkey + strlenW(key);
|
||||||
WCHAR app[256], topic[256], ifexec[256], res[256];
|
WCHAR app[256], topic[256], ifexec[256], static_res[256];
|
||||||
|
WCHAR * dynamic_res=NULL;
|
||||||
|
WCHAR * res;
|
||||||
LONG applen, topiclen, ifexeclen;
|
LONG applen, topiclen, ifexeclen;
|
||||||
WCHAR * exec;
|
WCHAR * exec;
|
||||||
DWORD ddeInst = 0;
|
DWORD ddeInst = 0;
|
||||||
@ -896,9 +898,14 @@ static unsigned dde_connect(const WCHAR* key, const WCHAR* start, WCHAR* ddeexec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SHELL_ArgifyW(res, sizeof(res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline, &resultLen);
|
SHELL_ArgifyW(static_res, sizeof(static_res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline, &resultLen);
|
||||||
if (resultLen > sizeof(res)/sizeof(WCHAR))
|
if (resultLen > sizeof(static_res)/sizeof(WCHAR))
|
||||||
ERR("Argify buffer not large enough, truncated\n");
|
{
|
||||||
|
res = dynamic_res = HeapAlloc(GetProcessHeap(), 0, resultLen * sizeof(WCHAR));
|
||||||
|
SHELL_ArgifyW(dynamic_res, resultLen, exec, lpFile, pidl, szCommandline, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
res = static_res;
|
||||||
TRACE("%s %s => %s\n", debugstr_w(exec), debugstr_w(lpFile), debugstr_w(res));
|
TRACE("%s %s => %s\n", debugstr_w(exec), debugstr_w(lpFile), debugstr_w(res));
|
||||||
|
|
||||||
/* It's documented in the KB 330337 that IE has a bug and returns
|
/* It's documented in the KB 330337 that IE has a bug and returns
|
||||||
@ -922,6 +929,8 @@ static unsigned dde_connect(const WCHAR* key, const WCHAR* start, WCHAR* ddeexec
|
|||||||
WARN("DdeClientTransaction failed with error %04x\n", DdeGetLastError(ddeInst));
|
WARN("DdeClientTransaction failed with error %04x\n", DdeGetLastError(ddeInst));
|
||||||
ret = 33;
|
ret = 33;
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, dynamic_res);
|
||||||
|
|
||||||
DdeDisconnect(hConv);
|
DdeDisconnect(hConv);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user