mirror of https://github.com/FreeRDP/FreeRDP
hardening
Start to add missing checks for: * *alloc * *_New
This commit is contained in:
parent
90579ae16f
commit
3c7662517c
|
@ -234,7 +234,9 @@ OPENSL_STREAM *android_OpenRecDevice(char *name, int sr, int inchannels,
|
||||||
|
|
||||||
OPENSL_STREAM *p;
|
OPENSL_STREAM *p;
|
||||||
p = (OPENSL_STREAM *) calloc(sizeof(OPENSL_STREAM),1);
|
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->inchannels = inchannels;
|
||||||
p->sr = sr;
|
p->sr = sr;
|
||||||
|
@ -314,7 +316,14 @@ void bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
|
||||||
assert(p->queue);
|
assert(p->queue);
|
||||||
|
|
||||||
e = calloc(1, sizeof(queue_element));
|
e = calloc(1, sizeof(queue_element));
|
||||||
|
if (!e)
|
||||||
|
return;
|
||||||
e->data = calloc(p->buffersize, p->bits_per_sample / 8);
|
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;
|
e->size = p->buffersize * p->bits_per_sample / 8;
|
||||||
|
|
||||||
Queue_Enqueue(p->queue, p->next);
|
Queue_Enqueue(p->queue, p->next);
|
||||||
|
@ -340,6 +349,7 @@ int android_RecIn(OPENSL_STREAM *p,short *buffer,int size)
|
||||||
if (!p->prep)
|
if (!p->prep)
|
||||||
{
|
{
|
||||||
p->prep = calloc(1, sizeof(queue_element));
|
p->prep = calloc(1, sizeof(queue_element));
|
||||||
|
|
||||||
p->prep->data = calloc(p->buffersize, p->bits_per_sample / 8);
|
p->prep->data = calloc(p->buffersize, p->bits_per_sample / 8);
|
||||||
p->prep->size = p->buffersize * p->bits_per_sample / 8;
|
p->prep->size = p->buffersize * p->bits_per_sample / 8;
|
||||||
|
|
||||||
|
|
|
@ -324,13 +324,22 @@ int main(int argc, char* argv[])
|
||||||
rdpChannels* channels;
|
rdpChannels* channels;
|
||||||
|
|
||||||
instance = freerdp_new();
|
instance = freerdp_new();
|
||||||
|
if (!instance)
|
||||||
|
{
|
||||||
|
WLog_ERR(TAG, "Couldn't create instance");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
instance->PreConnect = tf_pre_connect;
|
instance->PreConnect = tf_pre_connect;
|
||||||
instance->PostConnect = tf_post_connect;
|
instance->PostConnect = tf_post_connect;
|
||||||
|
|
||||||
instance->ContextSize = sizeof(tfContext);
|
instance->ContextSize = sizeof(tfContext);
|
||||||
instance->ContextNew = tf_context_new;
|
instance->ContextNew = tf_context_new;
|
||||||
instance->ContextFree = tf_context_free;
|
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;
|
channels = instance->context->channels;
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,8 @@ int main(int argc, char* argv[])
|
||||||
RdpClientEntry(&clientEntryPoints);
|
RdpClientEntry(&clientEntryPoints);
|
||||||
|
|
||||||
context = freerdp_client_context_new(&clientEntryPoints);
|
context = freerdp_client_context_new(&clientEntryPoints);
|
||||||
|
if (!context)
|
||||||
|
return 1;
|
||||||
|
|
||||||
settings = context->settings;
|
settings = context->settings;
|
||||||
xfc = (xfContext*) context;
|
xfc = (xfContext*) context;
|
||||||
|
|
|
@ -51,13 +51,21 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints)
|
||||||
pEntryPoints->GlobalInit();
|
pEntryPoints->GlobalInit();
|
||||||
|
|
||||||
instance = freerdp_new();
|
instance = freerdp_new();
|
||||||
|
if (!instance)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
instance->settings = pEntryPoints->settings;
|
instance->settings = pEntryPoints->settings;
|
||||||
instance->ContextSize = pEntryPoints->ContextSize;
|
instance->ContextSize = pEntryPoints->ContextSize;
|
||||||
instance->ContextNew = freerdp_client_common_new;
|
instance->ContextNew = freerdp_client_common_new;
|
||||||
instance->ContextFree = freerdp_client_common_free;
|
instance->ContextFree = freerdp_client_common_free;
|
||||||
instance->pClientEntryPoints = (RDP_CLIENT_ENTRY_POINTS*) malloc(pEntryPoints->Size);
|
instance->pClientEntryPoints = (RDP_CLIENT_ENTRY_POINTS*) malloc(pEntryPoints->Size);
|
||||||
|
if (!instance->pClientEntryPoints)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
|
|
||||||
CopyMemory(instance->pClientEntryPoints, pEntryPoints, pEntryPoints->Size);
|
CopyMemory(instance->pClientEntryPoints, pEntryPoints, pEntryPoints->Size);
|
||||||
freerdp_context_new(instance);
|
if (freerdp_context_new(instance) != 0)
|
||||||
|
goto out_fail2;
|
||||||
|
|
||||||
context = instance->context;
|
context = instance->context;
|
||||||
context->instance = instance;
|
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);
|
freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
|
|
||||||
|
out_fail2:
|
||||||
|
free(instance->pClientEntryPoints);
|
||||||
|
out_fail:
|
||||||
|
freerdp_free(instance);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freerdp_client_context_free(rdpContext* context)
|
void freerdp_client_context_free(rdpContext* context)
|
||||||
|
|
|
@ -226,12 +226,14 @@ void rfx_encode_rgb(RFX_CONTEXT* context, RFX_TILE* tile)
|
||||||
primitives_t* prims = primitives_get();
|
primitives_t* prims = primitives_get();
|
||||||
static const prim_size_t roi_64x64 = { 64, 64 };
|
static const prim_size_t roi_64x64 = { 64, 64 };
|
||||||
|
|
||||||
|
if (!(pBuffer = (BYTE*) BufferPool_Take(context->priv->BufferPool, -1)))
|
||||||
|
return;
|
||||||
|
|
||||||
YLen = CbLen = CrLen = 0;
|
YLen = CbLen = CrLen = 0;
|
||||||
YQuant = context->quants + (tile->quantIdxY * 10);
|
YQuant = context->quants + (tile->quantIdxY * 10);
|
||||||
CbQuant = context->quants + (tile->quantIdxCb * 10);
|
CbQuant = context->quants + (tile->quantIdxCb * 10);
|
||||||
CrQuant = context->quants + (tile->quantIdxCr * 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[0] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 0) + 16])); /* y_r_buffer */
|
||||||
pSrcDst[1] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 1) + 16])); /* cb_g_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 */
|
pSrcDst[2] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 2) + 16])); /* cr_b_buffer */
|
||||||
|
|
|
@ -580,8 +580,8 @@ int rfx_rlgr_encode(RLGR_MODE mode, const INT16* data, int data_size, BYTE* buff
|
||||||
RFX_BITSTREAM* bs;
|
RFX_BITSTREAM* bs;
|
||||||
int processed_size;
|
int processed_size;
|
||||||
|
|
||||||
bs = (RFX_BITSTREAM*) malloc(sizeof(RFX_BITSTREAM));
|
if (!(bs = (RFX_BITSTREAM*) calloc(1, sizeof(RFX_BITSTREAM))))
|
||||||
ZeroMemory(bs, sizeof(RFX_BITSTREAM));
|
return 0;
|
||||||
|
|
||||||
rfx_bitstream_attach(bs, buffer, buffer_size);
|
rfx_bitstream_attach(bs, buffer, buffer_size);
|
||||||
|
|
||||||
|
|
|
@ -330,7 +330,9 @@ BOOL rdp_send_deactivate_all(rdpRdp* rdp)
|
||||||
wStream* s;
|
wStream* s;
|
||||||
BOOL status;
|
BOOL status;
|
||||||
|
|
||||||
s = Stream_New(NULL, 1024);
|
if (!(s = Stream_New(NULL, 1024)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
rdp_init_stream_pdu(rdp, s);
|
rdp_init_stream_pdu(rdp, s);
|
||||||
|
|
||||||
Stream_Write_UINT32(s, rdp->settings->ShareId); /* shareId (4 bytes) */
|
Stream_Write_UINT32(s, rdp->settings->ShareId); /* shareId (4 bytes) */
|
||||||
|
|
|
@ -3687,7 +3687,9 @@ BOOL rdp_send_demand_active(rdpRdp* rdp)
|
||||||
wStream* s;
|
wStream* s;
|
||||||
BOOL status;
|
BOOL status;
|
||||||
|
|
||||||
s = Stream_New(NULL, 4096);
|
if (!(s = Stream_New(NULL, 4096)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
rdp_init_stream_pdu(rdp, s);
|
rdp_init_stream_pdu(rdp, s);
|
||||||
|
|
||||||
rdp->settings->ShareId = 0x10000 + rdp->mcs->userId;
|
rdp->settings->ShareId = 0x10000 + rdp->mcs->userId;
|
||||||
|
@ -3903,7 +3905,9 @@ BOOL rdp_send_confirm_active(rdpRdp* rdp)
|
||||||
wStream* s;
|
wStream* s;
|
||||||
BOOL status;
|
BOOL status;
|
||||||
|
|
||||||
s = Stream_New(NULL, 4096);
|
if (!(s = Stream_New(NULL, 4096)))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
rdp_init_stream_pdu(rdp, s);
|
rdp_init_stream_pdu(rdp, s);
|
||||||
|
|
||||||
rdp_write_confirm_active(s, rdp->settings);
|
rdp_write_confirm_active(s, rdp->settings);
|
||||||
|
|
|
@ -389,7 +389,8 @@ static int fastpath_recv_update_data(rdpFastPath* fastpath, wStream* s)
|
||||||
/* data was compressed, copy from decompression buffer */
|
/* data was compressed, copy from decompression buffer */
|
||||||
|
|
||||||
size = DstSize;
|
size = DstSize;
|
||||||
cs = StreamPool_Take(transport->ReceivePool, DstSize);
|
if (!(cs = StreamPool_Take(transport->ReceivePool, DstSize)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
Stream_SetPosition(cs, 0);
|
Stream_SetPosition(cs, 0);
|
||||||
Stream_Write(cs, pDstData, DstSize);
|
Stream_Write(cs, pDstData, DstSize);
|
||||||
|
@ -432,7 +433,9 @@ static int fastpath_recv_update_data(rdpFastPath* fastpath, wStream* s)
|
||||||
return -1;
|
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_SetPosition(fastpath->updateData, 0);
|
||||||
|
|
||||||
Stream_Copy(fastpath->updateData, cs, size);
|
Stream_Copy(fastpath->updateData, cs, size);
|
||||||
|
|
|
@ -148,7 +148,9 @@ BOOL freerdp_connect(freerdp* instance)
|
||||||
|
|
||||||
pcap_get_next_record_header(update->pcap_rfx, &record);
|
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);
|
record.data = Stream_Buffer(s);
|
||||||
|
|
||||||
pcap_get_next_record_content(update->pcap_rfx, &record);
|
pcap_get_next_record_content(update->pcap_rfx, &record);
|
||||||
|
@ -421,8 +423,9 @@ int freerdp_context_new(freerdp* instance)
|
||||||
rdpRdp* rdp;
|
rdpRdp* rdp;
|
||||||
rdpContext* context;
|
rdpContext* context;
|
||||||
|
|
||||||
instance->context = (rdpContext*) malloc(instance->ContextSize);
|
instance->context = (rdpContext*) calloc(1, instance->ContextSize);
|
||||||
ZeroMemory(instance->context, instance->ContextSize);
|
if (!instance->context)
|
||||||
|
return -1;
|
||||||
|
|
||||||
context = instance->context;
|
context = instance->context;
|
||||||
context->instance = instance;
|
context->instance = instance;
|
||||||
|
@ -431,16 +434,27 @@ int freerdp_context_new(freerdp* instance)
|
||||||
context->settings = instance->settings;
|
context->settings = instance->settings;
|
||||||
|
|
||||||
context->pubSub = PubSub_New(TRUE);
|
context->pubSub = PubSub_New(TRUE);
|
||||||
|
if(!context->pubSub)
|
||||||
|
goto out_error_pubsub;
|
||||||
PubSub_AddEventTypes(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEventType));
|
PubSub_AddEventTypes(context->pubSub, FreeRDP_Events, sizeof(FreeRDP_Events) / sizeof(wEventType));
|
||||||
|
|
||||||
context->metrics = metrics_new(context);
|
context->metrics = metrics_new(context);
|
||||||
|
if (!context->metrics)
|
||||||
|
goto out_error_metrics_new;
|
||||||
|
|
||||||
rdp = rdp_new(context);
|
rdp = rdp_new(context);
|
||||||
|
if (!rdp)
|
||||||
|
goto out_error_rdp_new;
|
||||||
|
|
||||||
instance->input = rdp->input;
|
instance->input = rdp->input;
|
||||||
instance->update = rdp->update;
|
instance->update = rdp->update;
|
||||||
instance->settings = rdp->settings;
|
instance->settings = rdp->settings;
|
||||||
instance->autodetect = rdp->autodetect;
|
instance->autodetect = rdp->autodetect;
|
||||||
|
|
||||||
context->graphics = graphics_new(context);
|
context->graphics = graphics_new(context);
|
||||||
|
if(!context->graphics)
|
||||||
|
goto out_error_graphics_new;
|
||||||
|
|
||||||
context->rdp = rdp;
|
context->rdp = rdp;
|
||||||
|
|
||||||
context->input = instance->input;
|
context->input = instance->input;
|
||||||
|
@ -461,8 +475,17 @@ int freerdp_context_new(freerdp* instance)
|
||||||
update_register_client_callbacks(rdp->update);
|
update_register_client_callbacks(rdp->update);
|
||||||
|
|
||||||
IFCALL(instance->ContextNew, instance, instance->context);
|
IFCALL(instance->ContextNew, instance, instance->context);
|
||||||
|
|
||||||
return 0;
|
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.
|
/** Deallocator function for a rdp context.
|
||||||
|
@ -581,15 +604,14 @@ freerdp* freerdp_new()
|
||||||
{
|
{
|
||||||
freerdp* instance;
|
freerdp* instance;
|
||||||
|
|
||||||
instance = (freerdp*) malloc(sizeof(freerdp));
|
instance = (freerdp*) calloc(1, sizeof(freerdp));
|
||||||
|
|
||||||
if (instance)
|
if (!instance)
|
||||||
{
|
return NULL;
|
||||||
ZeroMemory(instance, sizeof(freerdp));
|
|
||||||
instance->ContextSize = sizeof(rdpContext);
|
instance->ContextSize = sizeof(rdpContext);
|
||||||
instance->SendChannelData = freerdp_send_channel_data;
|
instance->SendChannelData = freerdp_send_channel_data;
|
||||||
instance->ReceiveChannelData = freerdp_channels_data;
|
instance->ReceiveChannelData = freerdp_channels_data;
|
||||||
}
|
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
|
@ -311,6 +311,11 @@ static BOOL freerdp_listener_check_fds(freerdp_listener* instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
client = freerdp_peer_new(peer_sockfd);
|
client = freerdp_peer_new(peer_sockfd);
|
||||||
|
if (!client)
|
||||||
|
{
|
||||||
|
closesocket((SOCKET) peer_sockfd);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
sin_addr = NULL;
|
sin_addr = NULL;
|
||||||
if (peer_addr.ss_family == AF_INET)
|
if (peer_addr.ss_family == AF_INET)
|
||||||
|
|
|
@ -632,8 +632,23 @@ void freerdp_peer_context_new(freerdp_peer* client)
|
||||||
|
|
||||||
context->metrics = metrics_new(context);
|
context->metrics = metrics_new(context);
|
||||||
|
|
||||||
|
if (!context->metrics)
|
||||||
|
{
|
||||||
|
client->context = NULL;
|
||||||
|
free(context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rdp = rdp_new(context);
|
rdp = rdp_new(context);
|
||||||
|
|
||||||
|
if (!rdp)
|
||||||
|
{
|
||||||
|
metrics_free(context->metrics);
|
||||||
|
free(context);
|
||||||
|
client->context = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
client->input = rdp->input;
|
client->input = rdp->input;
|
||||||
client->update = rdp->update;
|
client->update = rdp->update;
|
||||||
client->settings = rdp->settings;
|
client->settings = rdp->settings;
|
||||||
|
@ -663,6 +678,7 @@ void freerdp_peer_context_new(freerdp_peer* client)
|
||||||
client->DrainOutputBuffer = freerdp_peer_drain_output_buffer;
|
client->DrainOutputBuffer = freerdp_peer_drain_output_buffer;
|
||||||
|
|
||||||
IFCALL(client->ContextNew, client, client->context);
|
IFCALL(client->ContextNew, client, client->context);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void freerdp_peer_context_free(freerdp_peer* client)
|
void freerdp_peer_context_free(freerdp_peer* client)
|
||||||
|
@ -717,7 +733,10 @@ void freerdp_peer_free(freerdp_peer* client)
|
||||||
if (!client)
|
if (!client)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rdp_free(client->context->rdp);
|
if (client->context)
|
||||||
free(client->context);
|
{
|
||||||
|
rdp_free(client->context->rdp);
|
||||||
|
free(client->context);
|
||||||
|
}
|
||||||
free(client);
|
free(client);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
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_SetPosition(cs, 0);
|
||||||
Stream_Write(cs, pDstData, DstSize);
|
Stream_Write(cs, pDstData, DstSize);
|
||||||
|
|
|
@ -195,6 +195,8 @@ void settings_get_computer_name(rdpSettings* settings)
|
||||||
|
|
||||||
GetComputerNameExA(ComputerNameNetBIOS, NULL, &nSize);
|
GetComputerNameExA(ComputerNameNetBIOS, NULL, &nSize);
|
||||||
settings->ComputerName = (char*) malloc(nSize);
|
settings->ComputerName = (char*) malloc(nSize);
|
||||||
|
if (!settings->ComputerName)
|
||||||
|
return;
|
||||||
GetComputerNameExA(ComputerNameNetBIOS, settings->ComputerName, &nSize);
|
GetComputerNameExA(ComputerNameNetBIOS, settings->ComputerName, &nSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,11 +204,9 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
{
|
{
|
||||||
rdpSettings* settings;
|
rdpSettings* settings;
|
||||||
|
|
||||||
settings = (rdpSettings*) malloc(sizeof(rdpSettings));
|
settings = (rdpSettings*) calloc(1, sizeof(rdpSettings));
|
||||||
|
if (!settings)
|
||||||
if (settings)
|
return NULL;
|
||||||
{
|
|
||||||
ZeroMemory(settings, sizeof(rdpSettings));
|
|
||||||
|
|
||||||
settings->ServerMode = (flags & FREERDP_SETTINGS_SERVER_MODE) ? TRUE : FALSE;
|
settings->ServerMode = (flags & FREERDP_SETTINGS_SERVER_MODE) ? TRUE : FALSE;
|
||||||
settings->WaitForOutputBufferFlush = TRUE;
|
settings->WaitForOutputBufferFlush = TRUE;
|
||||||
|
@ -256,9 +256,9 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
settings->CompressionEnabled = TRUE;
|
settings->CompressionEnabled = TRUE;
|
||||||
|
|
||||||
if (settings->ServerMode)
|
if (settings->ServerMode)
|
||||||
settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61;
|
settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61;
|
||||||
else
|
else
|
||||||
settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61;
|
settings->CompressionLevel = PACKET_COMPR_TYPE_RDP61;
|
||||||
|
|
||||||
settings->Authentication = TRUE;
|
settings->Authentication = TRUE;
|
||||||
settings->AuthenticationOnly = FALSE;
|
settings->AuthenticationOnly = FALSE;
|
||||||
|
@ -269,21 +269,31 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
settings->ChannelCount = 0;
|
settings->ChannelCount = 0;
|
||||||
settings->ChannelDefArraySize = 32;
|
settings->ChannelDefArraySize = 32;
|
||||||
settings->ChannelDefArray = (CHANNEL_DEF*) calloc(settings->ChannelDefArraySize, sizeof(CHANNEL_DEF));
|
settings->ChannelDefArray = (CHANNEL_DEF*) calloc(settings->ChannelDefArraySize, sizeof(CHANNEL_DEF));
|
||||||
|
if (!settings->ChannelDefArray)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->MonitorCount = 0;
|
settings->MonitorCount = 0;
|
||||||
settings->MonitorDefArraySize = 32;
|
settings->MonitorDefArraySize = 32;
|
||||||
settings->MonitorDefArray = (rdpMonitor*) calloc(settings->MonitorDefArraySize, sizeof(rdpMonitor));
|
settings->MonitorDefArray = (rdpMonitor*) calloc(settings->MonitorDefArraySize, sizeof(rdpMonitor));
|
||||||
|
if (!settings->MonitorDefArray)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->MonitorLocalShiftX = 0;
|
settings->MonitorLocalShiftX = 0;
|
||||||
settings->MonitorLocalShiftY = 0;
|
settings->MonitorLocalShiftY = 0;
|
||||||
|
|
||||||
settings->MonitorIds = (UINT32*) calloc(16, sizeof(UINT32));
|
settings->MonitorIds = (UINT32*) calloc(16, sizeof(UINT32));
|
||||||
|
if(!settings->MonitorIds)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings_get_computer_name(settings);
|
settings_get_computer_name(settings);
|
||||||
|
|
||||||
settings->ReceivedCapabilities = malloc(32);
|
settings->ReceivedCapabilities = calloc(1, 32);
|
||||||
settings->OrderSupport = malloc(32);
|
if (!settings->ReceivedCapabilities)
|
||||||
ZeroMemory(settings->ReceivedCapabilities, 32);
|
goto out_fail;
|
||||||
ZeroMemory(settings->OrderSupport, 32);
|
|
||||||
|
settings->OrderSupport = calloc(1, 32);
|
||||||
|
if (!settings->OrderSupport)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE;
|
settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE;
|
||||||
settings->OrderSupport[NEG_PATBLT_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_SC_INDEX] = TRUE;
|
||||||
settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = TRUE;
|
settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = TRUE;
|
||||||
|
|
||||||
settings->ClientHostname = malloc(32);
|
settings->ClientProductId = calloc(1, 32);
|
||||||
settings->ClientProductId = malloc(32);
|
if (!settings->ClientProductId)
|
||||||
ZeroMemory(settings->ClientHostname, 32);
|
goto out_fail;
|
||||||
ZeroMemory(settings->ClientProductId, 32);
|
|
||||||
|
|
||||||
|
settings->ClientHostname = calloc(1, 32);
|
||||||
|
if (!settings->ClientHostname)
|
||||||
|
goto out_fail;
|
||||||
gethostname(settings->ClientHostname, 31);
|
gethostname(settings->ClientHostname, 31);
|
||||||
settings->ClientHostname[31] = 0;
|
settings->ClientHostname[31] = 0;
|
||||||
|
|
||||||
|
@ -337,6 +349,8 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
|
|
||||||
settings->BitmapCacheV2NumCells = 5;
|
settings->BitmapCacheV2NumCells = 5;
|
||||||
settings->BitmapCacheV2CellInfo = (BITMAP_CACHE_V2_CELL_INFO*) malloc(sizeof(BITMAP_CACHE_V2_CELL_INFO) * 6);
|
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].numEntries = 600;
|
||||||
settings->BitmapCacheV2CellInfo[0].persistent = FALSE;
|
settings->BitmapCacheV2CellInfo[0].persistent = FALSE;
|
||||||
settings->BitmapCacheV2CellInfo[1].numEntries = 600;
|
settings->BitmapCacheV2CellInfo[1].numEntries = 600;
|
||||||
|
@ -355,7 +369,11 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
|
|
||||||
settings->GlyphSupportLevel = GLYPH_SUPPORT_FULL;
|
settings->GlyphSupportLevel = GLYPH_SUPPORT_FULL;
|
||||||
settings->GlyphCache = malloc(sizeof(GLYPH_CACHE_DEFINITION) * 10);
|
settings->GlyphCache = malloc(sizeof(GLYPH_CACHE_DEFINITION) * 10);
|
||||||
|
if(!settings->GlyphCache)
|
||||||
|
goto out_fail;
|
||||||
settings->FragCache = malloc(sizeof(GLYPH_CACHE_DEFINITION));
|
settings->FragCache = malloc(sizeof(GLYPH_CACHE_DEFINITION));
|
||||||
|
if(!settings->FragCache)
|
||||||
|
goto out_fail;
|
||||||
settings->GlyphCache[0].cacheEntries = 254;
|
settings->GlyphCache[0].cacheEntries = 254;
|
||||||
settings->GlyphCache[0].cacheMaximumCellSize = 4;
|
settings->GlyphCache[0].cacheMaximumCellSize = 4;
|
||||||
settings->GlyphCache[1].cacheEntries = 254;
|
settings->GlyphCache[1].cacheEntries = 254;
|
||||||
|
@ -387,6 +405,8 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
settings->DrawNineGridCacheEntries = 256;
|
settings->DrawNineGridCacheEntries = 256;
|
||||||
|
|
||||||
settings->ClientDir = _strdup(client_dll);
|
settings->ClientDir = _strdup(client_dll);
|
||||||
|
if (!settings->ClientDir)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->RemoteAppNumIconCaches = 3;
|
settings->RemoteAppNumIconCaches = 3;
|
||||||
settings->RemoteAppNumIconCacheEntries = 12;
|
settings->RemoteAppNumIconCacheEntries = 12;
|
||||||
|
@ -420,38 +440,72 @@ rdpSettings* freerdp_settings_new(DWORD flags)
|
||||||
settings->GfxProgressiveV2 = FALSE;
|
settings->GfxProgressiveV2 = FALSE;
|
||||||
settings->GfxH264 = FALSE;
|
settings->GfxH264 = FALSE;
|
||||||
|
|
||||||
settings->ClientAutoReconnectCookie = (ARC_CS_PRIVATE_PACKET*) malloc(sizeof(ARC_CS_PRIVATE_PACKET));
|
settings->ClientAutoReconnectCookie = (ARC_CS_PRIVATE_PACKET*) calloc(1, sizeof(ARC_CS_PRIVATE_PACKET));
|
||||||
settings->ServerAutoReconnectCookie = (ARC_SC_PRIVATE_PACKET*) malloc(sizeof(ARC_SC_PRIVATE_PACKET));
|
if (!settings->ClientAutoReconnectCookie)
|
||||||
ZeroMemory(settings->ClientAutoReconnectCookie, sizeof(ARC_CS_PRIVATE_PACKET));
|
goto out_fail;
|
||||||
ZeroMemory(settings->ServerAutoReconnectCookie, sizeof(ARC_SC_PRIVATE_PACKET));
|
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));
|
settings->ClientTimeZone = (TIME_ZONE_INFO*) calloc(1,sizeof(TIME_ZONE_INFO));
|
||||||
ZeroMemory(settings->ClientTimeZone, sizeof(TIME_ZONE_INFO));
|
if (!settings->ClientTimeZone)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->DeviceArraySize = 16;
|
settings->DeviceArraySize = 16;
|
||||||
settings->DeviceArray = (RDPDR_DEVICE**) malloc(sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize);
|
settings->DeviceArray = (RDPDR_DEVICE**) calloc(1, sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize);
|
||||||
ZeroMemory(settings->DeviceArray, sizeof(RDPDR_DEVICE*) * settings->DeviceArraySize);
|
if (!settings->DeviceArray)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->StaticChannelArraySize = 16;
|
settings->StaticChannelArraySize = 16;
|
||||||
settings->StaticChannelArray = (ADDIN_ARGV**)
|
settings->StaticChannelArray = (ADDIN_ARGV**)
|
||||||
malloc(sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize);
|
calloc(1, sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize);
|
||||||
ZeroMemory(settings->StaticChannelArray, sizeof(ADDIN_ARGV*) * settings->StaticChannelArraySize);
|
if (!settings->StaticChannelArray)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->DynamicChannelArraySize = 16;
|
settings->DynamicChannelArraySize = 16;
|
||||||
settings->DynamicChannelArray = (ADDIN_ARGV**)
|
settings->DynamicChannelArray = (ADDIN_ARGV**)
|
||||||
malloc(sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize);
|
calloc(1, sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize);
|
||||||
ZeroMemory(settings->DynamicChannelArray, sizeof(ADDIN_ARGV*) * settings->DynamicChannelArraySize);
|
if(!settings->DynamicChannelArray)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings->HomePath = GetKnownPath(KNOWN_PATH_HOME);
|
settings->HomePath = GetKnownPath(KNOWN_PATH_HOME);
|
||||||
|
if (!settings->HomePath)
|
||||||
|
goto out_fail;
|
||||||
settings->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp");
|
settings->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp");
|
||||||
|
if (!settings->ConfigPath)
|
||||||
|
goto out_fail;
|
||||||
|
|
||||||
settings_load_hkey_local_machine(settings);
|
settings_load_hkey_local_machine(settings);
|
||||||
|
|
||||||
settings->SettingsModified = (BYTE*) malloc(sizeof(rdpSettings) / 8 );
|
settings->SettingsModified = (BYTE*) calloc(1, sizeof(rdpSettings) / 8 );
|
||||||
ZeroMemory(settings->SettingsModified, sizeof(rdpSettings) / 8);
|
if(!settings->SettingsModified)
|
||||||
}
|
goto out_fail;
|
||||||
|
|
||||||
return settings;
|
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)
|
rdpSettings* freerdp_settings_clone(rdpSettings* settings)
|
||||||
|
@ -649,66 +703,65 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings)
|
||||||
|
|
||||||
void freerdp_settings_free(rdpSettings* settings)
|
void freerdp_settings_free(rdpSettings* settings)
|
||||||
{
|
{
|
||||||
if (settings)
|
if (!settings)
|
||||||
{
|
return;
|
||||||
free(settings->ServerHostname);
|
free(settings->ServerHostname);
|
||||||
free(settings->Username);
|
free(settings->Username);
|
||||||
free(settings->Password);
|
free(settings->Password);
|
||||||
free(settings->Domain);
|
free(settings->Domain);
|
||||||
free(settings->PasswordHash);
|
free(settings->PasswordHash);
|
||||||
free(settings->AlternateShell);
|
free(settings->AlternateShell);
|
||||||
free(settings->ShellWorkingDirectory);
|
free(settings->ShellWorkingDirectory);
|
||||||
free(settings->ComputerName);
|
free(settings->ComputerName);
|
||||||
free(settings->ChannelDefArray);
|
free(settings->ChannelDefArray);
|
||||||
free(settings->MonitorDefArray);
|
free(settings->MonitorDefArray);
|
||||||
free(settings->MonitorIds);
|
free(settings->MonitorIds);
|
||||||
free(settings->ClientAddress);
|
free(settings->ClientAddress);
|
||||||
free(settings->ClientDir);
|
free(settings->ClientDir);
|
||||||
free(settings->AllowedTlsCiphers);
|
free(settings->AllowedTlsCiphers);
|
||||||
free(settings->CertificateFile);
|
free(settings->CertificateFile);
|
||||||
free(settings->PrivateKeyFile);
|
free(settings->PrivateKeyFile);
|
||||||
free(settings->ConnectionFile);
|
free(settings->ConnectionFile);
|
||||||
free(settings->AssistanceFile);
|
free(settings->AssistanceFile);
|
||||||
free(settings->ReceivedCapabilities);
|
free(settings->ReceivedCapabilities);
|
||||||
free(settings->OrderSupport);
|
free(settings->OrderSupport);
|
||||||
free(settings->ClientHostname);
|
free(settings->ClientHostname);
|
||||||
free(settings->ClientProductId);
|
free(settings->ClientProductId);
|
||||||
free(settings->ServerRandom);
|
free(settings->ServerRandom);
|
||||||
free(settings->ClientRandom);
|
free(settings->ClientRandom);
|
||||||
free(settings->ServerCertificate);
|
free(settings->ServerCertificate);
|
||||||
free(settings->RdpKeyFile);
|
free(settings->RdpKeyFile);
|
||||||
certificate_free(settings->RdpServerCertificate);
|
certificate_free(settings->RdpServerCertificate);
|
||||||
free(settings->ClientAutoReconnectCookie);
|
free(settings->ClientAutoReconnectCookie);
|
||||||
free(settings->ServerAutoReconnectCookie);
|
free(settings->ServerAutoReconnectCookie);
|
||||||
free(settings->ClientTimeZone);
|
free(settings->ClientTimeZone);
|
||||||
free(settings->BitmapCacheV2CellInfo);
|
free(settings->BitmapCacheV2CellInfo);
|
||||||
free(settings->GlyphCache);
|
free(settings->GlyphCache);
|
||||||
free(settings->FragCache);
|
free(settings->FragCache);
|
||||||
key_free(settings->RdpServerRsaKey);
|
key_free(settings->RdpServerRsaKey);
|
||||||
free(settings->ConfigPath);
|
free(settings->ConfigPath);
|
||||||
free(settings->CurrentPath);
|
free(settings->CurrentPath);
|
||||||
free(settings->HomePath);
|
free(settings->HomePath);
|
||||||
free(settings->LoadBalanceInfo);
|
free(settings->LoadBalanceInfo);
|
||||||
free(settings->TargetNetAddress);
|
free(settings->TargetNetAddress);
|
||||||
free(settings->RedirectionTargetFQDN);
|
free(settings->RedirectionTargetFQDN);
|
||||||
free(settings->RedirectionTargetNetBiosName);
|
free(settings->RedirectionTargetNetBiosName);
|
||||||
free(settings->RedirectionUsername);
|
free(settings->RedirectionUsername);
|
||||||
free(settings->RedirectionDomain);
|
free(settings->RedirectionDomain);
|
||||||
free(settings->RedirectionPassword);
|
free(settings->RedirectionPassword);
|
||||||
free(settings->RedirectionTsvUrl);
|
free(settings->RedirectionTsvUrl);
|
||||||
free(settings->RemoteAssistanceSessionId);
|
free(settings->RemoteAssistanceSessionId);
|
||||||
free(settings->AuthenticationServiceClass);
|
free(settings->AuthenticationServiceClass);
|
||||||
free(settings->GatewayHostname);
|
free(settings->GatewayHostname);
|
||||||
free(settings->GatewayUsername);
|
free(settings->GatewayUsername);
|
||||||
free(settings->GatewayPassword);
|
free(settings->GatewayPassword);
|
||||||
free(settings->GatewayDomain);
|
free(settings->GatewayDomain);
|
||||||
freerdp_target_net_addresses_free(settings);
|
freerdp_target_net_addresses_free(settings);
|
||||||
freerdp_device_collection_free(settings);
|
freerdp_device_collection_free(settings);
|
||||||
freerdp_static_channel_collection_free(settings);
|
freerdp_static_channel_collection_free(settings);
|
||||||
freerdp_dynamic_channel_collection_free(settings);
|
freerdp_dynamic_channel_collection_free(settings);
|
||||||
free(settings->SettingsModified);
|
free(settings->SettingsModified);
|
||||||
free(settings);
|
free(settings);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
|
@ -61,7 +61,8 @@ static void* transport_client_thread(void* arg);
|
||||||
wStream* transport_send_stream_init(rdpTransport* transport, int size)
|
wStream* transport_send_stream_init(rdpTransport* transport, int size)
|
||||||
{
|
{
|
||||||
wStream* s;
|
wStream* s;
|
||||||
s = StreamPool_Take(transport->ReceivePool, size);
|
if (!(s = StreamPool_Take(transport->ReceivePool, size)))
|
||||||
|
return NULL;
|
||||||
Stream_EnsureCapacity(s, size);
|
Stream_EnsureCapacity(s, size);
|
||||||
Stream_SetPosition(s, 0);
|
Stream_SetPosition(s, 0);
|
||||||
return s;
|
return s;
|
||||||
|
@ -734,7 +735,10 @@ int transport_check_fds(rdpTransport* transport)
|
||||||
}
|
}
|
||||||
|
|
||||||
received = transport->ReceiveBuffer;
|
received = transport->ReceiveBuffer;
|
||||||
transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0);
|
if (!(transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0)))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* status:
|
* status:
|
||||||
* -1: error
|
* -1: error
|
||||||
|
|
|
@ -233,7 +233,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args)
|
||||||
|
|
||||||
#define WLog_Print(_log, _log_level, _fmt, ...) \
|
#define WLog_Print(_log, _log_level, _fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (_log_level >= WLog_GetLogLevel(_log)) { \
|
if (_log && _log_level >= WLog_GetLogLevel(_log)) { \
|
||||||
wLogMessage _log_message; \
|
wLogMessage _log_message; \
|
||||||
_log_message.Type = WLOG_MESSAGE_TEXT; \
|
_log_message.Type = WLOG_MESSAGE_TEXT; \
|
||||||
_log_message.Level = _log_level; \
|
_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) \
|
#define WLog_PrintVA(_log, _log_level, _fmt, _args) \
|
||||||
do { \
|
do { \
|
||||||
if (_log_level >= WLog_GetLogLevel(_log)) { \
|
if (_log && _log_level >= WLog_GetLogLevel(_log)) { \
|
||||||
wLogMessage _log_message; \
|
wLogMessage _log_message; \
|
||||||
_log_message.Type = WLOG_MESSAGE_TEXT; \
|
_log_message.Type = WLOG_MESSAGE_TEXT; \
|
||||||
_log_message.Level = _log_level; \
|
_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, ...) \
|
#define WLog_Data(_log, _log_level, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (_log_level >= WLog_GetLogLevel(_log)) { \
|
if (_log && _log_level >= WLog_GetLogLevel(_log)) { \
|
||||||
wLogMessage _log_message; \
|
wLogMessage _log_message; \
|
||||||
_log_message.Type = WLOG_MESSAGE_DATA; \
|
_log_message.Type = WLOG_MESSAGE_DATA; \
|
||||||
_log_message.Level = _log_level; \
|
_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, ...) \
|
#define WLog_Image(_log, _log_level, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (_log_level >= WLog_GetLogLevel(_log)) { \
|
if (_log && _log_level >= WLog_GetLogLevel(_log)) { \
|
||||||
wLogMessage _log_message; \
|
wLogMessage _log_message; \
|
||||||
_log_message.Type = WLOG_MESSAGE_IMAGE; \
|
_log_message.Type = WLOG_MESSAGE_IMAGE; \
|
||||||
_log_message.Level = _log_level; \
|
_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, ...) \
|
#define WLog_Packet(_log, _log_level, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (_log_level >= WLog_GetLogLevel(_log)) { \
|
if (_log && _log_level >= WLog_GetLogLevel(_log)) { \
|
||||||
wLogMessage _log_message; \
|
wLogMessage _log_message; \
|
||||||
_log_message.Type = WLOG_MESSAGE_PACKET; \
|
_log_message.Type = WLOG_MESSAGE_PACKET; \
|
||||||
_log_message.Level = _log_level; \
|
_log_message.Level = _log_level; \
|
||||||
|
@ -302,7 +302,7 @@ WINPR_API int WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args)
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define WLog_IsLevelActive(_log, _log_level) \
|
#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_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__)
|
#define WLog_VRB(tag, fmt, ...) WLog_Print(WLog_Get(tag), WLOG_TRACE, fmt, ## __VA_ARGS__)
|
||||||
|
|
|
@ -41,12 +41,21 @@ UINT SetErrorMode(UINT uMode)
|
||||||
|
|
||||||
DWORD GetLastError(VOID)
|
DWORD GetLastError(VOID)
|
||||||
{
|
{
|
||||||
return NtCurrentTeb()->LastErrorValue;
|
PTEB pt = NtCurrentTeb();
|
||||||
|
if (pt)
|
||||||
|
{
|
||||||
|
return NtCurrentTeb()->LastErrorValue;
|
||||||
|
}
|
||||||
|
return ERROR_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID SetLastError(DWORD dwErrCode)
|
VOID SetLastError(DWORD dwErrCode)
|
||||||
{
|
{
|
||||||
NtCurrentTeb()->LastErrorValue = dwErrCode;
|
PTEB pt = NtCurrentTeb();
|
||||||
|
if (pt)
|
||||||
|
{
|
||||||
|
pt->LastErrorValue = dwErrCode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID RestoreLastError(DWORD dwErrCode)
|
VOID RestoreLastError(DWORD dwErrCode)
|
||||||
|
|
|
@ -271,8 +271,14 @@ static void _HandleCreatorsInit()
|
||||||
/* NB: error management to be done outside of this function */
|
/* NB: error management to be done outside of this function */
|
||||||
assert(_HandleCreators == NULL);
|
assert(_HandleCreators == NULL);
|
||||||
_HandleCreators = (HANDLE_CREATOR**)calloc(HANDLE_CREATOR_MAX+1, sizeof(HANDLE_CREATOR*));
|
_HandleCreators = (HANDLE_CREATOR**)calloc(HANDLE_CREATOR_MAX+1, sizeof(HANDLE_CREATOR*));
|
||||||
InitializeCriticalSection(&_HandleCreatorsLock);
|
if (!_HandleCreators)
|
||||||
assert(_HandleCreators != NULL);
|
return;
|
||||||
|
|
||||||
|
if(!InitializeCriticalSectionEx(&_HandleCreatorsLock, 0, 0))
|
||||||
|
{
|
||||||
|
free(_HandleCreators);
|
||||||
|
_HandleCreators = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -407,9 +413,16 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||||
|
|
||||||
free(name);
|
free(name);
|
||||||
pNamedPipe = (WINPR_NAMED_PIPE*) calloc(1, sizeof(WINPR_NAMED_PIPE));
|
pNamedPipe = (WINPR_NAMED_PIPE*) calloc(1, sizeof(WINPR_NAMED_PIPE));
|
||||||
|
if (!pNamedPipe)
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
hNamedPipe = (HANDLE) pNamedPipe;
|
hNamedPipe = (HANDLE) pNamedPipe;
|
||||||
WINPR_HANDLE_SET_TYPE(pNamedPipe, HANDLE_TYPE_NAMED_PIPE);
|
WINPR_HANDLE_SET_TYPE(pNamedPipe, HANDLE_TYPE_NAMED_PIPE);
|
||||||
pNamedPipe->name = _strdup(lpFileName);
|
pNamedPipe->name = _strdup(lpFileName);
|
||||||
|
if (!pNamedPipe->name)
|
||||||
|
{
|
||||||
|
free(pNamedPipe);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
pNamedPipe->dwOpenMode = 0;
|
pNamedPipe->dwOpenMode = 0;
|
||||||
pNamedPipe->dwPipeMode = 0;
|
pNamedPipe->dwPipeMode = 0;
|
||||||
pNamedPipe->nMaxInstances = 0;
|
pNamedPipe->nMaxInstances = 0;
|
||||||
|
@ -418,7 +431,22 @@ HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||||
pNamedPipe->nDefaultTimeOut = 0;
|
pNamedPipe->nDefaultTimeOut = 0;
|
||||||
pNamedPipe->dwFlagsAndAttributes = dwFlagsAndAttributes;
|
pNamedPipe->dwFlagsAndAttributes = dwFlagsAndAttributes;
|
||||||
pNamedPipe->lpFileName = GetNamedPipeNameWithoutPrefixA(lpFileName);
|
pNamedPipe->lpFileName = GetNamedPipeNameWithoutPrefixA(lpFileName);
|
||||||
|
if (!pNamedPipe->lpFileName)
|
||||||
|
{
|
||||||
|
free((void *)pNamedPipe->name);
|
||||||
|
free(pNamedPipe);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
}
|
||||||
pNamedPipe->lpFilePath = GetNamedPipeUnixDomainSocketFilePathA(lpFileName);
|
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->clientfd = socket(PF_LOCAL, SOCK_STREAM, 0);
|
||||||
pNamedPipe->serverfd = -1;
|
pNamedPipe->serverfd = -1;
|
||||||
pNamedPipe->ServerMode = FALSE;
|
pNamedPipe->ServerMode = FALSE;
|
||||||
|
|
|
@ -53,6 +53,8 @@ char* GetEnvAlloc(LPCSTR lpName)
|
||||||
if (length > 0)
|
if (length > 0)
|
||||||
{
|
{
|
||||||
env = malloc(length + 1);
|
env = malloc(length + 1);
|
||||||
|
if (!env)
|
||||||
|
return NULL;
|
||||||
GetEnvironmentVariableA(lpName, env, length + 1);
|
GetEnvironmentVariableA(lpName, env, length + 1);
|
||||||
env[length] = '\0';
|
env[length] = '\0';
|
||||||
}
|
}
|
||||||
|
@ -68,6 +70,8 @@ char* GetPath_HOME()
|
||||||
path = GetEnvAlloc("UserProfile");
|
path = GetEnvAlloc("UserProfile");
|
||||||
#elif defined(ANDROID)
|
#elif defined(ANDROID)
|
||||||
path = malloc(2);
|
path = malloc(2);
|
||||||
|
if (!path)
|
||||||
|
return NULL;
|
||||||
strcpy(path, "/");
|
strcpy(path, "/");
|
||||||
#else
|
#else
|
||||||
path = GetEnvAlloc("HOME");
|
path = GetEnvAlloc("HOME");
|
||||||
|
@ -144,6 +148,11 @@ char* GetPath_XDG_CONFIG_HOME()
|
||||||
home = GetPath_TEMP();
|
home = GetPath_TEMP();
|
||||||
|
|
||||||
path = (char*) malloc(strlen(home) + strlen("/.config") + 1);
|
path = (char*) malloc(strlen(home) + strlen("/.config") + 1);
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
free(home);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
sprintf(path, "%s%s", home, "/.config");
|
sprintf(path, "%s%s", home, "/.config");
|
||||||
|
|
||||||
free(home);
|
free(home);
|
||||||
|
@ -264,6 +273,8 @@ char* GetKnownSubPath(int id, const char* path)
|
||||||
char* knownPath;
|
char* knownPath;
|
||||||
|
|
||||||
knownPath = GetKnownPath(id);
|
knownPath = GetKnownPath(id);
|
||||||
|
if (!knownPath)
|
||||||
|
return NULL;
|
||||||
subPath = GetCombinedPath(knownPath, path);
|
subPath = GetCombinedPath(knownPath, path);
|
||||||
|
|
||||||
free(knownPath);
|
free(knownPath);
|
||||||
|
|
|
@ -760,6 +760,8 @@ BOOL WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
lpFilePath = GetNamedPipeUnixDomainSocketFilePathA(lpNamedPipeName);
|
lpFilePath = GetNamedPipeUnixDomainSocketFilePathA(lpNamedPipeName);
|
||||||
|
if (!lpFilePath)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT)
|
if (nTimeOut == NMPWAIT_USE_DEFAULT_WAIT)
|
||||||
nTimeOut = 50;
|
nTimeOut = 50;
|
||||||
|
|
|
@ -88,6 +88,8 @@ static void reg_load_start(Reg* reg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
reg->buffer = (char*) malloc(file_size + 2);
|
reg->buffer = (char*) malloc(file_size + 2);
|
||||||
|
if (!reg->buffer)
|
||||||
|
return ;
|
||||||
|
|
||||||
if (fread(reg->buffer, file_size, 1, reg->fp) != 1)
|
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;
|
data = p[3] + 1;
|
||||||
length = p[1] - p[0];
|
length = p[1] - p[0];
|
||||||
name = (char*) malloc(length + 1);
|
name = (char*) malloc(length + 1);
|
||||||
|
if (!name)
|
||||||
|
return 0;
|
||||||
memcpy(name, p[0], length);
|
memcpy(name, p[0], length);
|
||||||
name[length] = '\0';
|
name[length] = '\0';
|
||||||
value = (RegVal*) malloc(sizeof(RegVal));
|
value = (RegVal*) malloc(sizeof(RegVal));
|
||||||
|
@ -243,6 +247,8 @@ static RegKey* reg_load_key(Reg* reg, RegKey* key)
|
||||||
p[0] = reg->line + 1;
|
p[0] = reg->line + 1;
|
||||||
p[1] = strrchr(p[0], ']');
|
p[1] = strrchr(p[0], ']');
|
||||||
subkey = (RegKey*) malloc(sizeof(RegKey));
|
subkey = (RegKey*) malloc(sizeof(RegKey));
|
||||||
|
if (!subkey)
|
||||||
|
return NULL;
|
||||||
subkey->values = NULL;
|
subkey->values = NULL;
|
||||||
subkey->prev = subkey->next = NULL;
|
subkey->prev = subkey->next = NULL;
|
||||||
length = p[1] - p[0];
|
length = p[1] - p[0];
|
||||||
|
@ -359,35 +365,41 @@ Reg* reg_open(BOOL read_only)
|
||||||
Reg* reg;
|
Reg* reg;
|
||||||
reg = (Reg*) malloc(sizeof(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;
|
fclose(reg->fp);
|
||||||
reg->filename = WINPR_HKLM_HIVE;
|
free(reg);
|
||||||
|
return NULL;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
reg->root_key->values = NULL;
|
||||||
|
reg->root_key->subkeys = NULL;
|
||||||
|
reg->root_key->name = "HKEY_LOCAL_MACHINE";
|
||||||
|
reg_load(reg);
|
||||||
|
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,13 +67,21 @@ BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwS
|
||||||
lpCriticalSection->RecursionCount = 0;
|
lpCriticalSection->RecursionCount = 0;
|
||||||
lpCriticalSection->OwningThread = NULL;
|
lpCriticalSection->OwningThread = NULL;
|
||||||
lpCriticalSection->LockSemaphore = (winpr_sem_t*) malloc(sizeof(winpr_sem_t));
|
lpCriticalSection->LockSemaphore = (winpr_sem_t*) malloc(sizeof(winpr_sem_t));
|
||||||
|
if (!lpCriticalSection->LockSemaphore)
|
||||||
|
return FALSE;
|
||||||
#if defined(__APPLE__)
|
#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
|
#else
|
||||||
sem_init(lpCriticalSection->LockSemaphore, 0, 0);
|
if(sem_init(lpCriticalSection->LockSemaphore, 0, 0) != 0)
|
||||||
|
goto out_fail;
|
||||||
#endif
|
#endif
|
||||||
SetCriticalSectionSpinCount(lpCriticalSection, dwSpinCount);
|
SetCriticalSectionSpinCount(lpCriticalSection, dwSpinCount);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
out_fail:
|
||||||
|
free(lpCriticalSection->LockSemaphore);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount)
|
BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount)
|
||||||
|
|
|
@ -377,13 +377,27 @@ HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize
|
||||||
}
|
}
|
||||||
#endif
|
#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);
|
WINPR_HANDLE_SET_TYPE(thread, HANDLE_TYPE_THREAD);
|
||||||
handle = (HANDLE) thread;
|
handle = (HANDLE) thread;
|
||||||
|
|
||||||
if (!thread_list)
|
if (!thread_list)
|
||||||
{
|
{
|
||||||
thread_list = ListDictionary_New(TRUE);
|
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;
|
thread_list->objectKey.fnObjectEquals = thread_compare;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -204,18 +204,28 @@ wPubSub* PubSub_New(BOOL synchronized)
|
||||||
|
|
||||||
pubSub = (wPubSub*) malloc(sizeof(wPubSub));
|
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)
|
if (pubSub->synchronized)
|
||||||
InitializeCriticalSectionAndSpinCount(&pubSub->lock, 4000);
|
DeleteCriticalSection(&pubSub->lock);
|
||||||
|
free(pubSub);
|
||||||
pubSub->count = 0;
|
return NULL;
|
||||||
pubSub->size = 64;
|
|
||||||
|
|
||||||
pubSub->events = (wEventType*) malloc(sizeof(wEventType) * pubSub->size);
|
|
||||||
ZeroMemory(pubSub->events, sizeof(wEventType) * pubSub->size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return pubSub;
|
return pubSub;
|
||||||
|
|
|
@ -178,10 +178,12 @@ wStream* StreamPool_Take(wStreamPool* pool, size_t size)
|
||||||
Stream_EnsureCapacity(s, size);
|
Stream_EnsureCapacity(s, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->pool = pool;
|
if (s)
|
||||||
s->count = 1;
|
{
|
||||||
|
s->pool = pool;
|
||||||
StreamPool_AddUsed(pool, s);
|
s->count = 1;
|
||||||
|
StreamPool_AddUsed(pool, s);
|
||||||
|
}
|
||||||
|
|
||||||
if (pool->synchronized)
|
if (pool->synchronized)
|
||||||
LeaveCriticalSection(&pool->lock);
|
LeaveCriticalSection(&pool->lock);
|
||||||
|
|
|
@ -119,7 +119,8 @@ static BOOL _winpr_openssl_initialize_locking(void)
|
||||||
|
|
||||||
while (i--)
|
while (i--)
|
||||||
{
|
{
|
||||||
CloseHandle(g_winpr_openssl_locks[i]);
|
if (locks[i])
|
||||||
|
CloseHandle(locks[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(locks);
|
free(locks);
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
|
wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
|
||||||
{
|
{
|
||||||
wLogAppender* appender = NULL;
|
wLogAppender* appender = NULL;
|
||||||
|
if (!log)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (logAppenderType == WLOG_APPENDER_CONSOLE)
|
if (logAppenderType == WLOG_APPENDER_CONSOLE)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +53,14 @@ wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
|
||||||
if (!appender)
|
if (!appender)
|
||||||
appender = (wLogAppender*) WLog_ConsoleAppender_New(log);
|
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);
|
InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
|
||||||
|
|
||||||
|
|
|
@ -192,33 +192,31 @@ wLogConsoleAppender* WLog_ConsoleAppender_New(wLog* log)
|
||||||
{
|
{
|
||||||
wLogConsoleAppender* ConsoleAppender;
|
wLogConsoleAppender* ConsoleAppender;
|
||||||
|
|
||||||
ConsoleAppender = (wLogConsoleAppender*) malloc(sizeof(wLogConsoleAppender));
|
ConsoleAppender = (wLogConsoleAppender*) calloc(1, sizeof(wLogConsoleAppender));
|
||||||
|
|
||||||
if (ConsoleAppender)
|
if (!ConsoleAppender)
|
||||||
{
|
return NULL;
|
||||||
ZeroMemory(ConsoleAppender, sizeof(wLogConsoleAppender));
|
|
||||||
|
|
||||||
ConsoleAppender->Type = WLOG_APPENDER_CONSOLE;
|
ConsoleAppender->Type = WLOG_APPENDER_CONSOLE;
|
||||||
|
|
||||||
ConsoleAppender->Open = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Open;
|
ConsoleAppender->Open = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Open;
|
||||||
ConsoleAppender->Close = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Close;
|
ConsoleAppender->Close = (WLOG_APPENDER_OPEN_FN) WLog_ConsoleAppender_Close;
|
||||||
|
|
||||||
ConsoleAppender->WriteMessage =
|
ConsoleAppender->WriteMessage =
|
||||||
(WLOG_APPENDER_WRITE_MESSAGE_FN) WLog_ConsoleAppender_WriteMessage;
|
(WLOG_APPENDER_WRITE_MESSAGE_FN) WLog_ConsoleAppender_WriteMessage;
|
||||||
ConsoleAppender->WriteDataMessage =
|
ConsoleAppender->WriteDataMessage =
|
||||||
(WLOG_APPENDER_WRITE_DATA_MESSAGE_FN) WLog_ConsoleAppender_WriteDataMessage;
|
(WLOG_APPENDER_WRITE_DATA_MESSAGE_FN) WLog_ConsoleAppender_WriteDataMessage;
|
||||||
ConsoleAppender->WriteImageMessage =
|
ConsoleAppender->WriteImageMessage =
|
||||||
(WLOG_APPENDER_WRITE_IMAGE_MESSAGE_FN) WLog_ConsoleAppender_WriteImageMessage;
|
(WLOG_APPENDER_WRITE_IMAGE_MESSAGE_FN) WLog_ConsoleAppender_WriteImageMessage;
|
||||||
ConsoleAppender->WritePacketMessage =
|
ConsoleAppender->WritePacketMessage =
|
||||||
(WLOG_APPENDER_WRITE_PACKET_MESSAGE_FN) WLog_ConsoleAppender_WritePacketMessage;
|
(WLOG_APPENDER_WRITE_PACKET_MESSAGE_FN) WLog_ConsoleAppender_WritePacketMessage;
|
||||||
|
|
||||||
ConsoleAppender->outputStream = WLOG_CONSOLE_STDOUT;
|
ConsoleAppender->outputStream = WLOG_CONSOLE_STDOUT;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (IsDebuggerPresent())
|
if (IsDebuggerPresent())
|
||||||
ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
|
ConsoleAppender->outputStream = WLOG_CONSOLE_DEBUG;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
return ConsoleAppender;
|
return ConsoleAppender;
|
||||||
}
|
}
|
||||||
|
|
|
@ -493,8 +493,14 @@ int WLog_ParseName(wLog* log, LPCSTR name)
|
||||||
}
|
}
|
||||||
|
|
||||||
names = _strdup(name);
|
names = _strdup(name);
|
||||||
|
if (!names)
|
||||||
|
return -1;
|
||||||
log->NameCount = count;
|
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;
|
log->Names[count] = NULL;
|
||||||
count = 0;
|
count = 0;
|
||||||
p = (char*) names;
|
p = (char*) names;
|
||||||
|
@ -512,49 +518,46 @@ int WLog_ParseName(wLog* log, LPCSTR name)
|
||||||
|
|
||||||
wLog* WLog_New(LPCSTR name, wLog* rootLogger)
|
wLog* WLog_New(LPCSTR name, wLog* rootLogger)
|
||||||
{
|
{
|
||||||
wLog* log;
|
wLog* log = NULL;
|
||||||
char* env;
|
char* env = NULL;
|
||||||
DWORD nSize;
|
DWORD nSize;
|
||||||
int iLevel;
|
int iLevel;
|
||||||
log = (wLog*) calloc(1, sizeof(wLog));
|
log = (wLog*) calloc(1, sizeof(wLog));
|
||||||
|
|
||||||
if (log)
|
if (!log)
|
||||||
{
|
return 0;
|
||||||
log->Name = _strdup(name);
|
|
||||||
|
|
||||||
if (!log->Name)
|
log->Name = _strdup(name);
|
||||||
{
|
|
||||||
free (log);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
WLog_ParseName(log, name);
|
if (!log->Name)
|
||||||
log->Parent = rootLogger;
|
goto out_fail;
|
||||||
log->ChildrenCount = 0;
|
|
||||||
log->ChildrenSize = 16;
|
|
||||||
log->Children = (wLog**) calloc(log->ChildrenSize, sizeof(wLog*));
|
|
||||||
|
|
||||||
if (!log->Children)
|
if (WLog_ParseName(log, name) != 0)
|
||||||
{
|
goto out_fail;
|
||||||
free (log->Name);
|
|
||||||
free (log);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
log->Appender = NULL;
|
log->Parent = rootLogger;
|
||||||
|
log->ChildrenCount = 0;
|
||||||
|
log->ChildrenSize = 16;
|
||||||
|
|
||||||
if (rootLogger)
|
if (!(log->Children = (wLog**) calloc(log->ChildrenSize, sizeof(wLog*))))
|
||||||
{
|
goto out_fail;
|
||||||
log->Level = WLOG_LEVEL_INHERIT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log->Level = WLOG_INFO;
|
|
||||||
nSize = GetEnvironmentVariableA("WLOG_LEVEL", NULL, 0);
|
|
||||||
|
|
||||||
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);
|
nSize = GetEnvironmentVariableA("WLOG_LEVEL", env, nSize);
|
||||||
iLevel = WLog_ParseLogLevel(env);
|
iLevel = WLog_ParseLogLevel(env);
|
||||||
|
|
||||||
|
@ -563,15 +566,21 @@ wLog* WLog_New(LPCSTR name, wLog* rootLogger)
|
||||||
|
|
||||||
free(env);
|
free(env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iLevel = WLog_GetFilterLogLevel(log);
|
iLevel = WLog_GetFilterLogLevel(log);
|
||||||
|
|
||||||
if (iLevel >= 0)
|
if (iLevel >= 0)
|
||||||
log->Level = (DWORD) iLevel;
|
log->Level = (DWORD) iLevel;
|
||||||
}
|
|
||||||
|
|
||||||
return log;
|
return log;
|
||||||
|
|
||||||
|
out_fail:
|
||||||
|
free (log->Children);
|
||||||
|
free (log->Name);
|
||||||
|
free (log);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WLog_Free(wLog* log)
|
void WLog_Free(wLog* log)
|
||||||
|
@ -602,7 +611,9 @@ wLog* WLog_GetRoot()
|
||||||
|
|
||||||
if (!g_RootLog)
|
if (!g_RootLog)
|
||||||
{
|
{
|
||||||
g_RootLog = WLog_New("", NULL);
|
if (!(g_RootLog = WLog_New("", NULL)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
g_RootLog->IsRoot = TRUE;
|
g_RootLog->IsRoot = TRUE;
|
||||||
WLog_ParseFilters();
|
WLog_ParseFilters();
|
||||||
logAppenderType = WLOG_APPENDER_CONSOLE;
|
logAppenderType = WLOG_APPENDER_CONSOLE;
|
||||||
|
@ -693,13 +704,18 @@ wLog* WLog_Get(LPCSTR name)
|
||||||
{
|
{
|
||||||
wLog* log;
|
wLog* log;
|
||||||
wLog* root;
|
wLog* root;
|
||||||
root = WLog_GetRoot();
|
if (!(root = WLog_GetRoot()))
|
||||||
log = WLog_FindChild(name);
|
return NULL;
|
||||||
|
|
||||||
if (!log)
|
if (!(log = WLog_FindChild(name)))
|
||||||
{
|
{
|
||||||
log = WLog_New(name,root);
|
if (!(log = WLog_New(name, root)))
|
||||||
WLog_AddChild(root, log);
|
return NULL;
|
||||||
|
if (WLog_AddChild(root, log))
|
||||||
|
{
|
||||||
|
WLog_Free(log);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return log;
|
return log;
|
||||||
|
@ -716,6 +732,9 @@ void WLog_Uninit()
|
||||||
wLog* child = NULL;
|
wLog* child = NULL;
|
||||||
wLog* root = WLog_GetRoot();
|
wLog* root = WLog_GetRoot();
|
||||||
|
|
||||||
|
if (!root)
|
||||||
|
return;
|
||||||
|
|
||||||
for (index = 0; index < root->ChildrenCount; index++)
|
for (index = 0; index < root->ChildrenCount; index++)
|
||||||
{
|
{
|
||||||
child = root->Children[index];
|
child = root->Children[index];
|
||||||
|
|
Loading…
Reference in New Issue