HRESULT CNodeFactory::ApplyNamespace(XML_NODE_INFO *pNodeInfo, LPWSTR *ppwzTokenNS, DWORD dwFlags) { HRESULT hr = S_OK; LPWSTR pwzToken = NULL; ASSERT(pNodeInfo && ppwzTokenNS); if (!StrCmpN(pNodeInfo->pwcText, XML_NAMESPACE_TAG, XML_NAMESPACE_TAG_LEN)) { hr = S_FALSE; goto Exit; } pwzToken = NEW(WCHAR[pNodeInfo->ulLen + 1]); if (!pwzToken) { hr = E_OUTOFMEMORY; goto Exit; } StrCpyNW(pwzToken, pNodeInfo->pwcText, pNodeInfo->ulLen + 1); hr = _nsmgr.Map(pwzToken, ppwzTokenNS, dwFlags); if (FAILED(hr)) { goto Exit; } Exit: SAFEDELETEARRAY(pwzToken); return hr; }
HRESULT AppendString(LPWSTR *ppwzHead, LPCWSTR pwzTail, DWORD dwLen) { HRESULT hr = S_OK; LPWSTR pwzBuf = NULL; DWORD dwLenBuf; ASSERT(ppwzHead && pwzTail); if (!*ppwzHead) { *ppwzHead = NEW(WCHAR[dwLen + 1]); if (!*ppwzHead) { hr = E_OUTOFMEMORY; goto Exit; } // StrCpyN takes length in chars *including* NULL char StrCpyNW(*ppwzHead, pwzTail, dwLen + 1); } else { dwLenBuf = lstrlenW(*ppwzHead) + dwLen + 1; pwzBuf = NEW(WCHAR[dwLenBuf]); if (!pwzBuf) { hr = E_OUTOFMEMORY; goto Exit; } StrCpyW(pwzBuf, *ppwzHead); StrNCatW(pwzBuf, pwzTail, dwLen + 1); SAFEDELETEARRAY(*ppwzHead); *ppwzHead = pwzBuf; } Exit: return hr; }
/************************************************************************* * SHGlobalCounterCreateNamedW [SHLWAPI.423] * * Unicode version of SHGlobalCounterCreateNamedA. */ HANDLE WINAPI SHGlobalCounterCreateNamedW(LPCWSTR lpszName, DWORD iInitial) { static const WCHAR szPrefix[] = { 's', 'h', 'e', 'l', 'l', '.', '\0' }; const int iPrefixLen = 6; WCHAR szBuff[MAX_PATH]; const int iBuffLen = sizeof(szBuff)/sizeof(WCHAR); SECURITY_DESCRIPTOR sd; SECURITY_ATTRIBUTES sAttr, *pSecAttr; HANDLE hRet; TRACE("(%s,%d)\n", debugstr_w(lpszName), iInitial); /* Create Semaphore name */ memcpy(szBuff, szPrefix, (iPrefixLen + 1) * sizeof(WCHAR)); if (lpszName) StrCpyNW(szBuff + iPrefixLen, lpszName, iBuffLen - iPrefixLen); /* Initialise security attributes */ pSecAttr = CreateAllAccessSecurityAttributes(&sAttr, &sd, 0); if (!(hRet = CreateSemaphoreW(pSecAttr , iInitial, MAXLONG, szBuff))) hRet = OpenSemaphoreW(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, 0, szBuff); return hRet; }
static void test_StrXXX_overflows(void) { CHAR str1[2*MAX_PATH+1], buf[2*MAX_PATH]; WCHAR wstr1[2*MAX_PATH+1], wbuf[2*MAX_PATH]; const WCHAR fmt[] = {'%','s',0}; STRRET strret; int ret; int i; for (i=0; i<2*MAX_PATH; i++) { str1[i] = '0'+(i%10); wstr1[i] = '0'+(i%10); } str1[2*MAX_PATH] = 0; wstr1[2*MAX_PATH] = 0; memset(buf, 0xbf, sizeof(buf)); expect_eq(StrCpyNA(buf, str1, 10), buf, PCHAR, "%p"); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], '\xbf', CHAR, "%x"); if (pStrCatBuffA) { expect_eq(pStrCatBuffA(buf, str1, 100), buf, PCHAR, "%p"); expect_eq(buf[99], 0, CHAR, "%x"); expect_eq(buf[100], '\xbf', CHAR, "%x"); } else win_skip("StrCatBuffA() is not available\n"); if (0) { /* crashes on XP */ StrCpyNW(wbuf, (LPCWSTR)0x1, 10); StrCpyNW((LPWSTR)0x1, wstr1, 10); } memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, (LPCWSTR)0x1, 1), wbuf, PWCHAR, "%p"); expect_eq(wbuf[0], 0, WCHAR, "%x"); expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, 0, 10), wbuf, PWCHAR, "%p"); expect_eq(wbuf[0], 0, WCHAR, "%x"); expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, 0, 0), wbuf, PWCHAR, "%p"); expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, wstr1, 0), wbuf, PWCHAR, "%p"); expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, wstr1, 10), wbuf, PWCHAR, "%p"); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); if (pStrCatBuffW) { expect_eq(pStrCatBuffW(wbuf, wstr1, 100), wbuf, PWCHAR, "%p"); expect_eq(wbuf[99], 0, WCHAR, "%x"); expect_eq(wbuf[100], (WCHAR)0xbfbf, WCHAR, "%x"); } else win_skip("StrCatBuffW() is not available\n"); if (pStrRetToBufW) { memset(wbuf, 0xbf, sizeof(wbuf)); strret.uType = STRRET_WSTR; U(strret).pOleStr = StrDupW(wstr1); expect_eq2(pStrRetToBufW(&strret, NULL, wbuf, 10), S_OK, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) /* Vista */, HRESULT, "%x"); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); } else win_skip("StrRetToBufW() is not available\n"); if (pStrRetToBufA) { memset(buf, 0xbf, sizeof(buf)); strret.uType = STRRET_CSTR; StrCpyN(U(strret).cStr, str1, MAX_PATH); expect_eq2(pStrRetToBufA(&strret, NULL, buf, 10), S_OK, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) /* Vista */, HRESULT, "%x"); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], (CHAR)0xbf, CHAR, "%x"); } else win_skip("StrRetToBufA() is not available\n"); if (pwnsprintfA) { memset(buf, 0xbf, sizeof(buf)); ret = pwnsprintfA(buf, 10, "%s", str1); ok(broken(ret == 9) || ret == -1 /* Vista */, "Unexpected wnsprintfA return %d, expected 9 or -1\n", ret); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], (CHAR)0xbf, CHAR, "%x"); } else win_skip("wnsprintfA() is not available\n"); if (pwnsprintfW) { memset(wbuf, 0xbf, sizeof(wbuf)); ret = pwnsprintfW(wbuf, 10, fmt, wstr1); ok(broken(ret == 9) || ret == -1 /* Vista */, "Unexpected wnsprintfW return %d, expected 9 or -1\n", ret); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); } else win_skip("wnsprintfW() is not available\n"); }