
FreeRDP แแ แแก แแแกแขแแแชแแฃแ แ แแแแแแฃแขแแ แแก แแแ แแแแกแแแแก แจแแแฃแจแแแแแฃแแ Microsoft-แแก แแแแ แจแแแฃแจแแแแแฃแแ แแแกแขแแแชแแฃแ แ แกแแแฃแจแแ แแแแแแแก แแ แแขแแแแแแก (RDP) แฆแแ แแแแแก แแแแแแแแแขแแชแแ. แแ แแแฅแขแ แแฎแแ แก แฃแญแแ แก แแ แแแแ แแแแขแคแแ แแแก, แแแ แจแแ แแก Windows, Linux, macOS แแ iOS-แแแแช แแ Androidแแก แแ แแแฅแขแ แจแแแ แฉแ, แ แแแแ แช แแแ แแแแ แกแขแแขแแแแแก แกแแ แแแจแ, แ แแแแแแช แแซแฆแแแแแ RDP แแแแแแขแแแแก แขแแกแขแแ แแแแก PVS-Studio แกแขแแขแแแฃแ แ แแแแแแแแขแแ แแก แแแแแงแแแแแแ.
แแแขแแ แ แแกแขแแ แแแก
แแ แแแฅแขแ แแแฉแแแ แแแก แจแแแแแ, แ แแช แแแแแ แแกแแคแขแแ แแแฎแกแแ แกแแแชแแคแแแแชแแแแ แแแกแ แกแแแฃแแ แแแแก RDP แแ แแขแแแแแแกแแแแก. แแ แแ แแก แแ แกแแแแแแ rdesktop แแแแแแขแ, แ แแแแแก แแแแฎแแ แชแแแแแแ แแคแฃแซแแแแแแ Reverse Engineering-แแก แจแแแแแแแก.
แ แแแแ แช แแ แแขแแแแแ แแแแฎแแ แชแแแแแ, แฃแคแ แ แ แแฃแแ แแแฎแแ แแฎแแแ แคแฃแแฅแชแแแแแก แแแแแขแแแ แแแแ แแแแแแแ แแ แแแฅแขแแก แแ แฅแแขแแฅแขแฃแ แแก แแแแ. แแแกแจแ แแแแฎแแ แชแแแแแแฃแแแ แชแแแแแแแแแแ แฌแแ แแแจแแ แแแแคแแแฅแขแ แแแแแแแแแ แแแก แจแแ แแก, แ แแแแช แแแแแแฌแแแ rdesktop-แแก แฉแแแแแแก แจแแฅแแแ - FreeRDP. แแ แแแฃแฅแขแแก แจแแแแแแแ แแแแ แชแแแแแ แจแแแฆแฃแแฃแแ แแงแ GPLv2 แแแชแแแแแแ, แ แแก แจแแแแแแแแช แแแฆแแแฃแ แแฅแแ แแแแแฌแงแแแขแแแแแ แแแกแ แฎแแแแฎแแแ แแแชแแแแแ แแแ Apache License v2-แแ. แแฃแแชแ, แงแแแแ แแ แแแแแแฎแแแ แแแแ แแแแแก แแแชแแแแแแก แจแแชแแแแก, แแแแขแแ แแแแแแแแแ แแแแ แแแแแฌแงแแแขแแก แแแแแแฌแแ แแ แแ แแแฅแขแ, แ แแก แจแแแแแแแแช แจแแแฅแแแ แแแแแแแแ แแแ แแแแแแแก แแแแ.
แแ แแแฅแขแแก แแกแขแแ แแแก แจแแกแแฎแแ แแแขแ แจแแแแซแแแแ แฌแแแแแแฎแแ แแแแแแก แแคแแชแแแแฃแ แแแกแขแจแ: โFreeRDP แแ แแแฅแขแแก แแกแขแแ แแโ.
แแแแแแงแแแแแ แ แแแแ แช แแแกแขแ แฃแแแแขแ แแแแจแ แจแแชแแแแแแแกแ แแ แแแขแแแชแแฃแ แ แแแฃแชแแแแแแแก แแแแแขแแคแแชแแ แแแแกแแแแก. แแก แแ แแก แกแขแแขแแแฃแ แ แแแแแก แแแแแแแแขแแ แ C, C++, C# แแ Java-แกแแแแก, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ แแแแขแคแแ แแแแแ. Windows, Linux ะธ macOS.
แกแขแแขแแแจแ แฌแแ แแแแแแแแแแ แแฎแแแแ แแก แจแแชแแแแแแ, แ แแแแแแแช แงแแแแแแ แกแแแแขแแ แแกแ แแแฉแแแแแแแแ.
แแแฎแกแแแ แแแแก แแแแแแแ
แคแฃแแฅแชแแแแแ แแแแแแแแ 'cwd' แแแฉแแแแแแแแก แแแแแแแกแฃแคแแแแแก แแแ แแจแ. แจแแกแแซแแแแแแแ แแแฎแกแแแ แแแแก แแแแแแแ. แแแ แแแ.c 84
DWORD GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer)
{
char* cwd;
....
cwd = getcwd(NULL, 0);
....
if (lpBuffer == NULL)
{
free(cwd);
return 0;
}
if ((length + 1) > nBufferLength)
{
free(cwd);
return (DWORD) (length + 1);
}
memcpy(lpBuffer, cwd, length + 1);
return length;
....
}แแก แคแ แแแแแแขแ แแฆแแแฃแแแ winpr แฅแแแกแแกแขแแแแแแ, แ แแแแแแช แแฎแแ แชแแแแแแก WINAPI แจแแคแฃแแแแก แแ แ-Windows แกแแกแขแแแแแ, แแแฃ แแก Wine-แแก แแกแฃแแฃแฅแ แแแแแแแแ. แแฅ แจแแแแซแแแแ แแฎแแแแ แแแแแแแ: แคแฃแแฅแชแแ แแแแฌแแแแแก แแแฎแกแแแ แแแแก getcwd, แแฎแกแแแแ แแฎแแแแ แกแแแชแแแแฃแ แ แจแแแแฎแแแแแแแก แแแแฃแจแแแแแแกแแก. แจแแชแแแแแก แแแแแกแแกแฌแแ แแแแแ แกแแญแแ แแ แแแ แแก แแแแแขแแแ แฃแคแแกแ แจแแแแแ แแแแแแแแ แ.
แแแกแแแ แกแแแฆแแ แแแก แแแ แแ
แแแกแแแแก แแแแแคแแ แแ แจแแกแแซแแแแแแแ. 'event->EventHandlerCount' แแแแแฅแกแแก แแแแจแแแแแแแแ แจแแแซแแแแ แแแแฆแฌแแแก 32-แก. PubSub.c 117
#define MAX_EVENT_HANDLERS 32
struct _wEventType
{
....
int EventHandlerCount;
pEventHandler EventHandlers[MAX_EVENT_HANDLERS];
};
int PubSub_Subscribe(wPubSub* pubSub, const char* EventName,
pEventHandler EventHandler)
{
....
if (event->EventHandlerCount <= MAX_EVENT_HANDLERS)
{
event->EventHandlers[event->EventHandlerCount] = EventHandler;
event->EventHandlerCount++;
}
....
}แแก แแแแแแแแ แแแแขแแแก แแฎแแ แแแแแแแขแก แกแแแจแ แแแจแแแแช แแ, แแฃ แแแแแแแขแแแแก แ แแแแแแแแแ แแแฅแกแแแฃแแก แแแแฆแฌแแ. แแฅ แกแแแแแ แแกแแ แแแแ แแขแแ แแก แจแแชแแแ <= on <, แ แแแ แแ แแแกแชแแแก แแแกแแแแก แกแแแฆแแ แแแก.
แแฆแแแฉแแแแแแ แแ แขแแแแก แแแแแ แแ แแ แจแแชแแแแ:
- V557 แแแกแแแแก แแแแแคแแ แแ แจแแกแแซแแแแแแแ. 'iBitmapFormat' แแแแแฅแกแแก แฆแแ แแแฃแแแแแ แจแแแซแแแแ แแแแฆแฌแแแก 8-แก. orders.c 2623
แจแแชแแแแแแแก แจแแชแแแแ
แคแ แแแแแแขแ 1
แแแแแแฅแแ '!pipe->In' แงแแแแแแแแก แแชแแแ แแ. MessagePipe.c 63
wMessagePipe* MessagePipe_New()
{
....
pipe->In = MessageQueue_New(NULL);
if (!pipe->In)
goto error_in;
pipe->Out = MessageQueue_New(NULL);
if (!pipe->In) // <=
goto error_out;
....
}แแฅ แฉแแแ แแฎแแแแแ แกแแแ แแ แจแแชแแแแแก: แแแแ แ แแแ แแแ แแแแฌแแแแก แแแแแ แชแแแแแก, แ แแแแ แช แแแ แแแแ. แกแแแแ แแฃแแแ, แจแแชแแแแ แแแฉแแแ แแแแแก แฌแแ แฃแแแขแแแแแ แแแแแ แแแแก แจแแแแแแ.
แคแ แแแแแแขแ 2
แแแแแแแแ แแแแแขแฃแ แ แขแแฅแกแขแแก แแ แ แแแแแ. แแแแ แ แแแแแ แแฌแงแแแ แกแขแ แแฅแแแแแแ 771. tsg.c 770
typedef struct _TSG_PACKET_VERSIONCAPS
{
....
UINT16 majorVersion;
UINT16 minorVersion;
....
} TSG_PACKET_VERSIONCAPS, *PTSG_PACKET_VERSIONCAPS;
static BOOL TsProxyCreateTunnelReadResponse(....)
{
....
PTSG_PACKET_VERSIONCAPS versionCaps = NULL;
....
/* MajorVersion (2 bytes) */
Stream_Read_UINT16(pdu->s, versionCaps->majorVersion);
/* MinorVersion (2 bytes) */
Stream_Read_UINT16(pdu->s, versionCaps->majorVersion);
....
}แแแแแ แแ แแ แจแแชแแแแ: แแแแแก แแแแแแขแแ แ แแฃแแแกแฎแแแแก, แ แแ แแแแ แฃแแแ แแแแแแแก แแชแแ แ แแแ แกแแแแฃแแชแ, แแแแฎแแ แฎแแแแ แชแแแแแจแ แกแแฎแแแแ แซแแ แแแแแ แแแ แกแแ. แแฃแแชแ, แแ แแ แแแชแแแ แแ แแขแแแแแก, แแกแ แ แแ, แแก แแฎแแแแ แแแ แแฃแแแ.
แคแ แแแแแแขแ 3
แฃแชแแแฃแ แแ, แ แแ "trio_index_last" แคแฃแแฅแชแแแก แกแฎแแฃแแ แกแ แฃแแแ แแฅแแแแแแแแขแฃแ แแ "trio_index" แคแฃแแฅแชแแแก. triostr.c 933
/**
Find first occurrence of a character in a string.
....
*/
TRIO_PUBLIC_STRING char *
trio_index
TRIO_ARGS2((string, character),
TRIO_CONST char *string,
int character)
{
assert(string);
return strchr(string, character);
}
/**
Find last occurrence of a character in a string.
....
*/
TRIO_PUBLIC_STRING char *
trio_index_last
TRIO_ARGS2((string, character),
TRIO_CONST char *string,
int character)
{
assert(string);
return strchr(string, character);
}แแแแแแขแแ แแก แแแฎแแแแแ แแแแกแฏแแแแแ, แคแฃแแฅแชแแ แขแ แแ_แแแแแฅแกแ แแแฃแแแแก แแแ แแแแ แกแแแแแแแแแแก แจแแกแแขแงแแแกแก แกแขแ แแฅแแแจแ, แ แแแแกแแช trio_index_last - แแแแ แ แแ. แแแแ แแ แแ แคแฃแแฅแชแแแแแก แแ แแแแแแแ แแแแแขแฃแ แแ! แแแแ แแแแแแแแแ, แแก แจแแชแแแแแ แแ แคแฃแแฅแชแแแจแแ trio_index_last แแแแแงแแแแแ แกแญแแ แแแแ strhrchr แแแชแแแแ strchr. แแแจแแ แฅแชแแแ แแฅแแแแ แแแกแแแแแแแแ.
แคแ แแแแแแขแ 4
"แแแแแชแแแแ" แแแฉแแแแแแแแ แแแแแแแแฅแแแแจแ แฃแแ แแก nullptr. แแ แแแฉแแแแแแแแแ แแ แแแแแขแแแฃแแ แแแฅแแแแแแแแแก แจแแแแแแ แแแฆแแแฃแแ แแแแจแแแแแแแ แฃแแแ แแ แแ แแก แแ แฃแแแ แแฅแแแก แแแแแงแแแแแฃแแ. nsc_encode.c 124
static BOOL nsc_encode_argb_to_aycocg(NSC_CONTEXT* context,
const BYTE* data,
UINT32 scanline)
{
....
if (!context || data || (scanline == 0))
return FALSE;
....
src = data + (context->height - 1 - y) * scanline;
....
}แ แแแแ แช แฉแแแก, แฃแแ แงแแคแแก แแแแ แแขแแ แ แแฅ แจแแแแฎแแแแแ แแแแแขแแแ ! แแฎแแแก แแแแแชแแแแแ. แฃแชแแแฃแ แแ, แ แแ แแก แจแแฃแแฉแแแแแแ แแแ แฉแ.
แคแ แแแแแแขแ 5
แแแแแแแแแแ "if (A) {โฆ} else if (A) {...}" แแแแฃแจแแก แแแแแงแแแแแ. แแ แกแแแแแก แแแแแแฃแ แ แจแแชแแแแแก แแ แกแแแแแแก แแแแแแแแ. แจแแแแแฌแแแ แฎแแแแแ: 213, 222. rdpei_common.c 213
BOOL rdpei_write_4byte_unsigned(wStream* s, UINT32 value)
{
BYTE byte;
if (value <= 0x3F)
{
....
}
else if (value <= 0x3FFF)
{
....
}
else if (value <= 0x3FFFFF)
{
byte = (value >> 16) & 0x3F;
Stream_Write_UINT8(s, byte | 0x80);
byte = (value >> 8) & 0xFF;
Stream_Write_UINT8(s, byte);
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x3FFFFF)
{
byte = (value >> 24) & 0x3F;
Stream_Write_UINT8(s, byte | 0xC0);
byte = (value >> 16) & 0xFF;
Stream_Write_UINT8(s, byte);
byte = (value >> 8) & 0xFF;
Stream_Write_UINT8(s, byte);
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
....
}แแแแ แแ แ แแแ แแแ แแแแแแ: แ แแแแ แช แฉแแแก, แแแฆแแชแแ แแแแแแฌแงแแ แแแแ แจแแแแฌแแแแ แแแแแ แแแแก แจแแแแแ. แแแแแแแ แจแแกแแแฉแแแแแ, แ แแ แแแแ แแแฌแแแ แแฃแจแแแแก แแแฎแแแแขแแแแ แแแแจแแแแแแแแแแ, แแแแขแแ แจแแแแแซแแแ แแแแแ แแฃแแแ, แ แแ แแแแ แแแ แแแ แฃแแแ แแงแแก แแแแจแแแแแแแ <= 0x3FFFFFFFF.
แแฆแแแฉแแแแแแ แแ แขแแแแก แแแแแ แแ แแ แจแแชแแแแ:
- V517 แแแแแแแแแแ "if (A) {โฆ} else if (A) {...}" แแแแฃแจแแก แแแแแงแแแแแ. แแ แกแแแแแก แแแแแแฃแ แ แจแแชแแแแแก แแ แกแแแแแแก แแแแแแแแ. แจแแแแแฌแแแ แฎแแแแแ: 169, 173. แคแแแแ.c 169
แจแแงแแแแแก แแแแแชแแแแแแก แแแแแกแขแฃแ แแแ
แคแ แแแแแแขแ 1
แแแแแแฅแแ 'strcat(แกแแแแแแ, แฌแงแแ แ) != NULL' แงแแแแแแแแก แแแ แแแแแ. triostr.c 425
TRIO_PUBLIC_STRING int
trio_append
TRIO_ARGS2((target, source),
char *target,
TRIO_CONST char *source)
{
assert(target);
assert(source);
return (strcat(target, source) != NULL);
}แแ แแแแแแแแจแ แคแฃแแฅแชแแแก แจแแแแแแก แจแแแแฌแแแแ แแ แแกแฌแแ แแ. แคแฃแแฅแชแแ strcat แแแ แฃแแแแก แแแฉแแแแแแแแก แกแขแ แแฅแแแแก แกแแแแแแ แแแ แกแแแก, แ.แ. แแแ แแแแ แแแ แแแแขแ แ แแแแแแ. แแ แจแแแแฎแแแแแจแ แแกแแ แกแแแแแแ. แแฃแแชแ แแฃ แแแแแแแ แแ NULL, แแแจแแ แฃแแแ แแแแแแแ แแแกแ แจแแแแฌแแแแ, แ แแแแแ แคแฃแแฅแชแแแจแแ strcat แแแ แแแฃแฅแแแแแ.
แคแ แแแแแแขแ 2
แแแแแแฅแแ "แฅแแจแ" แงแแแแแแแแก แแแ แแแแแ. แแแแคแ.c 730
typedef struct rdp_glyph_cache rdpGlyphCache;
struct rdp_glyph_cache
{
....
GLYPH_CACHE glyphCache[10];
....
};
void glyph_cache_free(rdpGlyphCache* glyphCache)
{
....
GLYPH_CACHE* cache = glyphCache->glyphCache;
if (cache)
{
....
}
....
}แแ แจแแแแฎแแแแแจแ แชแแแแแ cache แแแแแญแแแฃแแแ แกแขแแขแแแฃแ แ แแแกแแแแก แแแกแแแแ แแ glyphCache->glyphCache. แแแ แแแแ, แจแแแแแฌแแแ แแฃ (แฅแแจแ) แจแแแซแแแแ แแแแแขแแแแแก.
แ แแกแฃแ แกแแแแก แแแ แแแแก แจแแชแแแแ
แ แแกแฃแ แกแ แจแแซแแแแแ แแฅแแ "CreateFileA" แคแฃแแฅแชแแแก แแแแแงแแแแแแ, แแแแ แแ แแแแแแแแ แจแแฃแแแแกแแแแแ "fclose" แคแฃแแฅแชแแแก แแแแแงแแแแแแ. แแแฌแแแแ.c 447
BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{
HANDLE fp;
....
fp = CreateFileA(certificate_store->file, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
....
if (size < 1)
{
CloseHandle(fp);
return FALSE;
}
....
if (!data)
{
fclose(fp);
return FALSE;
}
....
}แคแแแแแก แแฆแแฌแแ แ fp, แจแแฅแแแแแ แคแฃแแฅแชแแแก แแแแแซแแฎแแแแ แจแแฅแแแแแ แคแแแแ แแแแฎแฃแ แ แจแแชแแแแแ แคแฃแแฅแชแแแ fclose แกแขแแแแแ แขแฃแแ แแแแแแแแแแแแแ, แแ แ CloseHandle.
แแแแแ แแแ แแแแแ
แแ แแแแแแแแก แแแแ แแแ แแแแแแแกแแแฃแแ โแแฃโ แแแแชแฎแแแแแแแแก แแแ แแแแแ แแแแแแแแฅแแแแแแ แแแแแขแฃแ แแ. แจแแแแแฌแแแ แฎแแแแแ: 269, 283. ndr_structure.c 283
void NdrComplexStructBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char* pMemory, PFORMAT_STRING pFormat)
{
....
if (conformant_array_description)
{
ULONG size;
unsigned char array_type;
array_type = conformant_array_description[0];
size = NdrComplexStructMemberSize(pStubMsg, pFormat);
WLog_ERR(TAG, "warning: NdrComplexStructBufferSize array_type: "
"0x%02X unimplemented", array_type);
NdrpComputeConformance(pStubMsg, pMemory + size,
conformant_array_description);
NdrpComputeVariance(pStubMsg, pMemory + size,
conformant_array_description);
MaxCount = pStubMsg->MaxCount;
ActualCount = pStubMsg->ActualCount;
Offset = pStubMsg->Offset;
}
if (conformant_array_description)
{
unsigned char array_type;
array_type = conformant_array_description[0];
pStubMsg->MaxCount = MaxCount;
pStubMsg->ActualCount = ActualCount;
pStubMsg->Offset = Offset;
WLog_ERR(TAG, "warning: NdrComplexStructBufferSize array_type: "
"0x%02X unimplemented", array_type);
}
....
}แแก แแแแแแแแ แจแแแซแแแแ แแ แแงแแก แจแแชแแแแ. แแฃแแชแ, แแ แแแ แแแ แแแ แจแแแชแแแก แแ แแกแ แแ แแแแแ แจแแขแงแแแแแแแแแก, แ แแแแแแแแแ แแ แแ แจแแแซแแแแ แฌแแแจแแแแก.
แแฃแ แแแแแขแแ แแแแก แแแกแฃแคแแแแแแ
แแฃแแแแแแ แแแฉแแแแแแแแ แแแแแแแก "แแแแแกแฃแคแแ" แคแฃแแฅแชแแแจแ. แจแแแแแฌแแแ แแแ แแแแ แแ แแฃแแแแขแ. smartcard_pcsc.c 875
WINSCARDAPI LONG WINAPI PCSC_SCardListReadersW(
SCARDCONTEXT hContext,
LPCWSTR mszGroups,
LPWSTR mszReaders,
LPDWORD pcchReaders)
{
LPSTR mszGroupsA = NULL;
....
mszGroups = NULL; /* mszGroups is not supported by pcsc-lite */
if (mszGroups)
ConvertFromUnicode(CP_UTF8,0, mszGroups, -1,
(char**) &mszGroupsA, 0,
NULL, NULL);
status = PCSC_SCardListReaders_Internal(hContext, mszGroupsA,
(LPSTR) &mszReadersA,
pcchReaders);
if (status == SCARD_S_SUCCESS)
{
....
}
free(mszGroupsA);
....
}แคแฃแแฅแชแแแแแ แแแก แฃแคแแกแ แแฅแแแ แจแแแแซแแแแ แแแแแ แแ แแฃแแแแแแ แแแฉแแแแแแแแ แแ แแแแแแแแขแแ แแ แแชแแก แแแแก แจแแกแแฎแแ. แแแแ แแ แแฃ แแแแแแแแแแแแ แกแแขแฃแแชแแ, แ แแแแแจแแช แแฃแ แกแแ แ แงแแแแแแแแก แแฃแแแแแ, แ แแแแ แช แแ แคแ แแแแแแขแจแ, แแแคแ แแฎแแแแแ แแแแชแแแ.
แแแฉแแแแแแแแ mszGroupsA แแแแแแแแ แแแแแ แแแแแแแ แ NULL แแ แแ แแ แแก แแแแชแแแแแแแแฃแแ แกแฎแแแแแ. แแแแแก แแ แแแแแ แแ แคแแแแแแ, แกแแแแช แแแฉแแแแแแแแก แแแแชแแแแแแแชแแ แจแแกแแซแแแแแแแ, แแแฃแฌแแแแแแแแ.
แแงแ แกแฎแแ แจแแขแงแแแแแแแแแ, แ แแแแ แแชแแ:
- V575 null แแแฉแแแแแแแแ แแแแแแแก "แแแแแกแฃแคแแ" แคแฃแแฅแชแแแจแ. แจแแแแแฌแแแ แแแ แแแแ แแ แแฃแแแแขแ. แแแชแแแแแ.c 790
- V575 null แแแฉแแแแแแแแ แแแแแแแก "แแแแแกแฃแคแแ" แคแฃแแฅแชแแแจแ. แจแแแแแฌแแแ แแแ แแแแ แแ แแฃแแแแขแ. rdpsnd_alsa.c 575
แกแแแแ แแฃแแแ, แแกแแแ แแแแแฌแงแแแฃแแ แชแแแแแแแ แฌแแ แแแแฅแแแแแ แ แแคแแฅแขแแ แแ แแแแก แแ แแชแแกแจแ แแ แแแแ แฃแแ แแแแ แแแแฆแแแ แจแแกแแซแแแแแแแ.
แจแแกแแซแแ แแแแแแแแ
แจแแกแแซแแ แแแแแแแแ. แแแแแฎแแแแ แแแแ แแแแแแแก แแแกแขแแแแ แแ แแ แ แจแแแแแ. makecert.c 1087
// openssl/x509.h
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj);
struct _MAKECERT_CONTEXT
{
....
int duration_years;
int duration_months;
};
typedef struct _MAKECERT_CONTEXT MAKECERT_CONTEXT;
int makecert_context_process(MAKECERT_CONTEXT* context, ....)
{
....
if (context->duration_months)
X509_gmtime_adj(after, (long)(60 * 60 * 24 * 31 *
context->duration_months));
else if (context->duration_years)
X509_gmtime_adj(after, (long)(60 * 60 * 24 * 365 *
context->duration_years));
....
}แจแแแแแแก แแแขแแแ แฎแแแแ แซแแแแ แแ แแ แแก แแแแแแแแแก แแแชแแ, แ แแแแแ แแแแแแแ แแจแแแ แฎแแแแ แขแแแแก แแแแแงแแแแแแ int.
แแแแแขแแ แแก แแแฃแฅแแแแ แแแแชแแแแแแแชแแแจแ
"แแแแขแแฅแกแขแแก" แแแฉแแแแแแแแ แแแแแแงแแแแแแแ แแแแแ, แกแแแแ แแแ แแแแแแแฌแแแแฃแแ แแฅแแแแแแ nullptr-แแก แฌแแแแแฆแแแแ. แจแแแแแฌแแแ แฎแแแแแ: 746, 748. gfx.c 746
static UINT gdi_SurfaceCommand(RdpgfxClientContext* context,
const RDPGFX_SURFACE_COMMAND* cmd)
{
....
rdpGdi* gdi = (rdpGdi*) context->custom;
if (!context || !cmd)
return ERROR_INVALID_PARAMETER;
....
}แแฅ แแ แแก แแแฉแแแแแแแแ แแแแขแแฅแกแขแจแ แแแแชแแแแแแแชแแแก แแ แแก แแแฃแฅแแแแฃแแแ แแแแแแแแ - แจแแแแฌแแแแแแแ.
แแแแแแแแ แแ แขแแแแก แกแฎแแ แจแแชแแแแแแ:
- V595 'ntlm' แแแฉแแแแแแแแ แแแแแแงแแแแแแแ แแแแแ, แกแแแแ แแแ แแแแแแแฌแแแแฃแแ แแฅแแแแแแ nullptr-แแแ แแแแแ แแแแแจแ. แจแแแแแฌแแแ แฎแแแแแ: 236, 255. ntlm.c 236
- V595 โแแแแขแแฅแกแขแแกโ แแแฉแแแแแแแแ แแแแแแงแแแแแแแ แแแแแ, แกแแแแ แแแ แแแแแแแฌแแแแฃแแ แแฅแแแแแแ nullptr-แแแ แแแแแ แแแแแจแ. แจแแแแแฌแแแ แฎแแแแแ: 1003, 1007. rfx.c 1003
- V595 'rdpei' แแแฉแแแแแแแแ แแแแแแงแแแแแแแ แแแแแ, แกแแแแ แแแ แแแแแแแฌแแแแฃแแ แแฅแแแแแแ nullptr-แแแ แแแแแ แแแแแจแ. แจแแแแแฌแแแ แฎแแแแแ: 176, 180. rdpei_main.c 176
- V595 'gdi' แแแฉแแแแแแแแ แแแแแแงแแแแแแแ แแแแแ, แกแแแแ แแแ แแแแแแแฌแแแแฃแแ แแฅแแแแแแ nullptr-แแก แฌแแแแแฆแแแแ. แจแแแแแฌแแแ แฎแแแแแ: 121, 123. xf_gfx.c 121
แฃแแแ แ แแแแแแแ แแแแ
แแแแแแฅแแ 'rdp->state >= CONNECTION_STATE_ACTIVE' แงแแแแแแแแก แแแ แแแแแ. แแแแจแแ แ.c 1489 แฌ
int rdp_server_transition_to_state(rdpRdp* rdp, int state)
{
....
switch (state)
{
....
case CONNECTION_STATE_ACTIVE:
rdp->state = CONNECTION_STATE_ACTIVE; // <=
....
if (rdp->state >= CONNECTION_STATE_ACTIVE) // <=
{
IFCALLRET(client->Activate, client->activated, client);
if (!client->activated)
return -1;
}
....
}
....
}แแแแแแ แแแกแแฎแแแแ แแ, แ แแ แแแ แแแแ แแแ แแแ แฃแแแ แแ แแแ แ แแแแแญแแแฃแแ แจแแกแแแแแแกแ แแแแจแแแแแแแแก แแแแ.
แแ แแกแฌแแ แ แกแขแ แแฅแแแแก แแแ แฉแแแ
แแ แแกแฌแแ แ แคแแ แแแขแ. แแแแแแฎแแแแ 'sscanf' แคแฃแแฅแชแแแก แแแกแแแ แคแแฅแขแแแ แแแ แแ แแฃแแแแขแแก แจแแแแฌแแแแ. แแแกแแแแแแแแแ แแแแแแแขแแ แ แฎแแแแแฃแฌแแ แแแ int แขแแแแก. แแ แแฅแกแ.c 220
แแแ แแแแแ แแแแแฎแแขแแแก แแแฌแแแ แงแแแแแแแแก แแแ แแแแแ: (rc >= 0). แแ แแฅแกแ.c 222
static BOOL check_no_proxy(....)
{
....
int sub;
int rc = sscanf(range, "%u", &sub);
if ((rc == 1) && (rc >= 0))
{
....
}
....
}แแแแแแแแขแแ แ แแแฃแงแแแแแแแแ แแแกแชแแแก 2 แแแคแ แแฎแแแแแแก แแ แคแ แแแแแแขแแกแแแแก. แกแแแชแแคแแแแขแแ แ %u แแแแแแก แขแแแแก แชแแแแแก แฎแแแแแฃแฌแแ แแแ int, แแแแ แแ แชแแแแแ แฅแแ แแฅแแก แขแแแ int. แจแแแแแ แฉแแแ แแฎแแแแแ แกแแแญแแ แจแแแแฌแแแแแก: แแแแแแแ แแแแแก แแแ แฏแแแแ แแแ แ แแ แแฅแแก, แ แแแแแ แแแแแแแแแ แแ แแก แจแแแแ แแแ แแ แแแแ. แแ แแแชแ แ แแก แแฃแแแกแฎแแแแแ แแ แแแแแก แแแขแแ แ, แแแแ แแ แแฅ แ แแฆแแช แแจแแแ แแ แแ แแกแฌแแ แแ.
แแฌแงแแแ แแแแ แแแแแกแฃแแ แฉแแแแแ
แแแแแแฅแแ 'status == 0x00090314' แงแแแแแแแแก แแชแแแ แแ. ntlm.c 299
BOOL ntlm_authenticate(rdpNtlm* ntlm, BOOL* pbContinueNeeded)
{
....
if (status != SEC_E_OK)
{
....
return FALSE;
}
if (status == SEC_I_COMPLETE_NEEDED) // <=
status = SEC_E_OK;
else if (status == SEC_I_COMPLETE_AND_CONTINUE) // <=
status = SEC_I_CONTINUE_NEEDED;
....
}แจแแแแฌแแแแฃแแ แแแ แแแแแ แงแแแแแแแแก แแฅแแแแ แงแแแแ, แ แแแแแ แจแแกแ แฃแแแแ แแฎแแแแ แแแแ แ แแแ แแแแก แแแแฆแฌแแแก แแฃ แกแขแแขแฃแกแ == SEC_E_OK. แกแฌแแ แ แแแแ แจแแแซแแแแ แแกแ แแแแแแงแฃแ แแแแแแก:
if (status == SEC_I_COMPLETE_NEEDED)
status = SEC_E_OK;
else if (status == SEC_I_COMPLETE_AND_CONTINUE)
status = SEC_I_CONTINUE_NEEDED;
else if (status != SEC_E_OK)
{
....
return FALSE;
}แแแกแแแแ
แแแแแแ แแ, แแ แแแฅแขแแก แจแแแแฌแแแแแ แแแแ แ แแ แแแแแแ แแแแแแแแแแ, แแแแ แแ แกแขแแขแแแจแ แแแแ แแฎแแแแ แงแแแแแแ แกแแแแขแแ แแกแ แแแฌแแแ แแงแ แแฆแฌแแ แแแ. แแ แแแฅแขแแก แแแแแแแแแ แแแก แจแแฃแซแแแแ แแแแแ แจแแแแแฌแแแ แแ แแแฅแขแ แแแแกแแแขแแ แแ แแแแแแ แแแชแแแแแแก แแแกแแฆแแแแก แแแแฎแแแแแ . แแกแแแ แแงแ แชแ แฃ แแแแแแแแ, แ แแแแแแแแช แแฃแจแแแแ แฎแแแก แจแแฃแฌแงแแแก แแแแแแแแขแแ แแก แแแฃแแฏแแแแกแแแแก. แแฃแแชแ, แกแขแแขแแแฃแ แ แแแแแแแ แแแแจแแแแแแแแแแ, แแฃ แแกแฃแ แ แแ แ แแฎแแแแ แแแแฃแแฏแแแแกแแ แแฅแแแแ แแแแแก แฎแแ แแกแฎแ, แแ แแแแ แจแแแแชแแ แแ แจแแชแแแแแแแก แแแแแแแ แแแฎแแ แฏแฃแแ แแ แ แแ แแแแจแ แแแแแฎแแแ แแแแ PVS-Studio.
แแฃ แแกแฃแ แ แแแฃแแแแ แแ แแก แกแขแแขแแ แแแแแแกแฃแ แแแแแแ แแฃแแแขแแ แแแก, แแแฎแแแ, แแแแแแงแแแแ แแแ แแแแแแก แแแฃแแ: แกแแ แแแ แแแ แแแ.
แฌแงแแ แ: www.habr.com
