diff --git a/channels/audin/client/opensles/opensl_io.c b/channels/audin/client/opensles/opensl_io.c index 5b650be87..781d63cf9 100644 --- a/channels/audin/client/opensles/opensl_io.c +++ b/channels/audin/client/opensles/opensl_io.c @@ -234,7 +234,9 @@ OPENSL_STREAM *android_OpenRecDevice(char *name, int sr, int inchannels, OPENSL_STREAM *p; p = (OPENSL_STREAM *) calloc(sizeof(OPENSL_STREAM),1); - memset(p, 0, sizeof(OPENSL_STREAM)); + if (!p) + return NULL; + memset(p, 0, sizeof(OPENSL_STREAM)); p->inchannels = inchannels; p->sr = sr; @@ -314,7 +316,14 @@ void bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context) assert(p->queue); e = calloc(1, sizeof(queue_element)); + if (!e) + return; e->data = calloc(p->buffersize, p->bits_per_sample / 8); + if (!e->data) + { + free(e); + return; + } e->size = p->buffersize * p->bits_per_sample / 8; Queue_Enqueue(p->queue, p->next); @@ -340,6 +349,7 @@ int android_RecIn(OPENSL_STREAM *p,short *buffer,int size) if (!p->prep) { p->prep = calloc(1, sizeof(queue_element)); + p->prep->data = calloc(p->buffersize, p->bits_per_sample / 8); p->prep->size = p->buffersize * p->bits_per_sample / 8; diff --git a/client/Sample/freerdp.c b/client/Sample/freerdp.c index 52e54ff47..e6fb8b775 100644 --- a/client/Sample/freerdp.c +++ b/client/Sample/freerdp.c @@ -324,13 +324,22 @@ int main(int argc, char* argv[]) rdpChannels* channels; instance = freerdp_new(); + if (!instance) + { + WLog_ERR(TAG, "Couldn't create instance"); + exit(1); + } instance->PreConnect = tf_pre_connect; instance->PostConnect = tf_post_connect; instance->ContextSize = sizeof(tfContext); instance->ContextNew = tf_context_new; instance->ContextFree = tf_context_free; - freerdp_context_new(instance); + if (freerdp_context_new(instance) != 0) + { + WLog_ERR(TAG, "Couldn't create context"); + exit(1); + } channels = instance->context->channels; diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index f26b976e9..22ab3ce38 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -49,6 +49,8 @@ int main(int argc, char* argv[]) RdpClientEntry(&clientEntryPoints); context = freerdp_client_context_new(&clientEntryPoints); + if (!context) + return 1; settings = context->settings; xfc = (xfContext*) context; diff --git a/client/common/client.c b/client/common/client.c index 50ca30eb3..8a738c67a 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -51,13 +51,21 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) pEntryPoints->GlobalInit(); instance = freerdp_new(); + if (!instance) + return NULL; + instance->settings = pEntryPoints->settings; instance->ContextSize = pEntryPoints->ContextSize; instance->ContextNew = freerdp_client_common_new; instance->ContextFree = freerdp_client_common_free; instance->pClientEntryPoints = (RDP_CLIENT_ENTRY_POINTS*) malloc(pEntryPoints->Size); + if (!instance->pClientEntryPoints) + goto out_fail; + + CopyMemory(instance->pClientEntryPoints, pEntryPoints, pEntryPoints->Size); - freerdp_context_new(instance); + if (freerdp_context_new(instance) != 0) + goto out_fail2; context = instance->context; context->instance = instance; @@ -66,6 +74,12 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); return context; + +out_fail2: + free(instance->pClientEntryPoints); +out_fail: + freerdp_free(instance); + return NULL; } void freerdp_client_context_free(rdpContext* context) diff --git a/libfreerdp/codec/rfx_encode.c b/libfreerdp/codec/rfx_encode.c index f929846cf..499cedc6c 100644 --- a/libfreerdp/codec/rfx_encode.c +++ b/libfreerdp/codec/rfx_encode.c @@ -226,12 +226,14 @@ void rfx_encode_rgb(RFX_CONTEXT* context, RFX_TILE* tile) primitives_t* prims = primitives_get(); static const prim_size_t roi_64x64 = { 64, 64 }; + if (!(pBuffer = (BYTE*) BufferPool_Take(context->priv->BufferPool, -1))) + return; + YLen = CbLen = CrLen = 0; YQuant = context->quants + (tile->quantIdxY * 10); CbQuant = context->quants + (tile->quantIdxCb * 10); CrQuant = context->quants + (tile->quantIdxCr * 10); - pBuffer = (BYTE*) BufferPool_Take(context->priv->BufferPool, -1); pSrcDst[0] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 0) + 16])); /* y_r_buffer */ pSrcDst[1] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 1) + 16])); /* cb_g_buffer */ pSrcDst[2] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 2) + 16])); /* cr_b_buffer */ diff --git a/libfreerdp/codec/rfx_rlgr.c b/libfreerdp/codec/rfx_rlgr.c index b625f45c9..8135a43f7 100644 --- a/libfreerdp/codec/rfx_rlgr.c +++ b/libfreerdp/codec/rfx_rlgr.c @@ -580,8 +580,8 @@ int rfx_rlgr_encode(RLGR_MODE mode, const INT16* data, int data_size, BYTE* buff RFX_BITSTREAM* bs; int processed_size; - bs = (RFX_BITSTREAM*) malloc(sizeof(RFX_BITSTREAM)); - ZeroMemory(bs, sizeof(RFX_BITSTREAM)); + if (!(bs = (RFX_BITSTREAM*) calloc(1, sizeof(RFX_BITSTREAM)))) + return 0; rfx_bitstream_attach(bs, buffer, buffer_size); diff --git a/libfreerdp/core/activation.c b/libfreerdp/core/activation.c index 15ec293bb..e4ec05b12 100644 --- a/libfreerdp/core/activation.c +++ b/libfreerdp/core/activation.c @@ -330,7 +330,9 @@ BOOL rdp_send_deactivate_all(rdpRdp* rdp) wStream* s; BOOL status; - s = Stream_New(NULL, 1024); + if (!(s = Stream_New(NULL, 1024))) + return FALSE; + rdp_init_stream_pdu(rdp, s); Stream_Write_UINT32(s, rdp->settings->ShareId); /* shareId (4 bytes) */ diff --git a/libfreerdp/core/capabilities.c b/libfreerdp/core/capabilities.c index c0c0eaf3b..f4ae91b4a 100644 --- a/libfreerdp/core/capabilities.c +++ b/libfreerdp/core/capabilities.c @@ -3687,7 +3687,9 @@ BOOL rdp_send_demand_active(rdpRdp* rdp) wStream* s; BOOL status; - s = Stream_New(NULL, 4096); + if (!(s = Stream_New(NULL, 4096))) + return FALSE; + rdp_init_stream_pdu(rdp, s); rdp->settings->ShareId = 0x10000 + rdp->mcs->userId; @@ -3903,7 +3905,9 @@ BOOL rdp_send_confirm_active(rdpRdp* rdp) wStream* s; BOOL status; - s = Stream_New(NULL, 4096); + if (!(s = Stream_New(NULL, 4096))) + return FALSE; + rdp_init_stream_pdu(rdp, s); rdp_write_confirm_active(s, rdp->settings); diff --git a/libfreerdp/core/fastpath.c b/libfreerdp/core/fastpath.c index 51a7c8323..13aa4e18b 100644 --- a/libfreerdp/core/fastpath.c +++ b/libfreerdp/core/fastpath.c @@ -389,7 +389,8 @@ static int fastpath_recv_update_data(rdpFastPath* fastpath, wStream* s) /* data was compressed, copy from decompression buffer */ size = DstSize; - cs = StreamPool_Take(transport->ReceivePool, DstSize); + if (!(cs = StreamPool_Take(transport->ReceivePool, DstSize))) + return -1; Stream_SetPosition(cs, 0); Stream_Write(cs, pDstData, DstSize); @@ -432,7 +433,9 @@ static int fastpath_recv_update_data(rdpFastPath* fastpath, wStream* s) return -1; } - fastpath->updateData = StreamPool_Take(transport->ReceivePool, size); + if (!(fastpath->updateData = StreamPool_Take(transport->ReceivePool, size))) + return -1; + Stream_SetPosition(fastpath->updateData, 0); Stream_Copy(fastpath->updateData, cs, size); diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index fc955efc8..7a2769570 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -148,7 +148,9 @@ BOOL freerdp_connect(freerdp* instance) pcap_get_next_record_header(update->pcap_rfx, &record); - s = StreamPool_Take(rdp->transport->ReceivePool, record.length); + if (!(s = StreamPool_Take(rdp->transport->ReceivePool, record.length))) + break; + record.data = Stream_Buffer(s); pcap_get_next_record_content(update->pcap_rfx, &record); @@ -421,8 +423,9 @@ int freerdp_context_new(freerdp* instance) rdpRdp* rdp; rdpContext* context; - instance->context = (rdpContext*) malloc(instance->ContextSize); - ZeroMemory(instance->context, instance->ContextSize); + instance->context = (rdpContext*) calloc(1, instance->ContextSize); + if (!instance->context) + return -1; context = instance->context; context->instance = instance; @@ -431,16 +434,27 @@ int freerdp_context_new(freerdp* instance) context->settings = instance->settings; context->pubSub = PubSub_New(TRUE); + if(!context->pubSub) + goto out_error_pubsub; PubSub_AddEventTypes(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEventType)); context->metrics = metrics_new(context); + if (!context->metrics) + goto out_error_metrics_new; + rdp = rdp_new(context); + if (!rdp) + goto out_error_rdp_new; + instance->input = rdp->input; instance->update = rdp->update; instance->settings = rdp->settings; instance->autodetect = rdp->autodetect; context->graphics = graphics_new(context); + if(!context->graphics) + goto out_error_graphics_new; + context->rdp = rdp; context->input = instance->input; @@ -461,8 +475,17 @@ int freerdp_context_new(freerdp* instance) update_register_client_callbacks(rdp->update); IFCALL(instance->ContextNew, instance, instance->context); - return 0; + +out_error_graphics_new: + rdp_free(rdp); +out_error_rdp_new: + metrics_free(context->metrics); +out_error_metrics_new: + PubSub_Free(context->pubSub); +out_error_pubsub: + free(instance->context); + return -1; } /** Deallocator function for a rdp context. @@ -581,15 +604,14 @@ freerdp* freerdp_new() { freerdp* instance; - instance = (freerdp*) malloc(sizeof(freerdp)); + instance = (freerdp*) calloc(1, sizeof(freerdp)); - if (instance) - { - ZeroMemory(instance, sizeof(freerdp)); - instance->ContextSize = sizeof(rdpContext); - instance->SendChannelData = freerdp_send_channel_data; - instance->ReceiveChannelData = freerdp_channels_data; - } + if (!instance) + return NULL; + + instance->ContextSize = sizeof(rdpContext); + instance->SendChannelData = freerdp_send_channel_data; + instance->ReceiveChannelData = freerdp_channels_data; return instance; } diff --git a/libfreerdp/core/listener.c b/libfreerdp/core/listener.c index 7a348cef4..88be8ed54 100644 --- a/libfreerdp/core/listener.c +++ b/libfreerdp/core/listener.c @@ -311,6 +311,11 @@ static BOOL freerdp_listener_check_fds(freerdp_listener* instance) } client = freerdp_peer_new(peer_sockfd); + if (!client) + { + closesocket((SOCKET) peer_sockfd); + return FALSE; + } sin_addr = NULL; if (peer_addr.ss_family == AF_INET) diff --git a/libfreerdp/core/peer.c b/libfreerdp/core/peer.c index 919b78862..d3b5f69ff 100644 --- a/libfreerdp/core/peer.c +++ b/libfreerdp/core/peer.c @@ -632,8 +632,23 @@ void freerdp_peer_context_new(freerdp_peer* client) context->metrics = metrics_new(context); + if (!context->metrics) + { + client->context = NULL; + free(context); + return; + } + rdp = rdp_new(context); + if (!rdp) + { + metrics_free(context->metrics); + free(context); + client->context = NULL; + return; + } + client->input = rdp->input; client->update = rdp->update; client->settings = rdp->settings; @@ -663,6 +678,7 @@ void freerdp_peer_context_new(freerdp_peer* client) client->DrainOutputBuffer = freerdp_peer_drain_output_buffer; IFCALL(client->ContextNew, client, client->context); + } void freerdp_peer_context_free(freerdp_peer* client) @@ -717,7 +733,10 @@ void freerdp_peer_free(freerdp_peer* client) if (!client) return; - rdp_free(client->context->rdp); - free(client->context); + if (client->context) + { + rdp_free(client->context->rdp); + free(client->context); + } free(client); } diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 1ab32b69a..afbe37eba 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -754,7 +754,8 @@ int rdp_recv_data_pdu(rdpRdp* rdp, wStream* s) if (bulk_decompress(rdp->bulk, Stream_Pointer(s), SrcSize, &pDstData, &DstSize, compressedType)) { - cs = StreamPool_Take(rdp->transport->ReceivePool, DstSize); + if (!(cs = StreamPool_Take(rdp->transport->ReceivePool, DstSize))) + return -1; Stream_SetPosition(cs, 0); Stream_Write(cs, pDstData, DstSize); diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 45931ed62..8f14d6e7a 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -195,6 +195,8 @@ void settings_get_computer_name(rdpSettings* settings) GetComputerNameExA(ComputerNameNetBIOS, NULL, &nSize); settings->ComputerName = (char*) malloc(nSize); + if (!settings->ComputerName) + return; GetComputerNameExA(ComputerNameNetBIOS, settings->ComputerName, &nSize); } @@ -202,11 +204,9 @@ rdpSettings* freerdp_settings_new(DWORD flags) { rdpSettings* settings; - settings = (rdpSettings*) malloc(sizeof(rdpSettings)); - - if (settings) - { - ZeroMemory(settings, sizeof(rdpSettings)); + settings = (rdpSettings*) calloc(1, sizeof(rdpSettings)); + if (!settings) + return NULL; settings->ServerMode = (flags & FREERDP_SETTINGS_SERVER_MODE) ? TRUE : FALSE; settings->WaitForOutputBufferFlush = TRUE; @@ -256,9 +256,9 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->CompressionEnabled = TRUE; if (settings->ServerMode) - settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61; + settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61; else - settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61; + settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61; settings->Authentication = TRUE; settings->AuthenticationOnly = FALSE; @@ -269,21 +269,31 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->ChannelCount = 0; settings->ChannelDefArraySize = 32; settings->ChannelDefArray = (CHANNEL_DEF*) calloc(settings->ChannelDefArraySize, sizeof(CHANNEL_DEF)); + if (!settings->ChannelDefArray) + goto out_fail; settings->MonitorCount = 0; settings->MonitorDefArraySize = 32; settings->MonitorDefArray = (rdpMonitor*) calloc(settings->MonitorDefArraySize, sizeof(rdpMonitor)); + if (!settings->MonitorDefArray) + goto out_fail; + settings->MonitorLocalShiftX = 0; settings->MonitorLocalShiftY = 0; settings->MonitorIds = (UINT32*) calloc(16, sizeof(UINT32)); + if(!settings->MonitorIds) + goto out_fail; settings_get_computer_name(settings); - settings->ReceivedCapabilities = malloc(32); - settings->OrderSupport = malloc(32); - ZeroMemory(settings->ReceivedCapabilities, 32); - ZeroMemory(settings->OrderSupport, 32); + settings->ReceivedCapabilities = calloc(1, 32); + if (!settings->ReceivedCapabilities) + goto out_fail; + + settings->OrderSupport = calloc(1, 32); + if (!settings->OrderSupport) + goto out_fail; settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; settings->OrderSupport[NEG_PATBLT_INDEX] = TRUE; @@ -308,11 +318,13 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = TRUE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = TRUE; - settings->ClientHostname = malloc(32); - settings->ClientProductId = malloc(32); - ZeroMemory(settings->ClientHostname, 32); - ZeroMemory(settings->ClientProductId, 32); + settings->ClientProductId = calloc(1, 32); + if (!settings->ClientProductId) + goto out_fail; + settings->ClientHostname = calloc(1, 32); + if (!settings->ClientHostname) + goto out_fail; gethostname(settings->ClientHostname, 31); settings->ClientHostname[31] = 0; @@ -337,6 +349,8 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->BitmapCacheV2NumCells = 5; settings->BitmapCacheV2CellInfo = (BITMAP_CACHE_V2_CELL_INFO*) malloc(sizeof(BITMAP_CACHE_V2_CELL_INFO) * 6); + if (!settings->BitmapCacheV2CellInfo) + goto out_fail; settings->BitmapCacheV2CellInfo[0].numEntries = 600; settings->BitmapCacheV2CellInfo[0].persistent = FALSE; settings->BitmapCacheV2CellInfo[1].numEntries = 600; @@ -355,7 +369,11 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->GlyphSupportLevel = GLYPH_SUPPORT_FULL; settings->GlyphCache = malloc(sizeof(GLYPH_CACHE_DEFINITION) * 10); + if(!settings->GlyphCache) + goto out_fail; settings->FragCache = malloc(sizeof(GLYPH_CACHE_DEFINITION)); + if(!settings->FragCache) + goto out_fail; settings->GlyphCache[0].cacheEntries = 254; settings->GlyphCache[0].cacheMaximumCellSize = 4; settings->GlyphCache[1].cacheEntries = 254; @@ -387,6 +405,8 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->DrawNineGridCacheEntries = 256; settings->ClientDir = _strdup(client_dll); + if (!settings->ClientDir) + goto out_fail; settings->RemoteAppNumIconCaches = 3; settings->RemoteAppNumIconCacheEntries = 12; @@ -420,38 +440,72 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->GfxProgressiveV2 = FALSE; settings->GfxH264 = FALSE; - settings->ClientAutoReconnectCookie = (ARC_CS_PRIVATE_PACKET*) malloc(sizeof(ARC_CS_PRIVATE_PACKET)); - settings->ServerAutoReconnectCookie = (ARC_SC_PRIVATE_PACKET*) malloc(sizeof(ARC_SC_PRIVATE_PACKET)); - ZeroMemory(settings->ClientAutoReconnectCookie, sizeof(ARC_CS_PRIVATE_PACKET)); - ZeroMemory(settings->ServerAutoReconnectCookie, sizeof(ARC_SC_PRIVATE_PACKET)); + settings->ClientAutoReconnectCookie = (ARC_CS_PRIVATE_PACKET*) calloc(1, sizeof(ARC_CS_PRIVATE_PACKET)); + if (!settings->ClientAutoReconnectCookie) + goto out_fail; + settings->ServerAutoReconnectCookie = (ARC_SC_PRIVATE_PACKET*) calloc(1, sizeof(ARC_SC_PRIVATE_PACKET)); + if (!settings->ServerAutoReconnectCookie) + goto out_fail; - settings->ClientTimeZone = (TIME_ZONE_INFO*) malloc(sizeof(TIME_ZONE_INFO)); - ZeroMemory(settings->ClientTimeZone, sizeof(TIME_ZONE_INFO)); + settings->ClientTimeZone = (TIME_ZONE_INFO*) calloc(1,sizeof(TIME_ZONE_INFO)); + if (!settings->ClientTimeZone) + goto out_fail; settings->DeviceArraySize = 16; - settings->DeviceArray = (RDPDR_DEVICE**) malloc(sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize); - ZeroMemory(settings->DeviceArray, sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize); + settings->DeviceArray = (RDPDR_DEVICE**) calloc(1, sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize); + if (!settings->DeviceArray) + goto out_fail; settings->StaticChannelArraySize = 16; settings->StaticChannelArray = (ADDIN_ARGV**) - malloc(sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize); - ZeroMemory(settings->StaticChannelArray, sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize); + calloc(1, sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize); + if (!settings->StaticChannelArray) + goto out_fail; settings->DynamicChannelArraySize = 16; settings->DynamicChannelArray = (ADDIN_ARGV**) - malloc(sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize); - ZeroMemory(settings->DynamicChannelArray, sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize); + calloc(1, sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize); + if(!settings->DynamicChannelArray) + goto out_fail; settings->HomePath = GetKnownPath(KNOWN_PATH_HOME); + if (!settings->HomePath) + goto out_fail; settings->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp"); + if (!settings->ConfigPath) + goto out_fail; settings_load_hkey_local_machine(settings); - settings->SettingsModified = (BYTE*) malloc(sizeof(rdpSettings) / 8 ); - ZeroMemory(settings->SettingsModified, sizeof(rdpSettings) / 8); - } + settings->SettingsModified = (BYTE*) calloc(1, sizeof(rdpSettings) / 8 ); + if(!settings->SettingsModified) + goto out_fail; return settings; + +out_fail: + free(settings->HomePath); + free(settings->ConfigPath); + free(settings->DynamicChannelArray); + free(settings->StaticChannelArray); + free(settings->DeviceArray); + free(settings->ClientTimeZone); + free(settings->ServerAutoReconnectCookie); + free(settings->ClientAutoReconnectCookie); + free(settings->ClientDir); + free(settings->FragCache); + free(settings->GlyphCache); + free(settings->BitmapCacheV2CellInfo); + free(settings->ClientProductId); + free(settings->ClientHostname); + free(settings->OrderSupport); + free(settings->ReceivedCapabilities); + free(settings->ComputerName); + free(settings->MonitorIds); + free(settings->MonitorDefArray); + free(settings->ChannelDefArray); + free(settings); + return NULL; } rdpSettings* freerdp_settings_clone(rdpSettings* settings) @@ -649,66 +703,65 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) void freerdp_settings_free(rdpSettings* settings) { - if (settings) - { - free(settings->ServerHostname); - free(settings->Username); - free(settings->Password); - free(settings->Domain); - free(settings->PasswordHash); - free(settings->AlternateShell); - free(settings->ShellWorkingDirectory); - free(settings->ComputerName); - free(settings->ChannelDefArray); - free(settings->MonitorDefArray); - free(settings->MonitorIds); - free(settings->ClientAddress); - free(settings->ClientDir); - free(settings->AllowedTlsCiphers); - free(settings->CertificateFile); - free(settings->PrivateKeyFile); - free(settings->ConnectionFile); - free(settings->AssistanceFile); - free(settings->ReceivedCapabilities); - free(settings->OrderSupport); - free(settings->ClientHostname); - free(settings->ClientProductId); - free(settings->ServerRandom); - free(settings->ClientRandom); - free(settings->ServerCertificate); - free(settings->RdpKeyFile); - certificate_free(settings->RdpServerCertificate); - free(settings->ClientAutoReconnectCookie); - free(settings->ServerAutoReconnectCookie); - free(settings->ClientTimeZone); - free(settings->BitmapCacheV2CellInfo); - free(settings->GlyphCache); - free(settings->FragCache); - key_free(settings->RdpServerRsaKey); - free(settings->ConfigPath); - free(settings->CurrentPath); - free(settings->HomePath); - free(settings->LoadBalanceInfo); - free(settings->TargetNetAddress); - free(settings->RedirectionTargetFQDN); - free(settings->RedirectionTargetNetBiosName); - free(settings->RedirectionUsername); - free(settings->RedirectionDomain); - free(settings->RedirectionPassword); - free(settings->RedirectionTsvUrl); - free(settings->RemoteAssistanceSessionId); - free(settings->AuthenticationServiceClass); - free(settings->GatewayHostname); - free(settings->GatewayUsername); - free(settings->GatewayPassword); - free(settings->GatewayDomain); - freerdp_target_net_addresses_free(settings); - freerdp_device_collection_free(settings); - freerdp_static_channel_collection_free(settings); - freerdp_dynamic_channel_collection_free(settings); - free(settings->SettingsModified); - free(settings); - } + if (!settings) + return; + free(settings->ServerHostname); + free(settings->Username); + free(settings->Password); + free(settings->Domain); + free(settings->PasswordHash); + free(settings->AlternateShell); + free(settings->ShellWorkingDirectory); + free(settings->ComputerName); + free(settings->ChannelDefArray); + free(settings->MonitorDefArray); + free(settings->MonitorIds); + free(settings->ClientAddress); + free(settings->ClientDir); + free(settings->AllowedTlsCiphers); + free(settings->CertificateFile); + free(settings->PrivateKeyFile); + free(settings->ConnectionFile); + free(settings->AssistanceFile); + free(settings->ReceivedCapabilities); + free(settings->OrderSupport); + free(settings->ClientHostname); + free(settings->ClientProductId); + free(settings->ServerRandom); + free(settings->ClientRandom); + free(settings->ServerCertificate); + free(settings->RdpKeyFile); + certificate_free(settings->RdpServerCertificate); + free(settings->ClientAutoReconnectCookie); + free(settings->ServerAutoReconnectCookie); + free(settings->ClientTimeZone); + free(settings->BitmapCacheV2CellInfo); + free(settings->GlyphCache); + free(settings->FragCache); + key_free(settings->RdpServerRsaKey); + free(settings->ConfigPath); + free(settings->CurrentPath); + free(settings->HomePath); + free(settings->LoadBalanceInfo); + free(settings->TargetNetAddress); + free(settings->RedirectionTargetFQDN); + free(settings->RedirectionTargetNetBiosName); + free(settings->RedirectionUsername); + free(settings->RedirectionDomain); + free(settings->RedirectionPassword); + free(settings->RedirectionTsvUrl); + free(settings->RemoteAssistanceSessionId); + free(settings->AuthenticationServiceClass); + free(settings->GatewayHostname); + free(settings->GatewayUsername); + free(settings->GatewayPassword); + free(settings->GatewayDomain); + freerdp_target_net_addresses_free(settings); + freerdp_device_collection_free(settings); + freerdp_static_channel_collection_free(settings); + freerdp_dynamic_channel_collection_free(settings); + free(settings->SettingsModified); + free(settings); } #ifdef _WIN32 diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index ffda7e2d1..b00e4667a 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -61,7 +61,8 @@ static void* transport_client_thread(void* arg); wStream* transport_send_stream_init(rdpTransport* transport, int size) { wStream* s; - s = StreamPool_Take(transport->ReceivePool, size); + if (!(s = StreamPool_Take(transport->ReceivePool, size))) + return NULL; Stream_EnsureCapacity(s, size); Stream_SetPosition(s, 0); return s; @@ -734,7 +735,10 @@ int transport_check_fds(rdpTransport* transport) } received = transport->ReceiveBuffer; - transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0); + if (!(transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0))) + { + return -1; + } /** * status: * -1: error diff --git a/winpr/include/winpr/wlog.h b/winpr/include/winpr/wlog.h index 1421af26e..bd55ffbf2 100644 --- a/winpr/include/winpr/wlog.h +++ b/winpr/include/winpr/wlog.h @@ -233,7 +233,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) #define WLog_Print(_log, _log_level, _fmt, ...) \ do { \ - if (_log_level >= WLog_GetLogLevel(_log)) { \ + if (_log && _log_level >= WLog_GetLogLevel(_log)) { \ wLogMessage _log_message; \ _log_message.Type = WLOG_MESSAGE_TEXT; \ _log_message.Level = _log_level; \ @@ -247,7 +247,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) #define WLog_PrintVA(_log, _log_level, _fmt, _args) \ do { \ - if (_log_level >= WLog_GetLogLevel(_log)) { \ + if (_log && _log_level >= WLog_GetLogLevel(_log)) { \ wLogMessage _log_message; \ _log_message.Type = WLOG_MESSAGE_TEXT; \ _log_message.Level = _log_level; \ @@ -261,7 +261,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) #define WLog_Data(_log, _log_level, ...) \ do { \ - if (_log_level >= WLog_GetLogLevel(_log)) { \ + if (_log && _log_level >= WLog_GetLogLevel(_log)) { \ wLogMessage _log_message; \ _log_message.Type = WLOG_MESSAGE_DATA; \ _log_message.Level = _log_level; \ @@ -275,7 +275,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) #define WLog_Image(_log, _log_level, ...) \ do { \ - if (_log_level >= WLog_GetLogLevel(_log)) { \ + if (_log && _log_level >= WLog_GetLogLevel(_log)) { \ wLogMessage _log_message; \ _log_message.Type = WLOG_MESSAGE_IMAGE; \ _log_message.Level = _log_level; \ @@ -289,7 +289,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) #define WLog_Packet(_log, _log_level, ...) \ do { \ - if (_log_level >= WLog_GetLogLevel(_log)) { \ + if (_log && _log_level >= WLog_GetLogLevel(_log)) { \ wLogMessage _log_message; \ _log_message.Type = WLOG_MESSAGE_PACKET; \ _log_message.Level = _log_level; \ @@ -302,7 +302,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args) } while (0) #define WLog_IsLevelActive(_log, _log_level) \ - (_log_level >= WLog_GetLogLevel(_log)) + (_log ? _log_level >= WLog_GetLogLevel(_log) : FALSE) #define WLog_LVL(tag, lvl, fmt, ...) WLog_Print(WLog_Get(tag), lvl, fmt, ## __VA_ARGS__) #define WLog_VRB(tag, fmt, ...) WLog_Print(WLog_Get(tag), WLOG_TRACE, fmt, ## __VA_ARGS__) diff --git a/winpr/libwinpr/error/error.c b/winpr/libwinpr/error/error.c index 96c35cd6c..621f67d17 100644 --- a/winpr/libwinpr/error/error.c +++ b/winpr/libwinpr/error/error.c @@ -41,12 +41,21 @@ UINT SetErrorMode(UINT uMode) DWORD GetLastError(VOID) { - return NtCurrentTeb()->LastErrorValue; + PTEB pt = NtCurrentTeb(); + if (pt) + { + return NtCurrentTeb()->LastErrorValue; + } + return ERROR_OUTOFMEMORY; } VOID SetLastError(DWORD dwErrCode) { - NtCurrentTeb()->LastErrorValue = dwErrCode; + PTEB pt = NtCurrentTeb(); + if (pt) + { + pt->LastErrorValue = dwErrCode; + } } VOID RestoreLastError(DWORD dwErrCode) diff --git a/winpr/libwinpr/file/file.c b/winpr/libwinpr/file/file.c index 4b545f671..5f646c53e 100644 --- a/winpr/libwinpr/file/file.c +++ b/winpr/libwinpr/file/file.c @@ -271,8 +271,14 @@ static void _HandleCreatorsInit() /* NB: error management to be done outside of this function */ assert(_HandleCreators == NULL); _HandleCreators = (HANDLE_CREATOR**)calloc(HANDLE_CREATOR_MAX+1, sizeof(HANDLE_CREATOR*)); - InitializeCriticalSection(&_HandleCreatorsLock); - assert(_HandleCreators != NULL); + if (!_HandleCreators) + return; + + if(!InitializeCriticalSectionEx(&_HandleCreatorsLock, 0, 0)) + { + free(_HandleCreators); + _HandleCreators = NULL; + } } /** @@ -407,9 +413,16 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, free(name); pNamedPipe = (WINPR_NAMED_PIPE*) calloc(1, sizeof(WINPR_NAMED_PIPE)); + if (!pNamedPipe) + return INVALID_HANDLE_VALUE; hNamedPipe = (HANDLE) pNamedPipe; WINPR_HANDLE_SET_TYPE(pNamedPipe, HANDLE_TYPE_NAMED_PIPE); pNamedPipe->name = _strdup(lpFileName); + if (!pNamedPipe->name) + { + free(pNamedPipe); + return INVALID_HANDLE_VALUE; + } pNamedPipe->dwOpenMode = 0; pNamedPipe->dwPipeMode = 0; pNamedPipe->nMaxInstances = 0; @@ -418,7 +431,22 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, pNamedPipe->nDefaultTimeOut = 0; pNamedPipe->dwFlagsAndAttributes = dwFlagsAndAttributes; pNamedPipe->lpFileName = GetNamedPipeNameWithoutPrefixA(lpFileName); + if (!pNamedPipe->lpFileName) + { + free((void *)pNamedPipe->name); + free(pNamedPipe); + return INVALID_HANDLE_VALUE; + + } pNamedPipe->lpFilePath = GetNamedPipeUnixDomainSocketFilePathA(lpFileName); + if (!pNamedPipe->lpFilePath) + { + free((void *)pNamedPipe->lpFileName); + free((void *)pNamedPipe->name); + free(pNamedPipe); + return INVALID_HANDLE_VALUE; + + } pNamedPipe->clientfd = socket(PF_LOCAL, SOCK_STREAM, 0); pNamedPipe->serverfd = -1; pNamedPipe->ServerMode = FALSE; diff --git a/winpr/libwinpr/path/shell.c b/winpr/libwinpr/path/shell.c index d66a18b95..f586619f3 100644 --- a/winpr/libwinpr/path/shell.c +++ b/winpr/libwinpr/path/shell.c @@ -53,6 +53,8 @@ char* GetEnvAlloc(LPCSTR lpName) if (length > 0) { env = malloc(length + 1); + if (!env) + return NULL; GetEnvironmentVariableA(lpName, env, length + 1); env[length] = '\0'; } @@ -68,6 +70,8 @@ char* GetPath_HOME() path = GetEnvAlloc("UserProfile"); #elif defined(ANDROID) path = malloc(2); + if (!path) + return NULL; strcpy(path, "/"); #else path = GetEnvAlloc("HOME"); @@ -144,6 +148,11 @@ char* GetPath_XDG_CONFIG_HOME() home = GetPath_TEMP(); path = (char*) malloc(strlen(home) + strlen("/.config") + 1); + if (!path) + { + free(home); + return NULL; + } sprintf(path, "%s%s", home, "/.config"); free(home); @@ -264,6 +273,8 @@ char* GetKnownSubPath(int id, const char* path) char* knownPath; knownPath = GetKnownPath(id); + if (!knownPath) + return NULL; subPath = GetCombinedPath(knownPath, path); free(knownPath); diff --git a/winpr/libwinpr/pipe/pipe.c b/winpr/libwinpr/pipe/pipe.c index 3025ae063..ae15a29d1 100644 --- a/winpr/libwinpr/pipe/pipe.c +++ b/winpr/libwinpr/pipe/pipe.c @@ -760,6 +760,8 @@ BOOL WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut) return FALSE; lpFilePath = GetNamedPipeUnixDomainSocketFilePathA(lpNamedPipeName); + if (!lpFilePath) + return FALSE; if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT) nTimeOut = 50; diff --git a/winpr/libwinpr/registry/registry_reg.c b/winpr/libwinpr/registry/registry_reg.c index aa05b93da..cfd90e959 100644 --- a/winpr/libwinpr/registry/registry_reg.c +++ b/winpr/libwinpr/registry/registry_reg.c @@ -88,6 +88,8 @@ static void reg_load_start(Reg* reg) return; reg->buffer = (char*) malloc(file_size + 2); + if (!reg->buffer) + return ; if (fread(reg->buffer, file_size, 1, reg->fp) != 1) { @@ -135,6 +137,8 @@ static RegVal* reg_load_value(Reg* reg, RegKey* key) data = p[3] + 1; length = p[1] - p[0]; name = (char*) malloc(length + 1); + if (!name) + return 0; memcpy(name, p[0], length); name[length] = '\0'; value = (RegVal*) malloc(sizeof(RegVal)); @@ -243,6 +247,8 @@ static RegKey* reg_load_key(Reg* reg, RegKey* key) p[0] = reg->line + 1; p[1] = strrchr(p[0], ']'); subkey = (RegKey*) malloc(sizeof(RegKey)); + if (!subkey) + return NULL; subkey->values = NULL; subkey->prev = subkey->next = NULL; length = p[1] - p[0]; @@ -359,35 +365,41 @@ Reg* reg_open(BOOL read_only) Reg* reg; reg = (Reg*) malloc(sizeof(Reg)); - if (reg) + if (!reg) + return NULL; + + reg->read_only = read_only; + reg->filename = WINPR_HKLM_HIVE; + + if (reg->read_only) + { + reg->fp = fopen(reg->filename, "r"); + } + else + { + reg->fp = fopen(reg->filename, "r+"); + + if (!reg->fp) + reg->fp = fopen(reg->filename, "w+"); + } + + if (!reg->fp) + { + free(reg); + return NULL; + } + + reg->root_key = (RegKey*) malloc(sizeof(RegKey)); + if (!reg->root_key) { - reg->read_only = read_only; - reg->filename = WINPR_HKLM_HIVE; - - if (reg->read_only) - { - reg->fp = fopen(reg->filename, "r"); - } - else - { - reg->fp = fopen(reg->filename, "r+"); - - if (!reg->fp) - reg->fp = fopen(reg->filename, "w+"); - } - - if (!reg->fp) - { - free(reg); - return NULL; - } - - reg->root_key = (RegKey*) malloc(sizeof(RegKey)); - reg->root_key->values = NULL; - reg->root_key->subkeys = NULL; - reg->root_key->name = "HKEY_LOCAL_MACHINE"; - reg_load(reg); + fclose(reg->fp); + free(reg); + return NULL; } + reg->root_key->values = NULL; + reg->root_key->subkeys = NULL; + reg->root_key->name = "HKEY_LOCAL_MACHINE"; + reg_load(reg); return reg; } diff --git a/winpr/libwinpr/synch/critical.c b/winpr/libwinpr/synch/critical.c index c21204814..6499ea00e 100644 --- a/winpr/libwinpr/synch/critical.c +++ b/winpr/libwinpr/synch/critical.c @@ -67,13 +67,21 @@ BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwS lpCriticalSection->RecursionCount = 0; lpCriticalSection->OwningThread = NULL; lpCriticalSection->LockSemaphore = (winpr_sem_t*) malloc(sizeof(winpr_sem_t)); + if (!lpCriticalSection->LockSemaphore) + return FALSE; #if defined(__APPLE__) - semaphore_create(mach_task_self(), lpCriticalSection->LockSemaphore, SYNC_POLICY_FIFO, 0); + if (semaphore_create(mach_task_self(), lpCriticalSection->LockSemaphore, SYNC_POLICY_FIFO, 0) != KERN_SUCCESS) + goto out_fail; #else - sem_init(lpCriticalSection->LockSemaphore, 0, 0); + if(sem_init(lpCriticalSection->LockSemaphore, 0, 0) != 0) + goto out_fail; #endif SetCriticalSectionSpinCount(lpCriticalSection, dwSpinCount); return TRUE; + +out_fail: + free(lpCriticalSection->LockSemaphore); + return FALSE; } BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) diff --git a/winpr/libwinpr/thread/thread.c b/winpr/libwinpr/thread/thread.c index 902e70163..53d17d2e1 100644 --- a/winpr/libwinpr/thread/thread.c +++ b/winpr/libwinpr/thread/thread.c @@ -377,13 +377,27 @@ HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize } #endif - pthread_mutex_init(&thread->mutex, 0); + if(pthread_mutex_init(&thread->mutex, 0) != 0) + { + WLog_ERR(TAG, "failed to initialize thread mutex"); + close(thread->pipe_fd[0]); + free(thread); + return NULL; + } + WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD); handle = (HANDLE) thread; if (!thread_list) { thread_list = ListDictionary_New(TRUE); + if (!thread_list) + { + WLog_ERR(TAG, "Couldn't create global thread list"); + close(thread->pipe_fd[0]); + free(thread); + return NULL; + } thread_list->objectKey.fnObjectEquals = thread_compare; } diff --git a/winpr/libwinpr/utils/collections/PubSub.c b/winpr/libwinpr/utils/collections/PubSub.c index 78bd91e9b..16a57d5e9 100644 --- a/winpr/libwinpr/utils/collections/PubSub.c +++ b/winpr/libwinpr/utils/collections/PubSub.c @@ -204,18 +204,28 @@ wPubSub* PubSub_New(BOOL synchronized) pubSub = (wPubSub*) malloc(sizeof(wPubSub)); - if (pubSub) + if (!pubSub) + return NULL; + + pubSub->synchronized = synchronized; + + if (pubSub->synchronized) + if (!InitializeCriticalSectionAndSpinCount(&pubSub->lock, 4000)) + { + free(pubSub); + return NULL; + } + + pubSub->count = 0; + pubSub->size = 64; + + pubSub->events = (wEventType*) calloc(1, sizeof(wEventType) * pubSub->size); + if (!pubSub->events) { - pubSub->synchronized = synchronized; - if (pubSub->synchronized) - InitializeCriticalSectionAndSpinCount(&pubSub->lock, 4000); - - pubSub->count = 0; - pubSub->size = 64; - - pubSub->events = (wEventType*) malloc(sizeof(wEventType) * pubSub->size); - ZeroMemory(pubSub->events, sizeof(wEventType) * pubSub->size); + DeleteCriticalSection(&pubSub->lock); + free(pubSub); + return NULL; } return pubSub; diff --git a/winpr/libwinpr/utils/collections/StreamPool.c b/winpr/libwinpr/utils/collections/StreamPool.c index 1d26b24d9..92f7ef424 100644 --- a/winpr/libwinpr/utils/collections/StreamPool.c +++ b/winpr/libwinpr/utils/collections/StreamPool.c @@ -178,10 +178,12 @@ wStream* StreamPool_Take(wStreamPool* pool, size_t size) Stream_EnsureCapacity(s, size); } - s->pool = pool; - s->count = 1; - - StreamPool_AddUsed(pool, s); + if (s) + { + s->pool = pool; + s->count = 1; + StreamPool_AddUsed(pool, s); + } if (pool->synchronized) LeaveCriticalSection(&pool->lock); diff --git a/winpr/libwinpr/utils/ssl.c b/winpr/libwinpr/utils/ssl.c index a0745aac3..44a0397c0 100644 --- a/winpr/libwinpr/utils/ssl.c +++ b/winpr/libwinpr/utils/ssl.c @@ -119,7 +119,8 @@ static BOOL _winpr_openssl_initialize_locking(void) while (i--) { - CloseHandle(g_winpr_openssl_locks[i]); + if (locks[i]) + CloseHandle(locks[i]); } free(locks); diff --git a/winpr/libwinpr/utils/wlog/Appender.c b/winpr/libwinpr/utils/wlog/Appender.c index 5638e0034..b8e5ab4c7 100644 --- a/winpr/libwinpr/utils/wlog/Appender.c +++ b/winpr/libwinpr/utils/wlog/Appender.c @@ -30,6 +30,8 @@ wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType) { wLogAppender* appender = NULL; + if (!log) + return NULL; if (logAppenderType == WLOG_APPENDER_CONSOLE) { @@ -51,7 +53,14 @@ wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType) if (!appender) appender = (wLogAppender*) WLog_ConsoleAppender_New(log); - appender->Layout = WLog_Layout_New(log); + if (!appender) + return NULL; + + if (!(appender->Layout = WLog_Layout_New(log))) + { + WLog_Appender_Free(log, appender); + return NULL; + } InitializeCriticalSectionAndSpinCount(&appender->lock, 4000); diff --git a/winpr/libwinpr/utils/wlog/ConsoleAppender.c b/winpr/libwinpr/utils/wlog/ConsoleAppender.c index 0383a823f..5de8e15dd 100644 --- a/winpr/libwinpr/utils/wlog/ConsoleAppender.c +++ b/winpr/libwinpr/utils/wlog/ConsoleAppender.c @@ -192,33 +192,31 @@ wLogConsoleAppender* WLog_ConsoleAppender_New(wLog* log) { wLogConsoleAppender* ConsoleAppender; - ConsoleAppender = (wLogConsoleAppender*) malloc(sizeof(wLogConsoleAppender)); + ConsoleAppender = (wLogConsoleAppender*) calloc(1, sizeof(wLogConsoleAppender)); - if (ConsoleAppender) - { - ZeroMemory(ConsoleAppender, sizeof(wLogConsoleAppender)); + if (!ConsoleAppender) + return NULL; - ConsoleAppender->Type = WLOG_APPENDER_CONSOLE; + ConsoleAppender->Type = WLOG_APPENDER_CONSOLE; - ConsoleAppender->Open = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Open; - ConsoleAppender->Close = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Close; + ConsoleAppender->Open = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Open; + ConsoleAppender->Close = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Close; - ConsoleAppender->WriteMessage = - (WLOG_APPENDER_WRITE_MESSAGE_FN) WLog_ConsoleAppender_WriteMessage; - ConsoleAppender->WriteDataMessage = - (WLOG_APPENDER_WRITE_DATA_MESSAGE_FN) WLog_ConsoleAppender_WriteDataMessage; - ConsoleAppender->WriteImageMessage = - (WLOG_APPENDER_WRITE_IMAGE_MESSAGE_FN) WLog_ConsoleAppender_WriteImageMessage; - ConsoleAppender->WritePacketMessage = - (WLOG_APPENDER_WRITE_PACKET_MESSAGE_FN) WLog_ConsoleAppender_WritePacketMessage; + ConsoleAppender->WriteMessage = + (WLOG_APPENDER_WRITE_MESSAGE_FN) WLog_ConsoleAppender_WriteMessage; + ConsoleAppender->WriteDataMessage = + (WLOG_APPENDER_WRITE_DATA_MESSAGE_FN) WLog_ConsoleAppender_WriteDataMessage; + ConsoleAppender->WriteImageMessage = + (WLOG_APPENDER_WRITE_IMAGE_MESSAGE_FN) WLog_ConsoleAppender_WriteImageMessage; + ConsoleAppender->WritePacketMessage = + (WLOG_APPENDER_WRITE_PACKET_MESSAGE_FN) WLog_ConsoleAppender_WritePacketMessage; - ConsoleAppender->outputStream = WLOG_CONSOLE_STDOUT; + ConsoleAppender->outputStream = WLOG_CONSOLE_STDOUT; #ifdef _WIN32 - if (IsDebuggerPresent()) - ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG; + if (IsDebuggerPresent()) + ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG; #endif - } return ConsoleAppender; } diff --git a/winpr/libwinpr/utils/wlog/wlog.c b/winpr/libwinpr/utils/wlog/wlog.c index a76a7ef31..5bd0db5c0 100644 --- a/winpr/libwinpr/utils/wlog/wlog.c +++ b/winpr/libwinpr/utils/wlog/wlog.c @@ -493,8 +493,14 @@ int WLog_ParseName(wLog* log, LPCSTR name) } names = _strdup(name); + if (!names) + return -1; log->NameCount = count; - log->Names = (LPSTR*) malloc(sizeof(LPSTR) * (count + 1)); + if(!(log->Names = (LPSTR*) malloc(sizeof(LPSTR) * (count + 1)))) + { + free(names); + return -1; + } log->Names[count] = NULL; count = 0; p = (char*) names; @@ -512,49 +518,46 @@ int WLog_ParseName(wLog* log, LPCSTR name) wLog* WLog_New(LPCSTR name, wLog* rootLogger) { - wLog* log; - char* env; + wLog* log = NULL; + char* env = NULL; DWORD nSize; int iLevel; log = (wLog*) calloc(1, sizeof(wLog)); - if (log) - { - log->Name = _strdup(name); + if (!log) + return 0; - if (!log->Name) - { - free (log); - return NULL; - } + log->Name = _strdup(name); - WLog_ParseName(log, name); - log->Parent = rootLogger; - log->ChildrenCount = 0; - log->ChildrenSize = 16; - log->Children = (wLog**) calloc(log->ChildrenSize, sizeof(wLog*)); + if (!log->Name) + goto out_fail; - if (!log->Children) - { - free (log->Name); - free (log); - return NULL; - } + if (WLog_ParseName(log, name) != 0) + goto out_fail; - log->Appender = NULL; + log->Parent = rootLogger; + log->ChildrenCount = 0; + log->ChildrenSize = 16; - if (rootLogger) - { - log->Level = WLOG_LEVEL_INHERIT; - } - else - { - log->Level = WLOG_INFO; - nSize = GetEnvironmentVariableA("WLOG_LEVEL", NULL, 0); + if (!(log->Children = (wLog**) calloc(log->ChildrenSize, sizeof(wLog*)))) + goto out_fail; - if (nSize) + log->Appender = NULL; + + if (rootLogger) + { + log->Level = WLOG_LEVEL_INHERIT; + } + else + { + log->Level = WLOG_INFO; + nSize = GetEnvironmentVariableA("WLOG_LEVEL", NULL, 0); + + if (nSize) + { + env = (LPSTR) malloc(nSize); + if (env) { - env = (LPSTR) malloc(nSize); nSize = GetEnvironmentVariableA("WLOG_LEVEL", env, nSize); iLevel = WLog_ParseLogLevel(env); @@ -563,15 +566,21 @@ wLog* WLog_New(LPCSTR name, wLog* rootLogger) free(env); } - } + } + } - iLevel = WLog_GetFilterLogLevel(log); + iLevel = WLog_GetFilterLogLevel(log); - if (iLevel >= 0) - log->Level = (DWORD) iLevel; - } + if (iLevel >= 0) + log->Level = (DWORD) iLevel; return log; + +out_fail: + free (log->Children); + free (log->Name); + free (log); + return NULL; } void WLog_Free(wLog* log) @@ -602,7 +611,9 @@ wLog* WLog_GetRoot() if (!g_RootLog) { - g_RootLog = WLog_New("", NULL); + if (!(g_RootLog = WLog_New("", NULL))) + return NULL; + g_RootLog->IsRoot = TRUE; WLog_ParseFilters(); logAppenderType = WLOG_APPENDER_CONSOLE; @@ -693,13 +704,18 @@ wLog* WLog_Get(LPCSTR name) { wLog* log; wLog* root; - root = WLog_GetRoot(); - log = WLog_FindChild(name); + if (!(root = WLog_GetRoot())) + return NULL; - if (!log) + if (!(log = WLog_FindChild(name))) { - log = WLog_New(name,root); - WLog_AddChild(root, log); + if (!(log = WLog_New(name, root))) + return NULL; + if (WLog_AddChild(root, log)) + { + WLog_Free(log); + return NULL; + } } return log; @@ -716,6 +732,9 @@ void WLog_Uninit() wLog* child = NULL; wLog* root = WLog_GetRoot(); + if (!root) + return; + for (index = 0; index < root->ChildrenCount; index++) { child = root->Children[index];