On 2017-03-05 01:40, hbelusca(a)svn.reactos.org wrote:
+
+ /*
+ * Check whether we actually just retrieved the needed buffer size
+ * because our previous local allocation did fail. If so, allocate
+ * a new buffer and retry again.
+ */
+ if ( (!UnicodeQuerySet) && (*lpdwBufferLength >= sizeof(WSAQUERYSETW))
&&
+ (ErrorCode == SOCKET_ERROR) && (GetLastError() == WSAEFAULT) )
Seems like you'd want to check WSAGetLastError when looking for WSA*
error codes.
+ {
+ /* Allocate the buffer we'll use */
+ UnicodeQuerySet = HeapAlloc(WsSockHeap, 0, UnicodeQuerySetSize);
+ if (UnicodeQuerySet)
+ {
+ /* Call the Unicode Function */
+ ErrorCode = WSALookupServiceNextW(hLookup,
+ dwControlFlags,
+ &UnicodeQuerySetSize,
+ UnicodeQuerySet);
+ }
+ /*
+ * Otherwise the allocation failed and we
+ * fall back into the error checks below.
+ */
+ }
+
if (ErrorCode == ERROR_SUCCESS)
{
- /* Not convert to ANSI */
+ /* Now convert back to ANSI */
ErrorCode = MapUnicodeQuerySetToAnsi(UnicodeQuerySet,
lpdwBufferLength,
lpqsResults);
- if (ErrorCode != ERROR_SUCCESS) SetLastError(ErrorCode);
+ if (ErrorCode != ERROR_SUCCESS)
+ SetLastError(ErrorCode);
}
else
{
@@ -499,10 +542,11 @@
}
/* If we had a local buffer, free it */
- if (UnicodeQuerySet) HeapFree(WsSockHeap, 0, UnicodeQuerySet);
+ if (UnicodeQuerySet)
+ HeapFree(WsSockHeap, 0, UnicodeQuerySet);
HeapFree(NULL) is fine by the way.
/* Return to caller */
- return ErrorCode == ERROR_SUCCESS ? ErrorCode : SOCKET_ERROR;
+ return (ErrorCode == ERROR_SUCCESS) ? ErrorCode : SOCKET_ERROR;
}