478 changes: 262 additions & 216 deletions channels/drdynvc/client/drdynvc_main.c

Large diffs are not rendered by default.

11 changes: 3 additions & 8 deletions channels/drdynvc/client/drdynvc_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,16 @@

typedef struct drdynvc_plugin drdynvcPlugin;

#define MAX_PLUGINS 32

struct _DVCMAN
{
IWTSVirtualChannelManager iface;

drdynvcPlugin* drdynvc;

size_t num_plugins;
const char* plugin_names[MAX_PLUGINS];
IWTSPlugin* plugins[MAX_PLUGINS];

size_t num_listeners;
IWTSListener* listeners[MAX_PLUGINS];
wArrayList* plugin_names;
wArrayList* plugins;

wArrayList* listeners;
wArrayList* channels;
wStreamPool* pool;
};
Expand Down
12 changes: 9 additions & 3 deletions channels/echo/client/echo_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ struct _ECHO_PLUGIN
IWTSPlugin iface;

ECHO_LISTENER_CALLBACK* listener_callback;
IWTSListener* listener;
};

/**
Expand Down Expand Up @@ -142,8 +143,8 @@ static UINT echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage
echo->listener_callback->plugin = pPlugin;
echo->listener_callback->channel_mgr = pChannelMgr;

return pChannelMgr->CreateListener(pChannelMgr, "ECHO", 0,
(IWTSListenerCallback*)echo->listener_callback, NULL);
return pChannelMgr->CreateListener(pChannelMgr, "ECHO", 0, &echo->listener_callback->iface,
&echo->listener);
}

/**
Expand All @@ -154,7 +155,12 @@ static UINT echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManage
static UINT echo_plugin_terminated(IWTSPlugin* pPlugin)
{
ECHO_PLUGIN* echo = (ECHO_PLUGIN*)pPlugin;

if (echo && echo->listener_callback)
{
IWTSVirtualChannelManager* mgr = echo->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, echo->listener);
}
free(echo);

return CHANNEL_RC_OK;
Expand Down
13 changes: 10 additions & 3 deletions channels/geometry/client/geometry_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -410,9 +410,9 @@ static UINT geometry_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMa
geometry->listener_callback->iface.OnNewChannelConnection = geometry_on_new_channel_connection;
geometry->listener_callback->plugin = pPlugin;
geometry->listener_callback->channel_mgr = pChannelMgr;
status = pChannelMgr->CreateListener(pChannelMgr, GEOMETRY_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)geometry->listener_callback,
&(geometry->listener));
status =
pChannelMgr->CreateListener(pChannelMgr, GEOMETRY_DVC_CHANNEL_NAME, 0,
&geometry->listener_callback->iface, &(geometry->listener));
geometry->listener->pInterface = geometry->iface.pInterface;
return status;
}
Expand All @@ -427,6 +427,13 @@ static UINT geometry_plugin_terminated(IWTSPlugin* pPlugin)
GEOMETRY_PLUGIN* geometry = (GEOMETRY_PLUGIN*)pPlugin;
GeometryClientContext* context = (GeometryClientContext*)geometry->iface.pInterface;

if (geometry && geometry->listener_callback)
{
IWTSVirtualChannelManager* mgr = geometry->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, geometry->listener);
}

if (context)
HashTable_Free(context->geometries);

Expand Down
26 changes: 14 additions & 12 deletions channels/printer/client/cups/printer_cups.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,13 +364,15 @@ static void printer_cups_add_ref_driver(rdpPrinterDriver* driver)
}

/* Singleton */
static rdpCupsPrinterDriver* cups_driver = NULL;
static rdpCupsPrinterDriver* uniq_cups_driver = NULL;

static void printer_cups_release_ref_driver(rdpPrinterDriver* driver)
{
rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver;
if (cups_driver->references <= 1)
{
if (uniq_cups_driver == cups_driver)
uniq_cups_driver = NULL;
free(cups_driver);
cups_driver = NULL;
}
Expand All @@ -384,23 +386,23 @@ rdpPrinterDriver* cups_freerdp_printer_client_subsystem_entry(void)
FREERDP_API rdpPrinterDriver* freerdp_printer_client_subsystem_entry(void)
#endif
{
if (!cups_driver)
if (!uniq_cups_driver)
{
cups_driver = (rdpCupsPrinterDriver*)calloc(1, sizeof(rdpCupsPrinterDriver));
uniq_cups_driver = (rdpCupsPrinterDriver*)calloc(1, sizeof(rdpCupsPrinterDriver));

if (!cups_driver)
if (!uniq_cups_driver)
return NULL;

cups_driver->driver.EnumPrinters = printer_cups_enum_printers;
cups_driver->driver.ReleaseEnumPrinters = printer_cups_release_enum_printers;
cups_driver->driver.GetPrinter = printer_cups_get_printer;
uniq_cups_driver->driver.EnumPrinters = printer_cups_enum_printers;
uniq_cups_driver->driver.ReleaseEnumPrinters = printer_cups_release_enum_printers;
uniq_cups_driver->driver.GetPrinter = printer_cups_get_printer;

cups_driver->driver.AddRef = printer_cups_add_ref_driver;
cups_driver->driver.ReleaseRef = printer_cups_release_ref_driver;
uniq_cups_driver->driver.AddRef = printer_cups_add_ref_driver;
uniq_cups_driver->driver.ReleaseRef = printer_cups_release_ref_driver;

cups_driver->id_sequence = 1;
cups_driver->driver.AddRef(&cups_driver->driver);
uniq_cups_driver->id_sequence = 1;
uniq_cups_driver->driver.AddRef(&uniq_cups_driver->driver);
}

return &cups_driver->driver;
return &uniq_cups_driver->driver;
}
6 changes: 2 additions & 4 deletions channels/rail/client/rail_orders.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ UINT rail_send_pdu(railPlugin* rail, wStream* s, UINT16 orderType)
rail_write_pdu_header(s, orderType, orderLength);
Stream_SetPosition(s, orderLength);
WLog_Print(rail->log, WLOG_DEBUG, "Sending %s PDU, length: %" PRIu16 "",
RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)],
orderLength);
rail_get_order_type_string(orderType), orderLength);
return rail_send_channel_data(rail, s);
}

Expand Down Expand Up @@ -926,8 +925,7 @@ UINT rail_order_recv(railPlugin* rail, wStream* s)
}

WLog_Print(rail->log, WLOG_DEBUG, "Received %s PDU, length:%" PRIu16 "",
RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)],
orderLength);
rail_get_order_type_string(orderType), orderLength);

switch (orderType)
{
Expand Down
51 changes: 28 additions & 23 deletions channels/rail/rail_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,29 +27,34 @@

#define TAG CHANNELS_TAG("rail.common")

const char* const RAIL_ORDER_TYPE_STRINGS[] = { "",
"Execute",
"Activate",
"System Parameters Update",
"System Command",
"Handshake",
"Notify Event",
"",
"Window Move",
"Local Move/Size",
"Min Max Info",
"Client Status",
"System Menu",
"Language Bar Info",
"Get Application ID Request",
"Get Application ID Response",
"Execute Result",
"",
"",
"",
"",
"",
"" };
static const char* const RAIL_ORDER_TYPE_STRINGS[] = { "",
"Execute",
"Activate",
"System Parameters Update",
"System Command",
"Handshake",
"Notify Event",
"",
"Window Move",
"Local Move/Size",
"Min Max Info",
"Client Status",
"System Menu",
"Language Bar Info",
"Get Application ID Request",
"Get Application ID Response",
"Execute Result",
"",
"",
"",
"",
"",
"" };

const char* rail_get_order_type_string(BYTE orderType)
{
return RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)];
}

/**
* Function description
Expand Down
2 changes: 1 addition & 1 deletion channels/rail/rail_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

#include <freerdp/rail.h>

extern const char* const RAIL_ORDER_TYPE_STRINGS[];
const char* rail_get_order_type_string(BYTE orderType);

#define RAIL_PDU_HEADER_LENGTH 4

Expand Down
8 changes: 4 additions & 4 deletions channels/rail/server/rail_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ UINT rail_send_pdu(RailServerContext* context, wStream* s, UINT16 orderType)
Stream_SetPosition(s, 0);
rail_write_pdu_header(s, orderType, orderLength);
Stream_SetPosition(s, orderLength);
WLog_DBG(TAG, "Sending %s PDU, length: %" PRIu16 "",
RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength);
WLog_DBG(TAG, "Sending %s PDU, length: %" PRIu16 "", rail_get_order_type_string(orderType),
orderLength);
return rail_send(context, s, orderLength);
}

Expand Down Expand Up @@ -1573,8 +1573,8 @@ UINT rail_server_handle_messages(RailServerContext* context)
return ERROR_INTERNAL_ERROR;
}

WLog_DBG(TAG, "Received %s PDU, length:%" PRIu16 "",
RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength);
WLog_DBG(TAG, "Received %s PDU, length:%" PRIu16 "", rail_get_order_type_string(orderType),
orderLength);

switch (orderType)
{
Expand Down
9 changes: 7 additions & 2 deletions channels/rdpei/client/rdpei_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -571,8 +571,7 @@ static UINT rdpei_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManag
rdpei->listener_callback->channel_mgr = pChannelMgr;

if ((error = pChannelMgr->CreateListener(pChannelMgr, RDPEI_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)rdpei->listener_callback,
&(rdpei->listener))))
&rdpei->listener_callback->iface, &(rdpei->listener))))
{
WLog_ERR(TAG, "ChannelMgr->CreateListener failed with error %" PRIu32 "!", error);
goto error_out;
Expand All @@ -598,6 +597,12 @@ static UINT rdpei_plugin_terminated(IWTSPlugin* pPlugin)
if (!pPlugin)
return ERROR_INVALID_PARAMETER;

if (rdpei && rdpei->listener_callback)
{
IWTSVirtualChannelManager* mgr = rdpei->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, rdpei->listener);
}
free(rdpei->listener_callback);
free(rdpei->context);
free(rdpei);
Expand Down
32 changes: 16 additions & 16 deletions channels/rdpei/rdpei_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,18 +199,18 @@ BOOL rdpei_write_4byte_unsigned(wStream* s, UINT32 value)
{
BYTE byte;

if (value <= 0x3F)
if (value <= 0x3FUL)
{
Stream_Write_UINT8(s, value);
}
else if (value <= 0x3FFF)
else if (value <= 0x3FFFUL)
{
byte = (value >> 8) & 0x3F;
Stream_Write_UINT8(s, byte | 0x40);
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x3FFFFF)
else if (value <= 0x3FFFFFUL)
{
byte = (value >> 16) & 0x3F;
Stream_Write_UINT8(s, byte | 0x80);
Expand All @@ -219,7 +219,7 @@ BOOL rdpei_write_4byte_unsigned(wStream* s, UINT32 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x3FFFFF)
else if (value <= 0x3FFFFFFFUL)
{
byte = (value >> 24) & 0x3F;
Stream_Write_UINT8(s, byte | 0xC0);
Expand Down Expand Up @@ -306,7 +306,7 @@ BOOL rdpei_write_4byte_signed(wStream* s, INT32 value)
value *= -1;
}

if (value <= 0x1F)
if (value <= 0x1FUL)
{
byte = value & 0x1F;

Expand All @@ -315,7 +315,7 @@ BOOL rdpei_write_4byte_signed(wStream* s, INT32 value)

Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFF)
else if (value <= 0x1FFFUL)
{
byte = (value >> 8) & 0x1F;

Expand All @@ -326,7 +326,7 @@ BOOL rdpei_write_4byte_signed(wStream* s, INT32 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFF)
else if (value <= 0x1FFFFFUL)
{
byte = (value >> 16) & 0x1F;

Expand All @@ -339,7 +339,7 @@ BOOL rdpei_write_4byte_signed(wStream* s, INT32 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFF)
else if (value <= 0x1FFFFFFFUL)
{
byte = (value >> 24) & 0x1F;

Expand Down Expand Up @@ -478,20 +478,20 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
{
BYTE byte;

if (value <= 0x1F)
if (value <= 0x1FULL)
{
byte = value & 0x1F;
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFF)
else if (value <= 0x1FFFULL)
{
byte = (value >> 8) & 0x1F;
byte |= (1 << 5);
Stream_Write_UINT8(s, byte);
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFF)
else if (value <= 0x1FFFFFULL)
{
byte = (value >> 16) & 0x1F;
byte |= (2 << 5);
Expand All @@ -501,7 +501,7 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFF)
else if (value <= 0x1FFFFFULL)
{
byte = (value >> 24) & 0x1F;
byte |= (3 << 5);
Expand All @@ -513,7 +513,7 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFFFF)
else if (value <= 0x1FFFFFFFULL)
{
byte = (value >> 32) & 0x1F;
byte |= (4 << 5);
Expand All @@ -527,7 +527,7 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFFFFFF)
else if (value <= 0x1FFFFFFFFFULL)
{
byte = (value >> 40) & 0x1F;
byte |= (5 << 5);
Expand All @@ -543,7 +543,7 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFFFFFFFF)
else if (value <= 0x1FFFFFFFFFFFULL)
{
byte = (value >> 48) & 0x1F;
byte |= (6 << 5);
Expand All @@ -561,7 +561,7 @@ BOOL rdpei_write_8byte_unsigned(wStream* s, UINT64 value)
byte = (value & 0xFF);
Stream_Write_UINT8(s, byte);
}
else if (value <= 0x1FFFFFFFFFFFFF)
else if (value <= 0x1FFFFFFFFFFFFFFFULL)
{
byte = (value >> 56) & 0x1F;
byte |= (7 << 5);
Expand Down
17 changes: 8 additions & 9 deletions channels/rdpgfx/client/rdpgfx_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ static UINT rdpgfx_recv_reset_graphics_pdu(RDPGFX_CHANNEL_CALLBACK* callback, wS
monitor = &(pdu.monitorDefArray[index]);
DEBUG_RDPGFX(gfx->log,
"RecvResetGraphicsPdu: monitor left:%" PRIi32 " top:%" PRIi32 " right:%" PRIi32
" left:%" PRIi32 " flags:0x%" PRIx32 "",
" bottom:%" PRIi32 " flags:0x%" PRIx32 "",
monitor->left, monitor->top, monitor->right, monitor->bottom, monitor->flags);
}

Expand Down Expand Up @@ -1826,12 +1826,6 @@ static UINT rdpgfx_on_close(IWTSVirtualChannelCallback* pChannelCallback)
free_surfaces(context, gfx->SurfaceTable);
evict_cache_slots(context, gfx->MaxCacheSlots, gfx->CacheSlots);

if (gfx->listener_callback)
{
free(gfx->listener_callback);
gfx->listener_callback = NULL;
}

free(callback);
gfx->UnacknowledgedFrames = 0;
gfx->TotalDecodedFrames = 0;
Expand Down Expand Up @@ -1896,8 +1890,7 @@ static UINT rdpgfx_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana
gfx->listener_callback->plugin = pPlugin;
gfx->listener_callback->channel_mgr = pChannelMgr;
error = pChannelMgr->CreateListener(pChannelMgr, RDPGFX_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)gfx->listener_callback,
&(gfx->listener));
&gfx->listener_callback->iface, &(gfx->listener));
gfx->listener->pInterface = gfx->iface.pInterface;
DEBUG_RDPGFX(gfx->log, "Initialize");
return error;
Expand All @@ -1913,6 +1906,12 @@ static UINT rdpgfx_plugin_terminated(IWTSPlugin* pPlugin)
RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*)pPlugin;
RdpgfxClientContext* context = (RdpgfxClientContext*)gfx->iface.pInterface;
DEBUG_RDPGFX(gfx->log, "Terminated");
if (gfx && gfx->listener_callback)
{
IWTSVirtualChannelManager* mgr = gfx->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, gfx->listener);
}
rdpgfx_client_context_free(context);
return CHANNEL_RC_OK;
}
Expand Down
2 changes: 2 additions & 0 deletions channels/rdpsnd/client/mac/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

define_channel_client_subsystem("rdpsnd" "mac" "")

find_library(COCOA_LIBRARY Cocoa REQUIRED)
FIND_LIBRARY(CORE_FOUNDATION CoreFoundation)
FIND_LIBRARY(CORE_AUDIO CoreAudio REQUIRED)
FIND_LIBRARY(AUDIO_TOOL AudioToolbox REQUIRED)
Expand All @@ -38,6 +39,7 @@ set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS}
${AUDIO_TOOL}
${AV_FOUNDATION}
${CORE_AUDIO}
${COCOA_LIBRARY}
${CORE_FOUNDATION})

set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} freerdp winpr)
Expand Down
9 changes: 7 additions & 2 deletions channels/rdpsnd/client/rdpsnd_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1541,8 +1541,7 @@ static UINT rdpsnd_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana
rdpsnd->listener_callback->plugin = pPlugin;
rdpsnd->listener_callback->channel_mgr = pChannelMgr;
status = pChannelMgr->CreateListener(pChannelMgr, RDPSND_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)rdpsnd->listener_callback,
&(rdpsnd->listener));
&rdpsnd->listener_callback->iface, &(rdpsnd->listener));
rdpsnd->listener->pInterface = rdpsnd->iface.pInterface;
return rdpsnd_virtual_channel_event_initialized(rdpsnd);
}
Expand All @@ -1557,6 +1556,12 @@ static UINT rdpsnd_plugin_terminated(IWTSPlugin* pPlugin)
rdpsndPlugin* rdpsnd = (rdpsndPlugin*)pPlugin;
if (rdpsnd)
{
if (rdpsnd->listener_callback)
{
IWTSVirtualChannelManager* mgr = rdpsnd->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, rdpsnd->listener);
}
free(rdpsnd->listener_callback);
free(rdpsnd->iface.pInterface);
}
Expand Down
14 changes: 10 additions & 4 deletions channels/urbdrc/client/urbdrc_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -668,12 +668,13 @@ static UINT urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana
{
UINT status;
URBDRC_PLUGIN* urbdrc = (URBDRC_PLUGIN*)pPlugin;
IUDEVMAN* udevman = urbdrc->udevman;
IUDEVMAN* udevman;
char channelName[sizeof(URBDRC_CHANNEL_NAME)] = { URBDRC_CHANNEL_NAME };

if (!urbdrc)
if (!urbdrc || !urbdrc->udevman)
return ERROR_INVALID_PARAMETER;

udevman = urbdrc->udevman;
urbdrc->listener_callback =
(URBDRC_LISTENER_CALLBACK*)calloc(1, sizeof(URBDRC_LISTENER_CALLBACK));

Expand All @@ -687,7 +688,7 @@ static UINT urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelMana
/* [MS-RDPEUSB] 2.1 Transport defines the channel name in uppercase letters */
CharUpperA(channelName);
status = pChannelMgr->CreateListener(pChannelMgr, channelName, 0,
&urbdrc->listener_callback->iface, NULL);
&urbdrc->listener_callback->iface, &urbdrc->listener);
if (status != CHANNEL_RC_OK)
return status;

Expand All @@ -709,7 +710,12 @@ static UINT urbdrc_plugin_terminated(IWTSPlugin* pPlugin)

if (!urbdrc)
return ERROR_INVALID_DATA;

if (urbdrc->listener_callback)
{
IWTSVirtualChannelManager* mgr = urbdrc->listener_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, urbdrc->listener);
}
udevman = urbdrc->udevman;

if (udevman)
Expand Down
1 change: 1 addition & 0 deletions channels/urbdrc/client/urbdrc_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ struct _URBDRC_PLUGIN
char* subsystem;

wLog* log;
IWTSListener* listener;
};

typedef BOOL (*PREGISTERURBDRCSERVICE)(IWTSPlugin* plugin, IUDEVMAN* udevman);
Expand Down
17 changes: 15 additions & 2 deletions channels/video/client/video_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1048,7 +1048,7 @@ static UINT video_plugin_initialize(IWTSPlugin* plugin, IWTSVirtualChannelManage
callback->channel_mgr = channelMgr;

status = channelMgr->CreateListener(channelMgr, VIDEO_CONTROL_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)callback, &(video->controlListener));
&callback->iface, &(video->controlListener));

if (status != CHANNEL_RC_OK)
return status;
Expand All @@ -1067,7 +1067,7 @@ static UINT video_plugin_initialize(IWTSPlugin* plugin, IWTSVirtualChannelManage
callback->channel_mgr = channelMgr;

status = channelMgr->CreateListener(channelMgr, VIDEO_DATA_DVC_CHANNEL_NAME, 0,
(IWTSListenerCallback*)callback, &(video->dataListener));
&callback->iface, &(video->dataListener));

if (status == CHANNEL_RC_OK)
video->dataListener->pInterface = video->wtsPlugin.pInterface;
Expand All @@ -1084,6 +1084,19 @@ static UINT video_plugin_terminated(IWTSPlugin* pPlugin)
{
VIDEO_PLUGIN* video = (VIDEO_PLUGIN*)pPlugin;

if (video->control_callback)
{
IWTSVirtualChannelManager* mgr = video->control_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, video->controlListener);
}
if (video->data_callback)
{
IWTSVirtualChannelManager* mgr = video->data_callback->channel_mgr;
if (mgr)
IFCALL(mgr->DestroyListener, mgr, video->dataListener);
}

if (video->context)
VideoClientContextPriv_free(video->context->priv);

Expand Down
2 changes: 1 addition & 1 deletion client/Android/Studio/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def getVersionName = { ->

ext {
versionName = properties.get('VERSION_NAME', getVersionName())
versionCode = properties.get('VERSION_CODE', 16)
versionCode = properties.get('VERSION_CODE', 17)

println '----------------- Project configuration -------------------'
println 'VERSION_NAME: ' + versionName
Expand Down
2 changes: 1 addition & 1 deletion client/Android/android_freerdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
#define TAG CLIENT_TAG("android")

/* Defines the JNI version supported by this library. */
#define FREERDP_JNI_VERSION "2.1.0"
#define FREERDP_JNI_VERSION "2.1.1"

static void android_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs* e)
{
Expand Down
5 changes: 4 additions & 1 deletion client/Sample/tf_freerdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,10 @@ int main(int argc, char* argv[])
freerdp_client_settings_command_line_status_print(context->settings, status, argc, argv);

if (status)
return 0;
{
rc = 0;
goto fail;
}

if (freerdp_client_start(context) != 0)
goto fail;
Expand Down
2 changes: 2 additions & 0 deletions client/Windows/wf_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,8 @@ static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** use
fSave = FALSE;
dwFlags = CREDUI_FLAGS_DO_NOT_PERSIST | CREDUI_FLAGS_EXCLUDE_CERTIFICATES;

if (username && *username)
strncpy(UserName, *username, CREDUI_MAX_USERNAME_LENGTH);
if (wfc->isConsole)
status = CredUICmdLinePromptForCredentialsA(
title, NULL, 0, UserName, CREDUI_MAX_USERNAME_LENGTH + 1, Password,
Expand Down
9 changes: 8 additions & 1 deletion client/X11/xf_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,15 @@ BOOL xf_picture_transform_required(xfContext* xfc)
}
#endif /* WITH_XRENDER defined */

void xf_draw_screen(xfContext* xfc, int x, int y, int w, int h)
void xf_draw_screen_(xfContext* xfc, int x, int y, int w, int h, const char* fkt, const char* file,
int line)
{
if (!xfc)
{
WLog_DBG(TAG, "[%s] called from [%s] xfc=%p", __FUNCTION__, fkt, xfc);
return;
}

if (w == 0 || h == 0)
{
WLog_WARN(TAG, "invalid width and/or height specified: w=%d h=%d", w, h);
Expand Down
6 changes: 4 additions & 2 deletions client/X11/xf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,8 @@ BOOL xf_event_action_script_init(xfContext* xfc)

while (fgets(buffer, sizeof(buffer), actionScript))
{
strtok(buffer, "\n");
char* context = NULL;
strtok_s(buffer, "\n", &context);
xevent = _strdup(buffer);

if (!xevent || ArrayList_Add(xfc->xevents, xevent) < 0)
Expand Down Expand Up @@ -253,7 +254,8 @@ static BOOL xf_event_execute_action_script(xfContext* xfc, const XEvent* event)

while (fgets(buffer, sizeof(buffer), actionScript))
{
strtok(buffer, "\n");
char* context = NULL;
strtok_s(buffer, "\n", &context);
}

pclose(actionScript);
Expand Down
6 changes: 4 additions & 2 deletions client/X11/xf_keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ static BOOL xf_keyboard_action_script_init(xfContext* xfc)

while (fgets(buffer, sizeof(buffer), keyScript) != NULL)
{
strtok(buffer, "\n");
char* context = NULL;
strtok_s(buffer, "\n", &context);
keyCombination = _strdup(buffer);

if (!keyCombination || ArrayList_Add(xfc->keyCombinations, keyCombination) < 0)
Expand Down Expand Up @@ -433,7 +434,8 @@ static int xf_keyboard_execute_action_script(xfContext* xfc, XF_MODIFIER_KEYS* m

while (fgets(buffer, sizeof(buffer), keyScript) != NULL)
{
strtok(buffer, "\n");
char* context = NULL;
strtok_s(buffer, "\n", &context);

if (strcmp(buffer, "key-local") == 0)
status = 0;
Expand Down
6 changes: 5 additions & 1 deletion client/X11/xfreerdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,11 @@ void xf_lock_x11_(xfContext* xfc, const char* fkt);
void xf_unlock_x11_(xfContext* xfc, const char* fkt);

BOOL xf_picture_transform_required(xfContext* xfc);
void xf_draw_screen(xfContext* xfc, int x, int y, int w, int h);

#define xf_draw_screen(_xfc, _x, _y, _w, _h) \
xf_draw_screen_((_xfc), (_x), (_y), (_w), (_h), __FUNCTION__, __FILE__, __LINE__)
void xf_draw_screen_(xfContext* xfc, int x, int y, int w, int h, const char* fkt, const char* file,
int line);

FREERDP_API DWORD xf_exit_code_from_disconnect_reason(DWORD reason);

Expand Down
5 changes: 3 additions & 2 deletions client/common/cmdline.c
Original file line number Diff line number Diff line change
Expand Up @@ -3500,8 +3500,9 @@ BOOL freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings)
BOOL success;
const char* name = NULL;
const char* drive = tok;
char* start = strtok(tok, "(");
char* end = strtok(NULL, ")");
char* subcontext = NULL;
char* start = strtok_s(tok, "(", &subcontext);
char* end = strtok_s(NULL, ")", &subcontext);
if (start && end)
name = end;

Expand Down
20 changes: 11 additions & 9 deletions client/common/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ struct rdp_file
DWORD flags;
};

static void freerdp_client_file_string_check_free(LPSTR str);
/*
* Set an integer in a rdpFile
*
Expand Down Expand Up @@ -841,15 +842,16 @@ BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, rdp_file_
return status;
}

#define FILE_POPULATE_STRING(_target, _setting) \
do \
{ \
if (_setting) \
{ \
_target = _strdup(_setting); \
if (!_target) \
return FALSE; \
} \
#define FILE_POPULATE_STRING(_target, _setting) \
do \
{ \
if (_setting) \
{ \
freerdp_client_file_string_check_free(_target); \
_target = _strdup(_setting); \
if (!_target) \
return FALSE; \
} \
} while (0)

BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSettings* settings)
Expand Down
1 change: 0 additions & 1 deletion config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#cmakedefine HAVE_EXECINFO_H

/* Features */
#cmakedefine HAVE_ALIGNED_REQUIRED
#cmakedefine SWRESAMPLE_FOUND
#cmakedefine AVRESAMPLE_FOUND

Expand Down
7 changes: 4 additions & 3 deletions libfreerdp/codec/clear.c
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,7 @@ static BOOL clear_decompress_bands_data(CLEAR_CONTEXT* clear, wStream* s, UINT32
if (vBarUpdate)
{
UINT32 x;
BYTE* pSrcPixel;
BYTE* pSrcPixel = NULL;
BYTE* dstBuffer;

if (clear->VBarStorageCursor >= CLEARCODEC_VBAR_SIZE)
Expand Down Expand Up @@ -826,8 +826,9 @@ static BOOL clear_decompress_bands_data(CLEAR_CONTEXT* clear, wStream* s, UINT32
if ((y + count) > vBarPixelCount)
count = (vBarPixelCount > y) ? (vBarPixelCount - y) : 0;

pSrcPixel =
&vBarShortEntry->pixels[(y - vBarYOn) * GetBytesPerPixel(clear->format)];
if (count > 0)
pSrcPixel =
&vBarShortEntry->pixels[(y - vBarYOn) * GetBytesPerPixel(clear->format)];

for (x = 0; x < count; x++)
{
Expand Down
4 changes: 0 additions & 4 deletions libfreerdp/codec/interleaved.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,11 +272,7 @@ static INLINE void write_pixel_16(BYTE* _buf, UINT16 _pix)
#define WHITE_PIXEL 0xFFFF
#define DESTWRITEPIXEL(_buf, _pix) write_pixel_16(_buf, _pix)
#define DESTREADPIXEL(_pix, _buf) _pix = ((UINT16*)(_buf))[0]
#ifdef HAVE_ALIGNED_REQUIRED
#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8)
#else
#define SRCREADPIXEL(_pix, _buf) _pix = ((UINT16*)(_buf))[0]
#endif
#define DESTNEXTPIXEL(_buf) _buf += 2
#define SRCNEXTPIXEL(_buf) _buf += 2
#define WRITEFGBGIMAGE WriteFgBgImage16to16
Expand Down
6 changes: 5 additions & 1 deletion libfreerdp/codec/mppc.c
Original file line number Diff line number Diff line change
Expand Up @@ -772,11 +772,15 @@ void mppc_context_reset(MPPC_CONTEXT* mppc, BOOL flush)
ZeroMemory(&(mppc->MatchBuffer), sizeof(mppc->MatchBuffer));

if (flush)
{
mppc->HistoryOffset = mppc->HistoryBufferSize + 1;
mppc->HistoryPtr = mppc->HistoryBuffer;
}
else
{
mppc->HistoryOffset = 0;

mppc->HistoryPtr = &(mppc->HistoryBuffer[mppc->HistoryOffset]);
}
}

MPPC_CONTEXT* mppc_context_new(DWORD CompressionLevel, BOOL Compressor)
Expand Down
6 changes: 3 additions & 3 deletions libfreerdp/codec/ncrush.c
Original file line number Diff line number Diff line change
Expand Up @@ -1926,9 +1926,9 @@ static INLINE UINT16 get_word(const BYTE* data)
static INLINE UINT32 get_dword(const BYTE* data)
{
UINT32 tmp = *data++;
tmp |= *data++ << 8U;
tmp |= *data++ << 16U;
tmp |= *data++ << 24U;
tmp |= (UINT32)*data++ << 8U;
tmp |= (UINT32)*data++ << 16U;
tmp |= (UINT32)*data++ << 24U;
return tmp;
}

Expand Down
14 changes: 7 additions & 7 deletions libfreerdp/codec/nsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,12 @@ static BOOL nsc_decode(NSC_CONTEXT* context)

static BOOL nsc_rle_decode(BYTE* in, BYTE* out, UINT32 outSize, UINT32 originalSize)
{
UINT32 len;
UINT32 left;
BYTE value;
left = originalSize;
UINT32 left = originalSize;

while (left > 4)
{
value = *in++;
const BYTE value = *in++;
UINT32 len = 0;

if (left == 5)
{
Expand All @@ -143,8 +141,10 @@ static BOOL nsc_rle_decode(BYTE* in, BYTE* out, UINT32 outSize, UINT32 originalS
else
{
in++;
len = *((UINT32*)in);
in += 4;
len = ((UINT32)(*in++));
len |= ((UINT32)(*in++)) << 8U;
len |= ((UINT32)(*in++)) << 16U;
len |= ((UINT32)(*in++)) << 24U;
}

if (outSize < len)
Expand Down
5 changes: 2 additions & 3 deletions libfreerdp/codec/planar.c
Original file line number Diff line number Diff line change
Expand Up @@ -1170,7 +1170,6 @@ BYTE* freerdp_bitmap_planar_delta_encode_plane(const BYTE* inPlane, UINT32 width
BYTE* outPlane)
{
char s2c;
INT32 delta;
UINT32 y, x;
BYTE* outPtr;
const BYTE *srcPtr, *prevLinePtr;
Expand All @@ -1194,9 +1193,9 @@ BYTE* freerdp_bitmap_planar_delta_encode_plane(const BYTE* inPlane, UINT32 width
{
for (x = 0; x < width; x++, outPtr++, srcPtr++, prevLinePtr++)
{
delta = *srcPtr - *prevLinePtr;
INT32 delta = *srcPtr - *prevLinePtr;
s2c = (delta >= 0) ? (char)delta : (char)(~((BYTE)(-delta)) + 1);
s2c = (s2c >= 0) ? (s2c << 1) : (char)(((~((BYTE)s2c) + 1) << 1) - 1);
s2c = (s2c >= 0) ? ((UINT32)s2c << 1) : (char)(((UINT32)(~((BYTE)s2c) + 1) << 1) - 1);
*outPtr = (BYTE)s2c;
}
}
Expand Down
4 changes: 2 additions & 2 deletions libfreerdp/codec/progressive.c
Original file line number Diff line number Diff line change
Expand Up @@ -1183,7 +1183,7 @@ static INLINE int progressive_rfx_upgrade_block(RFX_PROGRESSIVE_UPGRADE_STATE* s
sign[index] = input;
}

buffer[index] += (input << shift);
buffer[index] += (INT16)((UINT32)input << shift);
}

return 1;
Expand Down Expand Up @@ -1995,7 +1995,7 @@ static INLINE INT32 progressive_wb_read_region_header(PROGRESSIVE_CONTEXT* progr
len -= region->tileDataSize;
if (len > 0)
WLog_Print(progressive->log, WLOG_DEBUG,
"Unused byes detected, %" PRIuz " bytes not processed", len);
"Unused bytes detected, %" PRIuz " bytes not processed", len);
return 0;
}

Expand Down
35 changes: 18 additions & 17 deletions libfreerdp/codec/rfx_dwt.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,26 +87,27 @@ void rfx_dwt_2d_decode_block(INT16* buffer, INT16* idwt, int subband_width)
/* Inverse DWT in vertical direction, results are stored in original buffer. */
for (x = 0; x < total_width; x++)
{
/* Even coefficients */
for (n = 0; n < subband_width; n++)
{
y = n << 1;
dst = buffer + y * total_width + x;
l = idwt + n * total_width + x;
h = l + subband_width * total_width;
dst[0] = *l - (((n > 0 ? *(h - total_width) : *h) + (*h) + 1) >> 1);
}
l = idwt + x;
h = idwt + x + subband_width * total_width;
dst = buffer + x;

/* Odd coefficients */
for (n = 0; n < subband_width; n++)
*dst = *l - ((*h * 2 + 1) >> 1);

for (n = 1; n < subband_width; n++)
{
y = n << 1;
dst = buffer + y * total_width + x;
l = idwt + n * total_width + x;
h = l + subband_width * total_width;
dst[total_width] =
(*h << 1) + ((dst[0] + dst[n < subband_width - 1 ? 2 * total_width : 0]) >> 1);
l += total_width;
h += total_width;

/* Even coefficients */
dst[2 * total_width] = *l - ((*(h - total_width) + *h + 1) >> 1);

/* Odd coefficients */
dst[total_width] = (*(h - total_width) << 1) + ((*dst + dst[2 * total_width]) >> 1);

dst += 2 * total_width;
}

dst[total_width] = (*h << 1) + ((*dst * 2) >> 1);
}
}

Expand Down
15 changes: 12 additions & 3 deletions libfreerdp/codec/rfx_rlgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,10 @@ int rfx_rlgr_decode(RLGR_MODE mode, const BYTE* pSrcData, UINT32 SrcSize, INT16*
break;

bs->mask = ((1 << kr) - 1);
code = (UINT16)((bs->accumulator >> (32 - kr)) & bs->mask);
if (kr > 0)
code = (UINT16)((bs->accumulator >> (32 - kr)) & bs->mask);
else
code = 0;
BitStream_Shift(bs, kr);

/* add (vk << kr) to code */
Expand Down Expand Up @@ -390,7 +393,10 @@ int rfx_rlgr_decode(RLGR_MODE mode, const BYTE* pSrcData, UINT32 SrcSize, INT16*
break;

bs->mask = ((1 << kr) - 1);
code = (UINT16)((bs->accumulator >> (32 - kr)) & bs->mask);
if (kr > 0)
code = (UINT16)((bs->accumulator >> (32 - kr)) & bs->mask);
else
code = 0;
BitStream_Shift(bs, kr);

/* add (vk << kr) to code */
Expand Down Expand Up @@ -477,7 +483,10 @@ int rfx_rlgr_decode(RLGR_MODE mode, const BYTE* pSrcData, UINT32 SrcSize, INT16*
break;

bs->mask = ((1 << nIdx) - 1);
val1 = ((bs->accumulator >> (32 - nIdx)) & bs->mask);
if (nIdx > 0)
val1 = ((bs->accumulator >> (32 - nIdx)) & bs->mask);
else
val1 = 0;
BitStream_Shift(bs, nIdx);

val2 = code - val1;
Expand Down
323 changes: 256 additions & 67 deletions libfreerdp/common/settings_getters.c

Large diffs are not rendered by default.

96 changes: 96 additions & 0 deletions libfreerdp/common/settings_str.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include <freerdp/settings.h>
#include <freerdp/log.h>

#include "../core/settings.h"

#define TAG FREERDP_TAG("common.settings")

struct settings_str_entry
Expand Down Expand Up @@ -385,6 +387,100 @@ static const struct settings_str_entry settings_map[] = {
{ FreeRDP_instance, 8, "FreeRDP_instance" },
};

BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src)
{
size_t x;
for (x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case 0: /* bool */
{
BOOL sval = freerdp_settings_get_bool(src, cur->id);
if (!freerdp_settings_set_bool(dst, cur->id, sval))
return FALSE;
}
break;
case 1: /* UINT16 */
{
UINT16 sval = freerdp_settings_get_uint16(src, cur->id);
if (!freerdp_settings_set_uint16(dst, cur->id, sval))
return FALSE;
}
break;
case 2: /* INT16 */
{
INT16 sval = freerdp_settings_get_int16(src, cur->id);
if (!freerdp_settings_set_int16(dst, cur->id, sval))
return FALSE;
}
break;
case 3: /* UINT32 */
{
UINT32 sval = freerdp_settings_get_uint32(src, cur->id);
if (!freerdp_settings_set_uint32(dst, cur->id, sval))
return FALSE;
}
break;
case 4: /* INT32 */
{
INT32 sval = freerdp_settings_get_int32(src, cur->id);
if (!freerdp_settings_set_int32(dst, cur->id, sval))
return FALSE;
}
break;
case 5: /* UINT64 */
{
UINT64 sval = freerdp_settings_get_uint64(src, cur->id);
if (!freerdp_settings_set_uint64(dst, cur->id, sval))
return FALSE;
}
break;
case 6: /* INT64 */
{
INT64 sval = freerdp_settings_get_int64(src, cur->id);
if (!freerdp_settings_set_int64(dst, cur->id, sval))
return FALSE;
}
break;
case 7: /* strings */
{
const char* sval = freerdp_settings_get_string(src, cur->id);
if (!freerdp_settings_set_string_(dst, cur->id, sval, FALSE))
return FALSE;
}
break;
case 8: /* pointer */
{
const void* sval = freerdp_settings_get_pointer(src, cur->id);
if (!freerdp_settings_set_pointer(dst, cur->id, sval))
return FALSE;
}
break;
}
}
return TRUE;
}

void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup)
{
size_t x;
for (x = 0; x < ARRAYSIZE(settings_map); x++)
{
const struct settings_str_entry* cur = &settings_map[x];
switch (cur->type)
{
case 7: /* strings */
freerdp_settings_set_string_(dst, cur->id, NULL, cleanup);
break;
case 8: /* pointer */
freerdp_settings_set_pointer(dst, cur->id, NULL);
break;
}
}
}

SSIZE_T freerdp_settings_get_key_for_name(const char* value)
{
size_t x;
Expand Down
6 changes: 3 additions & 3 deletions libfreerdp/core/capabilities.c
Original file line number Diff line number Diff line change
Expand Up @@ -2702,9 +2702,9 @@ static BOOL rdp_read_bitmap_codec_guid(wStream* s, GUID* guid)
if (Stream_GetRemainingLength(s) < 16)
return FALSE;
Stream_Read(s, g, 16);
guid->Data1 = (g[3] << 24) | (g[2] << 16) | (g[1] << 8) | g[0];
guid->Data2 = (g[5] << 8) | g[4];
guid->Data3 = (g[7] << 8) | g[6];
guid->Data1 = ((UINT32)g[3] << 24U) | ((UINT32)g[2] << 16U) | (g[1] << 8U) | g[0];
guid->Data2 = (g[5] << 8U) | g[4];
guid->Data3 = (g[7] << 8U) | g[6];
guid->Data4[0] = g[8];
guid->Data4[1] = g[9];
guid->Data4[2] = g[10];
Expand Down
5 changes: 3 additions & 2 deletions libfreerdp/core/gateway/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,7 @@ HttpResponse* http_response_recv(rdpTls* tls, BOOL readContentLength)
size_t count = 0;
char* buffer = (char*)Stream_Buffer(response->data);
char* line = (char*)Stream_Buffer(response->data);
char* context = NULL;

while ((line = string_strnstr(line, "\r\n", payloadOffset - (line - buffer) - 2UL)))
{
Expand All @@ -834,12 +835,12 @@ HttpResponse* http_response_recv(rdpTls* tls, BOOL readContentLength)
buffer[payloadOffset - 1] = '\0';
buffer[payloadOffset - 2] = '\0';
count = 0;
line = strtok(buffer, "\r\n");
line = strtok_s(buffer, "\r\n", &context);

while (line && (response->count > count))
{
response->lines[count] = line;
line = strtok(NULL, "\r\n");
line = strtok_s(NULL, "\r\n", &context);
count++;
}

Expand Down
2 changes: 1 addition & 1 deletion libfreerdp/core/gateway/tsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -781,7 +781,7 @@ static BOOL TsProxyCreateTunnelReadResponse(rdpTsg* tsg, RPC_PDU* pdu,
Stream_Read_UINT32(pdu->s, Pointer); /* TsgCapsPtr (4 bytes) */
Stream_Read_UINT32(pdu->s, versionCaps->numCapabilities); /* NumCapabilities (4 bytes) */
Stream_Read_UINT16(pdu->s, versionCaps->majorVersion); /* MajorVersion (2 bytes) */
Stream_Read_UINT16(pdu->s, versionCaps->majorVersion); /* MinorVersion (2 bytes) */
Stream_Read_UINT16(pdu->s, versionCaps->minorVersion); /* MinorVersion (2 bytes) */
Stream_Read_UINT16(
pdu->s, versionCaps->quarantineCapabilities); /* QuarantineCapabilities (2 bytes) */

Expand Down
398 changes: 142 additions & 256 deletions libfreerdp/core/info.c

Large diffs are not rendered by default.

10 changes: 6 additions & 4 deletions libfreerdp/core/nla.c
Original file line number Diff line number Diff line change
Expand Up @@ -1144,6 +1144,7 @@ SECURITY_STATUS nla_encrypt_public_key_echo(rdpNla* nla)
const BOOL ntlm = (_tcsncmp(nla->packageName, NTLM_SSP_NAME, ARRAYSIZE(NTLM_SSP_NAME)) == 0);
public_key_length = nla->PublicKey.cbBuffer;

sspi_SecBufferFree(&nla->pubKeyAuth);
if (!sspi_SecBufferAlloc(&nla->pubKeyAuth,
public_key_length + nla->ContextSizes.cbSecurityTrailer))
return SEC_E_INSUFFICIENT_MEMORY;
Expand Down Expand Up @@ -1212,6 +1213,7 @@ SECURITY_STATUS nla_encrypt_public_key_hash(rdpNla* nla)
const size_t hashSize =
nla->server ? sizeof(ServerClientHashMagic) : sizeof(ClientServerHashMagic);

sspi_SecBufferFree(&nla->pubKeyAuth);
if (!sspi_SecBufferAlloc(&nla->pubKeyAuth, auth_data_length))
{
status = SEC_E_INSUFFICIENT_MEMORY;
Expand Down Expand Up @@ -2069,6 +2071,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s)
return -1;
}

sspi_SecBufferFree(&nla->negoToken);
if (!sspi_SecBufferAlloc(&nla->negoToken, length))
return -1;

Expand Down Expand Up @@ -2097,6 +2100,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s)
Stream_GetRemainingLength(s) < length)
return -1;

sspi_SecBufferFree(&nla->pubKeyAuth);
if (!sspi_SecBufferAlloc(&nla->pubKeyAuth, length))
return -1;

Expand All @@ -2121,6 +2125,7 @@ static int nla_decode_ts_request(rdpNla* nla, wStream* s)
Stream_GetRemainingLength(s) < length)
return -1;

sspi_SecBufferFree(&nla->ClientNonce);
if (!sspi_SecBufferAlloc(&nla->ClientNonce, length))
return -1;

Expand Down Expand Up @@ -2357,10 +2362,6 @@ rdpNla* nla_new(freerdp* instance, rdpTransport* transport, rdpSettings* setting
nla->sendSeqNum = 0;
nla->recvSeqNum = 0;
nla->version = 6;
ZeroMemory(&nla->ClientNonce, sizeof(SecBuffer));
ZeroMemory(&nla->negoToken, sizeof(SecBuffer));
ZeroMemory(&nla->pubKeyAuth, sizeof(SecBuffer));
ZeroMemory(&nla->authInfo, sizeof(SecBuffer));
SecInvalidateHandle(&nla->context);

if (settings->NtlmSamFile)
Expand Down Expand Up @@ -2465,6 +2466,7 @@ void nla_free(rdpNla* nla)
sspi_SecBufferFree(&nla->tsCredentials);
free(nla->ServicePrincipalName);
nla_identity_free(nla->identity);
nla_buffer_free(nla);
free(nla);
}

Expand Down
2 changes: 1 addition & 1 deletion libfreerdp/core/orders.c
Original file line number Diff line number Diff line change
Expand Up @@ -2548,7 +2548,7 @@ static CACHE_BRUSH_ORDER* update_read_cache_brush_order(rdpUpdate* update, wStre
Stream_Read_UINT8(s, cache_brush->index); /* cacheEntry (1 byte) */
Stream_Read_UINT8(s, iBitmapFormat); /* iBitmapFormat (1 byte) */

if (iBitmapFormat > ARRAYSIZE(BMF_BPP))
if (iBitmapFormat >= ARRAYSIZE(BMF_BPP))
goto fail;

cache_brush->bpp = BMF_BPP[iBitmapFormat];
Expand Down
5 changes: 3 additions & 2 deletions libfreerdp/core/proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ static BOOL check_no_proxy(rdpSettings* settings, const char* no_proxy)
BOOL result = FALSE;
char* current;
char* copy;
char* context = NULL;
size_t host_len;
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
Expand All @@ -164,7 +165,7 @@ static BOOL check_no_proxy(rdpSettings* settings, const char* no_proxy)
if (!copy)
return FALSE;

current = strtok(copy, delimiter);
current = strtok_s(copy, delimiter, &context);

while (current && !result)
{
Expand Down Expand Up @@ -243,7 +244,7 @@ static BOOL check_no_proxy(rdpSettings* settings, const char* no_proxy)
}
}

current = strtok(NULL, delimiter);
current = strtok_s(NULL, delimiter, &context);
}

free(copy);
Expand Down
58 changes: 17 additions & 41 deletions libfreerdp/core/rdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1751,6 +1751,7 @@ rdpRdp* rdp_new(rdpContext* context)
if (!rdp)
return NULL;

InitializeCriticalSection(&rdp->critical);
rdp->context = context;
rdp->instance = context->instance;
flags = 0;
Expand All @@ -1763,7 +1764,7 @@ rdpRdp* rdp_new(rdpContext* context)
context->settings = freerdp_settings_new(flags);

if (!context->settings)
goto out_free;
goto fail;

newSettings = TRUE;
}
Expand All @@ -1784,93 +1785,67 @@ rdpRdp* rdp_new(rdpContext* context)
rdp->transport = transport_new(context);

if (!rdp->transport)
goto out_free_settings;
goto fail;

rdp->license = license_new(rdp);

if (!rdp->license)
goto out_free_transport;
goto fail;

rdp->input = input_new(rdp);

if (!rdp->input)
goto out_free_license;
goto fail;

rdp->update = update_new(rdp);

if (!rdp->update)
goto out_free_input;
goto fail;

rdp->fastpath = fastpath_new(rdp);

if (!rdp->fastpath)
goto out_free_update;
goto fail;

rdp->nego = nego_new(rdp->transport);

if (!rdp->nego)
goto out_free_fastpath;
goto fail;

rdp->mcs = mcs_new(rdp->transport);

if (!rdp->mcs)
goto out_free_nego;
goto fail;

rdp->redirection = redirection_new();

if (!rdp->redirection)
goto out_free_mcs;
goto fail;

rdp->autodetect = autodetect_new();

if (!rdp->autodetect)
goto out_free_redirection;
goto fail;

rdp->heartbeat = heartbeat_new();

if (!rdp->heartbeat)
goto out_free_autodetect;
goto fail;

rdp->multitransport = multitransport_new();

if (!rdp->multitransport)
goto out_free_heartbeat;
goto fail;

rdp->bulk = bulk_new(context);

if (!rdp->bulk)
goto out_free_multitransport;
goto fail;

return rdp;
out_free_multitransport:
multitransport_free(rdp->multitransport);
out_free_heartbeat:
heartbeat_free(rdp->heartbeat);
out_free_autodetect:
autodetect_free(rdp->autodetect);
out_free_redirection:
redirection_free(rdp->redirection);
out_free_mcs:
mcs_free(rdp->mcs);
out_free_nego:
nego_free(rdp->nego);
out_free_fastpath:
fastpath_free(rdp->fastpath);
out_free_update:
update_free(rdp->update);
out_free_input:
input_free(rdp->input);
out_free_license:
license_free(rdp->license);
out_free_transport:
transport_free(rdp->transport);
out_free_settings:

if (newSettings)
freerdp_settings_free(rdp->settings);

out_free:
free(rdp);
fail:
rdp_free(rdp);
return NULL;
}

Expand Down Expand Up @@ -1950,6 +1925,7 @@ void rdp_free(rdpRdp* rdp)
{
if (rdp)
{
DeleteCriticalSection(&rdp->critical);
winpr_RC4_Free(rdp->rc4_decrypt_key);
winpr_RC4_Free(rdp->rc4_encrypt_key);
winpr_Cipher_Free(rdp->fips_encrypt);
Expand Down
1 change: 1 addition & 0 deletions libfreerdp/core/rdp.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ struct rdp_rdp
UINT64 inPackets;
UINT64 outBytes;
UINT64 outPackets;
CRITICAL_SECTION critical;
};

FREERDP_LOCAL BOOL rdp_read_security_header(wStream* s, UINT16* flags, UINT16* length);
Expand Down
25 changes: 19 additions & 6 deletions libfreerdp/core/security.c
Original file line number Diff line number Diff line change
Expand Up @@ -712,26 +712,31 @@ static BOOL security_key_update(BYTE* key, BYTE* update_key, int key_len, rdpRdp

BOOL security_encrypt(BYTE* data, size_t length, rdpRdp* rdp)
{
BOOL rc = FALSE;
EnterCriticalSection(&rdp->critical);
if (rdp->encrypt_use_count >= 4096)
{
if (!security_key_update(rdp->encrypt_key, rdp->encrypt_update_key, rdp->rc4_key_len, rdp))
return FALSE;
goto fail;

winpr_RC4_Free(rdp->rc4_encrypt_key);
rdp->rc4_encrypt_key = winpr_RC4_New(rdp->encrypt_key, rdp->rc4_key_len);

if (!rdp->rc4_encrypt_key)
return FALSE;
goto fail;

rdp->encrypt_use_count = 0;
}

if (!winpr_RC4_Update(rdp->rc4_encrypt_key, length, data, data))
return FALSE;
goto fail;

rdp->encrypt_use_count++;
rdp->encrypt_checksum_use_count++;
return TRUE;
rc = TRUE;
fail:
LeaveCriticalSection(&rdp->critical);
return rc;
}

BOOL security_decrypt(BYTE* data, size_t length, rdpRdp* rdp)
Expand Down Expand Up @@ -793,19 +798,27 @@ BOOL security_hmac_signature(const BYTE* data, size_t length, BYTE* output, rdpR

BOOL security_fips_encrypt(BYTE* data, size_t length, rdpRdp* rdp)
{
BOOL rc = FALSE;
size_t olen;

EnterCriticalSection(&rdp->critical);
if (!winpr_Cipher_Update(rdp->fips_encrypt, data, length, data, &olen))
return FALSE;
goto fail;

rdp->encrypt_use_count++;
return TRUE;
rc = TRUE;
fail:
LeaveCriticalSection(&rdp->critical);
return rc;
}

BOOL security_fips_decrypt(BYTE* data, size_t length, rdpRdp* rdp)
{
size_t olen;

if (!rdp || !rdp->fips_decrypt)
return FALSE;

if (!winpr_Cipher_Update(rdp->fips_decrypt, data, length, data, &olen))
return FALSE;

Expand Down
221 changes: 63 additions & 158 deletions libfreerdp/core/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
#include <freerdp/build-config.h>
#include <ctype.h>

#include "settings.h"

#ifdef _WIN32
#pragma warning(push)
#pragma warning(disable : 4244)
Expand Down Expand Up @@ -626,92 +628,37 @@ rdpSettings* freerdp_settings_new(DWORD flags)

static void freerdp_settings_free_internal(rdpSettings* settings)
{
free(settings->ServerHostname);
free(settings->Username);
free(settings->Password);
free(settings->Domain);
free(settings->PasswordHash);
free(settings->AcceptedCert);
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->NtlmSamFile);
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->CertificateContent);
free(settings->PrivateKeyContent);
free(settings->RdpKeyContent);
free(settings->CertificateAcceptedFingerprints);
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->RedirectionAcceptedCert);
free(settings->RemoteAssistanceSessionId);
free(settings->RemoteAssistancePassword);
free(settings->RemoteAssistancePassStub);
free(settings->RemoteAssistanceRCTicket);
free(settings->AuthenticationServiceClass);
free(settings->GatewayHostname);
free(settings->GatewayUsername);
free(settings->GatewayPassword);
free(settings->GatewayDomain);
free(settings->GatewayAccessToken);
free(settings->GatewayAcceptedCert);
free(settings->CertificateName);
free(settings->DynamicDSTTimeZoneKeyName);
free(settings->PreconnectionBlob);
free(settings->KerberosKdc);
free(settings->KerberosRealm);
free(settings->DumpRemoteFxFile);
free(settings->PlayRemoteFxFile);
free(settings->RemoteApplicationName);
free(settings->RemoteApplicationIcon);
free(settings->RemoteApplicationProgram);
free(settings->RemoteApplicationFile);
free(settings->RemoteApplicationGuid);
free(settings->RemoteApplicationCmdLine);
free(settings->ImeFileName);
free(settings->DrivesToRedirect);
free(settings->WindowTitle);
free(settings->WmClass);
free(settings->ActionScript);

freerdp_target_net_addresses_free(settings);
freerdp_device_collection_free(settings);
freerdp_static_channel_collection_free(settings);
freerdp_dynamic_channel_collection_free(settings);
memset(settings, 0, sizeof(rdpSettings));

/* Extensions */
free(settings->ActionScript);
settings->ActionScript = NULL;

/* Free all strings, set other pointers NULL */
freerdp_settings_free_keys(settings, TRUE);
}

void freerdp_settings_free(rdpSettings* settings)
Expand All @@ -723,79 +670,13 @@ void freerdp_settings_free(rdpSettings* settings)
free(settings);
}

BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSettings* settings)
{
BOOL rc = FALSE;
UINT32 index;

if (!settings || !_settings)
if (!_settings || !settings)
return FALSE;
freerdp_settings_free_internal(_settings);
*_settings = *settings;

/* char* values */
#define CHECKED_STRDUP(name) \
if (settings->name && !(_settings->name = _strdup(settings->name))) \
goto out_fail
CHECKED_STRDUP(ServerHostname); /* 20 */
CHECKED_STRDUP(Username); /* 21 */
CHECKED_STRDUP(Password); /* 22 */
CHECKED_STRDUP(Domain); /* 23 */
CHECKED_STRDUP(PasswordHash); /* 24 */
CHECKED_STRDUP(AcceptedCert); /* 27 */
CHECKED_STRDUP(AlternateShell); /* 640 */
CHECKED_STRDUP(ShellWorkingDirectory); /* 641 */
CHECKED_STRDUP(ClientAddress); /* 769 */
CHECKED_STRDUP(ClientDir); /* 770 */
CHECKED_STRDUP(DynamicDSTTimeZoneKeyName); /* 897 */
CHECKED_STRDUP(RemoteAssistanceSessionId); /* 1025 */
CHECKED_STRDUP(RemoteAssistancePassStub); /* 1026 */
CHECKED_STRDUP(RemoteAssistancePassword); /* 1027 */
CHECKED_STRDUP(RemoteAssistanceRCTicket); /* 1028 */
CHECKED_STRDUP(AuthenticationServiceClass); /* 1098 */
CHECKED_STRDUP(AllowedTlsCiphers); /* 1101 */
CHECKED_STRDUP(NtlmSamFile); /* 1103 */
CHECKED_STRDUP(PreconnectionBlob); /* 1155 */
CHECKED_STRDUP(TargetNetAddress); /* 1217 */
CHECKED_STRDUP(RedirectionUsername); /* 1220 */
CHECKED_STRDUP(RedirectionDomain); /* 1221 */
CHECKED_STRDUP(RedirectionTargetFQDN); /* 1224 */
CHECKED_STRDUP(RedirectionTargetNetBiosName); /* 1225 */
CHECKED_STRDUP(RedirectionAcceptedCert); /* 1231 */
CHECKED_STRDUP(KerberosKdc); /* 1344 */
CHECKED_STRDUP(KerberosRealm); /* 1345 */
CHECKED_STRDUP(CertificateName); /* 1409 */
CHECKED_STRDUP(CertificateFile); /* 1410 */
CHECKED_STRDUP(PrivateKeyFile); /* 1411 */
CHECKED_STRDUP(RdpKeyFile); /* 1412 */
CHECKED_STRDUP(CertificateContent); /* 1416 */
CHECKED_STRDUP(PrivateKeyContent); /* 1417 */
CHECKED_STRDUP(RdpKeyContent); /* 1418 */
CHECKED_STRDUP(WindowTitle); /* 1542 */
CHECKED_STRDUP(WmClass); /* 1549 */
CHECKED_STRDUP(ComputerName); /* 1664 */
CHECKED_STRDUP(ConnectionFile); /* 1728 */
CHECKED_STRDUP(AssistanceFile); /* 1729 */
CHECKED_STRDUP(HomePath); /* 1792 */
CHECKED_STRDUP(ConfigPath); /* 1793 */
CHECKED_STRDUP(CurrentPath); /* 1794 */
CHECKED_STRDUP(DumpRemoteFxFile); /* 1858 */
CHECKED_STRDUP(PlayRemoteFxFile); /* 1859 */
CHECKED_STRDUP(GatewayHostname); /* 1986 */
CHECKED_STRDUP(GatewayUsername); /* 1987 */
CHECKED_STRDUP(GatewayPassword); /* 1988 */
CHECKED_STRDUP(GatewayDomain); /* 1989 */
CHECKED_STRDUP(GatewayAccessToken); /* 1997 */
CHECKED_STRDUP(GatewayAcceptedCert); /* 1998 */
CHECKED_STRDUP(ProxyHostname); /* 2016 */
CHECKED_STRDUP(RemoteApplicationName); /* 2113 */
CHECKED_STRDUP(RemoteApplicationIcon); /* 2114 */
CHECKED_STRDUP(RemoteApplicationProgram); /* 2115 */
CHECKED_STRDUP(RemoteApplicationFile); /* 2116 */
CHECKED_STRDUP(RemoteApplicationGuid); /* 2117 */
CHECKED_STRDUP(RemoteApplicationCmdLine); /* 2118 */
CHECKED_STRDUP(ImeFileName); /* 2628 */
CHECKED_STRDUP(DrivesToRedirect); /* 4290 */
CHECKED_STRDUP(ActionScript);

if (settings->LoadBalanceInfo && settings->LoadBalanceInfoLength)
{
Expand Down Expand Up @@ -902,15 +783,6 @@ BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)

CopyMemory(_settings->ReceivedCapabilities, settings->ReceivedCapabilities, 32);
CopyMemory(_settings->OrderSupport, settings->OrderSupport, 32);
_settings->ClientHostname = _strdup(settings->ClientHostname);

if (!_settings->ClientHostname)
goto out_fail;

_settings->ClientProductId = _strdup(settings->ClientProductId);

if (!_settings->ClientProductId)
goto out_fail;

_settings->BitmapCacheV2CellInfo =
(BITMAP_CACHE_V2_CELL_INFO*)malloc(sizeof(BITMAP_CACHE_V2_CELL_INFO) * 6);
Expand All @@ -933,16 +805,6 @@ BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
CopyMemory(_settings->GlyphCache, settings->GlyphCache, sizeof(GLYPH_CACHE_DEFINITION) * 10);
CopyMemory(_settings->FragCache, settings->FragCache, sizeof(GLYPH_CACHE_DEFINITION));

if (settings->CertificateContent)
_settings->CertificateContent = _strdup(settings->CertificateContent);
if (settings->PrivateKeyContent)
_settings->PrivateKeyContent = _strdup(settings->PrivateKeyContent);
if (settings->RdpKeyContent)
_settings->RdpKeyContent = _strdup(settings->RdpKeyContent);
if (settings->CertificateAcceptedFingerprints)
_settings->CertificateAcceptedFingerprints =
_strdup(settings->CertificateAcceptedFingerprints);

_settings->ClientAutoReconnectCookie =
(ARC_CS_PRIVATE_PACKET*)malloc(sizeof(ARC_CS_PRIVATE_PACKET));

Expand Down Expand Up @@ -1119,6 +981,55 @@ BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
goto out_fail;
}

if (settings->ActionScript)
_settings->ActionScript = _strdup(settings->ActionScript);
rc = TRUE;
out_fail:
return rc;
}

BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
{
BOOL rc;

if (!settings || !_settings)
return FALSE;

/* This is required to free all non string buffers */
freerdp_settings_free_internal(_settings);
/* This copies everything except allocated non string buffers. reset all allocated buffers to
* NULL to fix issues during cleanup */
rc = freerdp_settings_clone_keys(_settings, settings);

_settings->LoadBalanceInfo = NULL;
_settings->ServerRandom = NULL;
_settings->ClientRandom = NULL;
_settings->RdpServerCertificate = NULL;
_settings->RdpServerRsaKey = NULL;
_settings->ChannelDefArray = NULL;
_settings->MonitorDefArray = NULL;
_settings->MonitorIds = NULL;
_settings->ReceivedCapabilities = NULL;
_settings->OrderSupport = NULL;
_settings->BitmapCacheV2CellInfo = NULL;
_settings->GlyphCache = NULL;
_settings->FragCache = NULL;
_settings->ClientAutoReconnectCookie = NULL;
_settings->ServerAutoReconnectCookie = NULL;
_settings->ClientTimeZone = NULL;
_settings->RedirectionPassword = NULL;
_settings->RedirectionTsvUrl = NULL;
_settings->TargetNetAddresses = NULL;
_settings->DeviceArray = NULL;
_settings->StaticChannelArray = NULL;
_settings->DynamicChannelArray = NULL;
_settings->ActionScript = NULL;
if (!rc)
goto out_fail;

/* Begin copying */
if (!freerdp_settings_int_buffer_copy(_settings, settings))
goto out_fail;
return TRUE;
out_fail:
freerdp_settings_free_internal(_settings);
Expand All @@ -1134,13 +1045,7 @@ rdpSettings* freerdp_settings_clone(const rdpSettings* settings)

return _settings;
out_fail:
/* In case any memory allocation failed during clone, some bytes might leak.
*
* freerdp_settings_free can't be reliable used at this point since it could
* free memory of pointers copied by CopyMemory and detecting and freeing
* each allocation separately is quite painful.
*/
free(_settings);
freerdp_settings_free(_settings);
return NULL;
}
#ifdef _WIN32
Expand Down
5 changes: 5 additions & 0 deletions libfreerdp/core/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@
#include <freerdp/api.h>

FREERDP_LOCAL BOOL freerdp_settings_set_default_order_support(rdpSettings* settings);
FREERDP_LOCAL BOOL freerdp_settings_set_pointer(rdpSettings* dst, size_t index, const void* ptr);
FREERDP_LOCAL BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src);
FREERDP_LOCAL void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup);
FREERDP_LOCAL BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, const char* val,
BOOL cleanup);

#endif /* FREERDP_LIB_CORE_SETTINGS_H */
3 changes: 3 additions & 0 deletions libfreerdp/core/test/TestConnect.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ static int testSuccess(int port)

path = GetCombinedPath(exe, "Sample");
wpath = GetCombinedPath(wexe, "Sample");
free(exe);
exe = NULL;

if (!path || !wpath)
goto fail;
Expand Down Expand Up @@ -226,6 +228,7 @@ static int testSuccess(int port)

fail:
free(exe);
free(wexe);
free(path);
free(wpath);
free(commandLine);
Expand Down
89 changes: 73 additions & 16 deletions libfreerdp/core/test/TestSettings.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ int TestSettings(int argc, char* argv[])
int rc = -1;
size_t x;
rdpSettings* settings = NULL;
rdpSettings* cloned;
rdpSettings* cloned = NULL;
rdpSettings* cloned2 = NULL;
WINPR_UNUSED(argc);
WINPR_UNUSED(argv);
settings = freerdp_settings_new(0);
Expand All @@ -17,24 +18,29 @@ int TestSettings(int argc, char* argv[])
return -1;
}

settings->Username = _strdup("abcdefg");
settings->Password = _strdup("xyz");
if (!freerdp_settings_set_string(settings, FreeRDP_Username, "abcdefg"))
goto fail;
if (!freerdp_settings_set_string(settings, FreeRDP_Password, "xyz"))
goto fail;

cloned = freerdp_settings_clone(settings);

if (!cloned)
{
printf("Problem cloning settings\n");
freerdp_settings_free(settings);
return -1;
}
goto fail;

#if defined(have_bool_list_indices)

for (x = 0; x < ARRAYSIZE(bool_list_indices); x++)
{
const size_t key = bool_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const BOOL val = freerdp_settings_get_bool(settings, key);

const BOOL cval = freerdp_settings_get_bool(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %u -> copy %u\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_bool(settings, key, val))
goto fail;
}
Expand All @@ -45,8 +51,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(int16_list_indices); x++)
{
const size_t key = int16_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const INT16 val = freerdp_settings_get_int16(settings, key);

const INT16 cval = freerdp_settings_get_int16(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRId16 " -> copy %" PRId16 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_int16(settings, key, val))
goto fail;
}
Expand All @@ -57,8 +69,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
{
const size_t key = uint16_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const UINT16 val = freerdp_settings_get_uint16(settings, key);

const UINT16 cval = freerdp_settings_get_uint16(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRIu16 " -> copy %" PRIu16 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_uint16(settings, key, val))
goto fail;
}
Expand All @@ -69,8 +87,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
{
const size_t key = uint32_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const UINT32 val = freerdp_settings_get_uint32(settings, key);

const UINT32 cval = freerdp_settings_get_uint32(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRIu32 " -> copy %" PRIu32 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_uint32(settings, key, val))
goto fail;
}
Expand All @@ -81,8 +105,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(int32_list_indices); x++)
{
const size_t key = int32_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const INT32 val = freerdp_settings_get_int32(settings, key);

const INT32 cval = freerdp_settings_get_int32(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRId32 " -> copy %" PRId32 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_int32(settings, key, val))
goto fail;
}
Expand All @@ -93,8 +123,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
{
const size_t key = uint64_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const UINT64 val = freerdp_settings_get_uint64(settings, key);

const UINT64 cval = freerdp_settings_get_uint64(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRIu64 " -> copy %" PRIu64 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_uint64(settings, key, val))
goto fail;
}
Expand All @@ -105,8 +141,14 @@ int TestSettings(int argc, char* argv[])
for (x = 0; x < ARRAYSIZE(int64_list_indices); x++)
{
const size_t key = int64_list_indices[x];
const char* name = freerdp_settings_get_name_for_key(key);
const INT64 val = freerdp_settings_get_int64(settings, key);

const INT64 cval = freerdp_settings_get_int64(cloned, key);
if (val != cval)
{
printf("mismatch for key %s: %" PRId64 " -> copy %" PRId64 "\n", name, val, cval);
goto fail;
}
if (!freerdp_settings_set_int64(settings, key, val))
goto fail;
}
Expand All @@ -119,7 +161,14 @@ int TestSettings(int argc, char* argv[])
const size_t key = string_list_indices[x];
const char val[] = "test-string";
const char* res;

const char* name = freerdp_settings_get_name_for_key(key);
const char* oval = freerdp_settings_get_string(settings, key);
const char* cval = freerdp_settings_get_string(cloned, key);
if ((oval != cval) && (strcmp(oval, cval) != 0))
{
printf("mismatch for key %s: %s -> copy %s\n", name, oval, cval);
goto fail;
}
if (!freerdp_settings_set_string(settings, key, val))
goto fail;

Expand All @@ -136,12 +185,20 @@ int TestSettings(int argc, char* argv[])
{
const size_t key = pointer_list_indices[x];
const void* val = freerdp_settings_get_pointer(settings, key);
WINPR_UNUSED(val);
}

#endif
cloned2 = freerdp_settings_clone(settings);
if (!cloned2)
goto fail;
if (!freerdp_settings_copy(cloned2, cloned))
goto fail;

rc = 0;
fail:
freerdp_settings_free(cloned);
freerdp_settings_free(cloned2);
freerdp_settings_free(settings);
return rc;
}
2 changes: 2 additions & 0 deletions libfreerdp/core/transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ BOOL transport_connect_nla(rdpTransport* transport)
if (!settings->Authentication)
return TRUE;

nla_free(rdp->nla);
rdp->nla = nla_new(instance, transport, settings);

if (!rdp->nla)
Expand Down Expand Up @@ -1214,6 +1215,7 @@ void transport_free(rdpTransport* transport)
if (transport->ReceiveBuffer)
Stream_Release(transport->ReceiveBuffer);

nla_free(transport->nla);
StreamPool_Free(transport->ReceivePool);
CloseHandle(transport->connectedEvent);
CloseHandle(transport->rereadEvent);
Expand Down
79 changes: 56 additions & 23 deletions libfreerdp/crypto/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,24 @@ BOOL crypto_cert_get_public_key(CryptoCert cert, BYTE** PublicKey, DWORD* Public
static int crypto_rsa_common(const BYTE* input, int length, UINT32 key_length, const BYTE* modulus,
const BYTE* exponent, int exponent_size, BYTE* output)
{
BN_CTX* ctx;
BN_CTX* ctx = NULL;
int output_length = -1;
BYTE* input_reverse;
BYTE* modulus_reverse;
BYTE* exponent_reverse;
BIGNUM *mod, *exp, *x, *y;
input_reverse = (BYTE*)malloc(2 * key_length + exponent_size);
BYTE* input_reverse = NULL;
BYTE* modulus_reverse = NULL;
BYTE* exponent_reverse = NULL;
BIGNUM* mod = NULL;
BIGNUM* exp = NULL;
BIGNUM* x = NULL;
BIGNUM* y = NULL;
size_t bufferSize = 2 * key_length + exponent_size;

if (!input || (length < 0) || (exponent_size < 0) || !modulus || !exponent || !output)
return -1;

if (length > bufferSize)
bufferSize = length;

input_reverse = (BYTE*)calloc(bufferSize, 1);

if (!input_reverse)
return -1;
Expand Down Expand Up @@ -131,16 +142,24 @@ static int crypto_rsa_common(const BYTE* input, int length, UINT32 key_length, c
if (!(y = BN_new()))
goto fail_bn_y;

BN_bin2bn(modulus_reverse, key_length, mod);
BN_bin2bn(exponent_reverse, exponent_size, exp);
BN_bin2bn(input_reverse, length, x);
BN_mod_exp(y, x, exp, mod, ctx);
if (!BN_bin2bn(modulus_reverse, key_length, mod))
goto fail;

if (!BN_bin2bn(exponent_reverse, exponent_size, exp))
goto fail;
if (!BN_bin2bn(input_reverse, length, x))
goto fail;
if (BN_mod_exp(y, x, exp, mod, ctx) != 1)
goto fail;
output_length = BN_bn2bin(y, output);
if (output_length < 0)
goto fail;
crypto_reverse(output, output_length);

if (output_length < (int)key_length)
if (output_length < key_length)
memset(output + output_length, 0, key_length - output_length);

fail:
BN_free(y);
fail_bn_y:
BN_clear_free(x);
Expand Down Expand Up @@ -797,6 +816,8 @@ static int verify_cb(int ok, X509_STORE_CTX* csc)

BOOL x509_verify_certificate(CryptoCert cert, const char* certificate_store_path)
{
size_t i;
const int purposes[3] = { X509_PURPOSE_SSL_SERVER, X509_PURPOSE_SSL_CLIENT, X509_PURPOSE_ANY };
X509_STORE_CTX* csc;
BOOL status = FALSE;
X509_STORE* cert_ctx = NULL;
Expand Down Expand Up @@ -831,23 +852,35 @@ BOOL x509_verify_certificate(CryptoCert cert, const char* certificate_store_path
X509_LOOKUP_add_dir(lookup, certificate_store_path, X509_FILETYPE_PEM);
}

csc = X509_STORE_CTX_new();

if (csc == NULL)
goto end;

X509_STORE_set_flags(cert_ctx, 0);

if (!X509_STORE_CTX_init(csc, cert_ctx, cert->px509, cert->px509chain))
goto end;
for (i = 0; i < ARRAYSIZE(purposes); i++)
{
int err = -1, rc = -1;
int purpose = purposes[i];
csc = X509_STORE_CTX_new();

if (csc == NULL)
goto skip;
if (!X509_STORE_CTX_init(csc, cert_ctx, cert->px509, cert->px509chain))
goto skip;

X509_STORE_CTX_set_purpose(csc, X509_PURPOSE_ANY);
X509_STORE_CTX_set_verify_cb(csc, verify_cb);
X509_STORE_CTX_set_purpose(csc, purpose);
X509_STORE_CTX_set_verify_cb(csc, verify_cb);

if (X509_verify_cert(csc) == 1)
status = TRUE;
rc = X509_verify_cert(csc);
err = X509_STORE_CTX_get_error(csc);
skip:
X509_STORE_CTX_free(csc);
if (rc == 1)
{
status = TRUE;
break;
}
else if (err != X509_V_ERR_INVALID_PURPOSE)
break;
}

X509_STORE_CTX_free(csc);
X509_STORE_free(cert_ctx);
end:
return status;
Expand Down
3 changes: 2 additions & 1 deletion libfreerdp/crypto/tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -1198,9 +1198,10 @@ static BOOL is_accepted_fingerprint(CryptoCert cert, const char* CertificateAcce
char* cur = strtok_s(copy, ",", &context);
while (cur)
{
char* subcontext = NULL;
BOOL equal;
char* strhash;
const char* h = strtok(cur, ":");
const char* h = strtok_s(cur, ":", &subcontext);
const char* fp;

if (!h)
Expand Down
38 changes: 19 additions & 19 deletions libfreerdp/primitives/prim_colors.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ static pstatus_t general_yCbCrToRGB_16s8u_P3AC4R_BGRX(const INT16* const pSrc[3]
{
INT16 R, G, B;
const INT32 divisor = 16;
const INT32 Y = ((*pY++) + 4096) << divisor;
const INT32 Y = (INT32)((UINT32)((*pY++) + 4096) << divisor);
const INT32 Cb = (*pCb++);
const INT32 Cr = (*pCr++);
const INT32 CrR = Cr * (INT32)(1.402525f * (1 << divisor));
const INT32 CrG = Cr * (INT32)(0.714401f * (1 << divisor));
const INT32 CbG = Cb * (INT32)(0.343730f * (1 << divisor));
const INT32 CbB = Cb * (INT32)(1.769905f * (1 << divisor));
const INT64 CrR = Cr * (INT64)(1.402525f * (1 << divisor)) * 1LL;
const INT64 CrG = Cr * (INT64)(0.714401f * (1 << divisor)) * 1LL;
const INT64 CbG = Cb * (INT64)(0.343730f * (1 << divisor)) * 1LL;
const INT64 CbB = Cb * (INT64)(1.769905f * (1 << divisor)) * 1LL;
R = ((INT16)((CrR + Y) >> divisor) >> 5);
G = ((INT16)((Y - CbG - CrG) >> divisor) >> 5);
B = ((INT16)((CbB + Y) >> divisor) >> 5);
Expand Down Expand Up @@ -90,18 +90,18 @@ static pstatus_t general_yCbCrToRGB_16s8u_P3AC4R_general(const INT16* const pSrc
{
for (x = 0; x < roi->width; x++)
{
INT16 R, G, B;
INT64 R, G, B;
const INT32 divisor = 16;
const INT32 Y = ((*pY++) + 4096) << divisor;
const INT32 Y = (INT32)((UINT32)((*pY++) + 4096) << divisor);
const INT32 Cb = (*pCb++);
const INT32 Cr = (*pCr++);
const INT32 CrR = Cr * (INT32)(1.402525f * (1 << divisor));
const INT32 CrG = Cr * (INT32)(0.714401f * (1 << divisor));
const INT32 CbG = Cb * (INT32)(0.343730f * (1 << divisor));
const INT32 CbB = Cb * (INT32)(1.769905f * (1 << divisor));
R = ((INT16)((CrR + Y) >> divisor) >> 5);
G = ((INT16)((Y - CbG - CrG) >> divisor) >> 5);
B = ((INT16)((CbB + Y) >> divisor) >> 5);
const INT64 CrR = Cr * (INT64)(1.402525f * (1 << divisor)) * 1LL;
const INT64 CrG = Cr * (INT64)(0.714401f * (1 << divisor)) * 1LL;
const INT64 CbG = Cb * (INT64)(0.343730f * (1 << divisor)) * 1LL;
const INT64 CbB = Cb * (INT64)(1.769905f * (1 << divisor)) * 1LL;
R = (INT64)((CrR + Y) >> (divisor + 5));
G = (INT64)((Y - CbG - CrG) >> (divisor + 5));
B = (INT64)((CbB + Y) >> (divisor + 5));
pRGB = (*writePixel)(pRGB, formatSize, DstFormat, CLIP(R), CLIP(G), CLIP(B), 0xFF);
}

Expand Down Expand Up @@ -170,7 +170,7 @@ static pstatus_t general_yCbCrToRGB_16s16s_P3P3(const INT16* const pSrc[3], INT3
INT32 y = (INT32)(*yptr++);
INT32 cb = (INT32)(*cbptr++);
INT32 cr = (INT32)(*crptr++);
INT32 r, g, b;
INT64 r, g, b;
/*
* This is the slow floating point version kept here for reference.
* y = y + 4096; // 128<<5=4096 so that we can scale the sum by>>5
Expand All @@ -191,10 +191,10 @@ static pstatus_t general_yCbCrToRGB_16s16s_P3P3(const INT16* const pSrc[3], INT3
* G: 0.344 << 16 = 22544, 0.714 << 16 = 46792
* B: 1.770 << 16 = 115998
*/
y = (y + 4096) << 16;
r = y + cr * 91947;
g = y - cb * 22544 - cr * 46792;
b = y + cb * 115998;
y = (INT32)((UINT32)(y + 4096) << 16);
r = y + cr * 91947LL;
g = y - cb * 22544LL - cr * 46792LL;
b = y + cb * 115998LL;
*rptr++ = CLIP(r >> 21);
*gptr++ = CLIP(g >> 21);
*bptr++ = CLIP(b >> 21);
Expand Down
12 changes: 10 additions & 2 deletions libfreerdp/primitives/prim_shift.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ static INLINE pstatus_t general_lShiftC_16s(const INT16* pSrc, UINT32 val, INT16
{
if (val == 0)
return PRIMITIVES_SUCCESS;
if (val >= 16)
return -1;

while (len--)
*pDst++ = *pSrc++ << val;
*pDst++ = (INT16)((UINT16)*pSrc++ << val);

return PRIMITIVES_SUCCESS;
}
Expand All @@ -38,6 +40,8 @@ static INLINE pstatus_t general_rShiftC_16s(const INT16* pSrc, UINT32 val, INT16
{
if (val == 0)
return PRIMITIVES_SUCCESS;
if (val >= 16)
return -1;

while (len--)
*pDst++ = *pSrc++ >> val;
Expand All @@ -51,9 +55,11 @@ static INLINE pstatus_t general_lShiftC_16u(const UINT16* pSrc, UINT32 val, UINT
{
if (val == 0)
return PRIMITIVES_SUCCESS;
if (val >= 16)
return -1;

while (len--)
*pDst++ = *pSrc++ << val;
*pDst++ = (INT16)((UINT16)*pSrc++ << val);

return PRIMITIVES_SUCCESS;
}
Expand All @@ -64,6 +70,8 @@ static INLINE pstatus_t general_rShiftC_16u(const UINT16* pSrc, UINT32 val, UINT
{
if (val == 0)
return PRIMITIVES_SUCCESS;
if (val >= 16)
return -1;

while (len--)
*pDst++ = *pSrc++ >> val;
Expand Down
4 changes: 2 additions & 2 deletions libfreerdp/primitives/prim_shift_opt.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ static primitives_t* generic = NULL;
#if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS)
/* ------------------------------------------------------------------------- */
SSE3_SCD_ROUTINE(sse2_lShiftC_16s, INT16, generic->lShiftC_16s, _mm_slli_epi16,
*dptr++ = *sptr++ << val)
*dptr++ = (INT16)((UINT16)*sptr++ << val))
/* ------------------------------------------------------------------------- */
SSE3_SCD_ROUTINE(sse2_rShiftC_16s, INT16, generic->rShiftC_16s, _mm_srai_epi16,
*dptr++ = *sptr++ >> val)
/* ------------------------------------------------------------------------- */
SSE3_SCD_ROUTINE(sse2_lShiftC_16u, UINT16, generic->lShiftC_16u, _mm_slli_epi16,
*dptr++ = *sptr++ << val)
*dptr++ = (INT16)((UINT16)*sptr++ << val))
/* ------------------------------------------------------------------------- */
SSE3_SCD_ROUTINE(sse2_rShiftC_16u, UINT16, generic->rShiftC_16u, _mm_srli_epi16,
*dptr++ = *sptr++ >> val)
Expand Down
4 changes: 4 additions & 0 deletions libfreerdp/primitives/prim_templates.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@
const _type_* sptr = pSrc; \
_type_* dptr = pDst; \
size_t count; \
if (val == 0) \
return PRIMITIVES_SUCCESS; \
if (val >= 16) \
return -1; \
if (len < 16) /* pointless if too small */ \
{ \
return _fallback_(pSrc, val, pDst, len); \
Expand Down
85 changes: 79 additions & 6 deletions libfreerdp/primitives/test/TestPrimitivesShift.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,18 @@ static BOOL test_lShift_16s_func(void)
UINT32 val;
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));
val = (val % (FUNC_TEST_SIZE - 1)) + 1;
val = val % 16;
/* Negative tests */
status = generic->lShiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->lShiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->lShiftC_16s(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -63,7 +74,19 @@ static BOOL test_lShift_16u_func(void)
UINT32 val;
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));
val = (val % (FUNC_TEST_SIZE - 1)) + 1;
val = val % 16;

/* Negative tests */
status = generic->lShiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->lShiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->lShiftC_16u(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -97,7 +120,19 @@ static BOOL test_rShift_16s_func(void)
UINT32 val;
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));
val = (val % (FUNC_TEST_SIZE - 1)) + 1;
val = val % 16;

/* Negative Tests */
status = generic->rShiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->rShiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->rShiftC_16s(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -131,7 +166,18 @@ static BOOL test_rShift_16u_func(void)
UINT32 val;
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));
val = (val % (FUNC_TEST_SIZE - 1)) + 1;
val = val % 16;
/* Negative tests */
status = generic->rShiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->rShiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->rShiftC_16u(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -166,7 +212,19 @@ static BOOL test_ShiftWrapper_16s_func(void)
INT32 val;
winpr_RAND((BYTE*)&tmp, sizeof(tmp));
winpr_RAND((BYTE*)src, sizeof(src));
val = (tmp % (FUNC_TEST_SIZE - 1)) + 1;
val = tmp % 16;

/* Negative tests */
status = generic->shiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->shiftC_16s(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->shiftC_16s(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -221,7 +279,18 @@ static BOOL test_ShiftWrapper_16u_func(void)
INT32 val;
winpr_RAND((BYTE*)&tmp, sizeof(tmp));
winpr_RAND((BYTE*)src, sizeof(src));
val = (tmp % (FUNC_TEST_SIZE - 1)) + 1;
val = tmp % 16;

/* Negative */
status = generic->shiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);
if (status == PRIMITIVES_SUCCESS)
return FALSE;

status = optimized->shiftC_16u(src + 1, 16, d1 + 1, FUNC_TEST_SIZE);

if (status == PRIMITIVES_SUCCESS)
return FALSE;

/* Aligned */
status = generic->shiftC_16u(src + 1, val, d1 + 1, FUNC_TEST_SIZE);

Expand Down Expand Up @@ -275,6 +344,7 @@ static BOOL test_lShift_16s_speed(void)
winpr_RAND((BYTE*)src, sizeof(src));
winpr_RAND((BYTE*)&val, sizeof(val));

val = val % 16;
if (!speed_test("lShift_16s", "aligned", g_Iterations, (speed_test_fkt)generic->lShiftC_16s,
(speed_test_fkt)optimized->lShiftC_16s, src, val, dst, MAX_TEST_SIZE))
return FALSE;
Expand All @@ -294,6 +364,7 @@ static BOOL test_lShift_16u_speed(void)
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));

val = val % 16;
if (!speed_test("lShift_16u", "aligned", g_Iterations, (speed_test_fkt)generic->lShiftC_16u,
(speed_test_fkt)optimized->lShiftC_16u, src, val, dst, MAX_TEST_SIZE))
return FALSE;
Expand All @@ -313,6 +384,7 @@ static BOOL test_rShift_16s_speed(void)
winpr_RAND((BYTE*)src, sizeof(src));
winpr_RAND((BYTE*)&val, sizeof(val));

val = val % 16;
if (!speed_test("rShift_16s", "aligned", g_Iterations, (speed_test_fkt)generic->rShiftC_16s,
(speed_test_fkt)optimized->rShiftC_16s, src, val, dst, MAX_TEST_SIZE))
return FALSE;
Expand All @@ -332,6 +404,7 @@ static BOOL test_rShift_16u_speed(void)
winpr_RAND((BYTE*)&val, sizeof(val));
winpr_RAND((BYTE*)src, sizeof(src));

val = val % 16;
if (!speed_test("rShift_16u", "aligned", g_Iterations, (speed_test_fkt)generic->rShiftC_16u,
(speed_test_fkt)optimized->rShiftC_16u, src, val, dst, MAX_TEST_SIZE))
return FALSE;
Expand Down
135 changes: 129 additions & 6 deletions scripts/update-settings-tests
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,103 @@ def write_str(f, entry_dict):
for val in values:
write_str_case(f, entry_types.index(entry_type), val)
f.write('};\n\n')
f.write('\n')
f.write('BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src)\n')
f.write('{\n')
f.write('\tsize_t x;\n')
f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
f.write('\t{\n')
f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
f.write('\t\tswitch(cur->type)\n')
f.write('\t\t{\n')
f.write('\t\t\tcase 0: /* bool */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tBOOL sval = freerdp_settings_get_bool(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_bool(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 1: /* UINT16 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tUINT16 sval = freerdp_settings_get_uint16(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_uint16(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 2: /* INT16 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tINT16 sval = freerdp_settings_get_int16(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_int16(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 3: /* UINT32 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tUINT32 sval = freerdp_settings_get_uint32(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_uint32(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 4: /* INT32 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tINT32 sval = freerdp_settings_get_int32(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_int32(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 5: /* UINT64 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tUINT64 sval = freerdp_settings_get_uint64(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_uint64(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 6: /* INT64 */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tINT64 sval = freerdp_settings_get_int64(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_int64(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 7: /* strings */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tconst char* sval = freerdp_settings_get_string(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_string_(dst, cur->id, sval, FALSE))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 8: /* pointer */\n')
f.write('\t\t\t{\n')
f.write('\t\t\t\tconst void* sval = freerdp_settings_get_pointer(src, cur->id);\n')
f.write('\t\t\t\tif (!freerdp_settings_set_pointer(dst, cur->id, sval))\n')
f.write('\t\t\t\t\treturn FALSE;\n')
f.write('\t\t\t}\n')
f.write('\t\t\tbreak;\n')

f.write('\t\t}\n')
f.write('\t}\n')
f.write('\treturn TRUE;\n')
f.write('}\n')
f.write('\n')
f.write('void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup)\n')
f.write('{\n')
f.write('\tsize_t x;\n')
f.write('\tfor(x=0; x<ARRAYSIZE(settings_map); x++)\n')
f.write('\t{\n')
f.write('\t\tconst struct settings_str_entry* cur = &settings_map[x];\n')
f.write('\t\tswitch(cur->type)\n')
f.write('\t\t{\n')
f.write('\t\t\tcase 7: /* strings */\n')
f.write('\t\t\t\tfreerdp_settings_set_string_(dst, cur->id, NULL, cleanup);\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t\tcase 8: /* pointer */\n')
f.write('\t\t\t\tfreerdp_settings_set_pointer(dst, cur->id, NULL);\n')
f.write('\t\t\tbreak;\n')
f.write('\t\t}\n')
f.write('\t}\n')
f.write('}\n')
f.write('\n')

f.write('SSIZE_T freerdp_settings_get_key_for_name(const char* value)\n')
f.write('{\n')
f.write('\tsize_t x;\n')
Expand Down Expand Up @@ -130,11 +227,15 @@ def write_getter(f, entry_dict, entry_type, entry_name):

def write_setter_case(f, val, isString, isPointer):
f.write('\t\tcase FreeRDP_' + val + ':\n')
if not isString:
if isPointer:
f.write('\t\t\tsettings->' + val + ' = (void*)val;\n')
f.write('\t\t\tbreak;\n\n')
elif not isString:
f.write('\t\t\tsettings->' + val + ' = val;\n')
f.write('\t\t\tbreak;\n\n')
else:
f.write('\t\t\tfree(settings->' + val + ');\n')
f.write('\t\t\tif (cleanup)\n')
f.write('\t\t\t\tfree(settings->' + val + ');\n')
f.write('\t\t\tsettings->' + val + ' = (val ? _strdup(val) : NULL);\n')
f.write('\t\t\treturn (!val || settings->' + val + ' != NULL);\n\n')

Expand All @@ -143,13 +244,20 @@ def write_setter(f, entry_dict, entry_type, entry_name):
isPointer = 'pointer' in entry_name
values = get_values(entry_dict, entry_type)

f.write('BOOL freerdp_settings_set_' + entry_name.lower() + '(rdpSettings* settings, size_t id, ')
f.write('BOOL freerdp_settings_set_' + entry_name.lower())
if isString:
f.write('_')
f.write('(rdpSettings* settings, size_t id, ')
if isString or isPointer:
f.write('const ')
if not isPointer:
f.write(entry_type + ' val)\n')
f.write(entry_type + ' val')
else:
f.write('void* val)\n')
f.write('void* val')
if isString:
f.write(', BOOL cleanup)\n')
else:
f.write(')\n')
f.write('{\n')
f.write('\tif (!settings)\n')
f.write('\t\treturn FALSE;\n\n')
Expand All @@ -164,6 +272,20 @@ def write_setter(f, entry_dict, entry_type, entry_name):
f.write('\t}\n')
f.write('\treturn TRUE;\n')
f.write('}\n\n')
f.write('\n')
if isString:
f.write('BOOL freerdp_settings_set_' + entry_name.lower() + '(rdpSettings* settings, size_t id, ')
if isString or isPointer:
f.write('const ')
if not isPointer:
f.write(entry_type + ' val')
else:
f.write('void* val')
f.write(')\n')
f.write('{\n')
f.write('\treturn freerdp_settings_set_' + entry_name.lower() + '_(settings, id, val, TRUE);\n')
f.write('}\n')
f.write('\n')

name = os.path.dirname(os.path.realpath(__file__))
begin = "WARNING: this data structure is carefully padded for ABI stability!"
Expand Down Expand Up @@ -230,14 +352,15 @@ try:
write_getter(f, getter_list, 'char*', 'string')
write_setter(f, setter_list, 'char*', 'string')
write_getter(f, getter_list, '*', 'pointer')
# write_setter(f, setter_list, '*', 'pointer')
write_setter(f, setter_list, '*', 'pointer')

f.write('\n')

with open(name + '/../libfreerdp/common/settings_str.c', 'w+') as f:
f.write('/* Generated by ' + '' + ' */\n\n')
f.write('#include <freerdp/settings.h>\n')
f.write('#include <freerdp/log.h>\n\n')
f.write('#include "../core/settings.h"\n\n')
f.write('#define TAG FREERDP_TAG("common.settings")\n\n')

getter_list = dict(type_list)
Expand Down
10 changes: 8 additions & 2 deletions server/proxy/freerdp_proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "pf_log.h"
#include "pf_modules.h"

#include <freerdp/version.h>
#include <freerdp/build-config.h>
#include <winpr/collections.h>
#include <stdlib.h>
Expand Down Expand Up @@ -85,11 +86,14 @@ int main(int argc, char* argv[])
char* config_path = "config.ini";
int status = -1;

WLog_INFO(TAG, "freerdp-proxy version info:");
WLog_INFO(TAG, "\tFreeRDP version: %s", FREERDP_VERSION_FULL);
WLog_INFO(TAG, "\tGit commit: %s", GIT_REVISION);
WLog_DBG(TAG, "\tBuild config: %s", freerdp_get_build_config());

if (argc >= 2)
config_path = argv[1];

pf_server_register_signal_handlers();

config = pf_server_config_load(config_path);
if (!config)
goto fail;
Expand All @@ -107,6 +111,8 @@ int main(int argc, char* argv[])
if (!is_all_required_modules_loaded(config))
goto fail;

pf_server_register_signal_handlers();

server = pf_server_new(config);
if (!server)
goto fail;
Expand Down
98 changes: 69 additions & 29 deletions server/proxy/pf_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,11 @@ static void pf_client_on_error_info(void* ctx, ErrorInfoEventArgs* e)
freerdp_send_error_info(ps->context.rdp);
}

static BOOL pf_client_load_rdpsnd(pClientContext* pc, proxyConfig* config)
static BOOL pf_client_load_rdpsnd(pClientContext* pc)
{
rdpContext* context = (rdpContext*)pc;
pServerContext* ps = pc->pdata->ps;
proxyConfig* config = pc->pdata->config;

/*
* if AudioOutput is enabled in proxy and client connected with rdpsnd, use proxy as rdpsnd
Expand All @@ -98,6 +99,63 @@ static BOOL pf_client_load_rdpsnd(pClientContext* pc, proxyConfig* config)
return TRUE;
}

static BOOL pf_client_passthrough_channels_init(pClientContext* pc)
{
pServerContext* ps = pc->pdata->ps;
rdpSettings* settings = pc->context.settings;
proxyConfig* config = pc->pdata->config;
size_t i;

if (settings->ChannelCount + config->PassthroughCount >= settings->ChannelDefArraySize)
{
LOG_ERR(TAG, pc, "too many channels");
return FALSE;
}

for (i = 0; i < config->PassthroughCount; i++)
{
const char* channel_name = config->Passthrough[i];
CHANNEL_DEF channel = { 0 };

/* only connect connect this channel if already joined in peer connection */
if (!WTSVirtualChannelManagerIsChannelJoined(ps->vcm, channel_name))
{
LOG_INFO(TAG, ps, "client did not connected with channel %s, skipping passthrough",
channel_name);

continue;
}

channel.options = CHANNEL_OPTION_INITIALIZED; /* TODO: Export to config. */
strncpy(channel.name, channel_name, CHANNEL_NAME_LEN);

settings->ChannelDefArray[settings->ChannelCount++] = channel;
}

return TRUE;
}

static BOOL pf_client_use_peer_load_balance_info(pClientContext* pc)
{
pServerContext* ps = pc->pdata->ps;
rdpSettings* settings = pc->context.settings;
DWORD lb_info_len;
const char* lb_info = freerdp_nego_get_routing_token(&ps->context, &lb_info_len);
if (!lb_info)
return TRUE;

free(settings->LoadBalanceInfo);

settings->LoadBalanceInfoLength = lb_info_len;
settings->LoadBalanceInfo = malloc(settings->LoadBalanceInfoLength);

if (!settings->LoadBalanceInfo)
return FALSE;

CopyMemory(settings->LoadBalanceInfo, lb_info, settings->LoadBalanceInfoLength);
return TRUE;
}

/**
* Called before a connection is established.
*
Expand Down Expand Up @@ -135,6 +193,7 @@ static BOOL pf_client_pre_connect(freerdp* instance)
settings->DynamicResolutionUpdate = config->DisplayControl;

settings->AutoReconnectionEnabled = TRUE;

/**
* Register the channel listeners.
* They are required to set up / tear down channels if they are loaded.
Expand All @@ -144,45 +203,26 @@ static BOOL pf_client_pre_connect(freerdp* instance)
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
pf_channels_on_client_channel_disconnect);
PubSub_SubscribeErrorInfo(instance->context->pubSub, pf_client_on_error_info);

/**
* Load all required plugins / channels / libraries specified by current
* settings.
*/
LOG_INFO(TAG, pc, "Loading addins");

if (!config->UseLoadBalanceInfo)
{
/* add passthrough channels to channel def array */
size_t i;
/* if target is static (i.e fetched from config). make sure to use peer's load-balance info,
* in order to support broker redirection.
*/

if (settings->ChannelCount + config->PassthroughCount >= settings->ChannelDefArraySize)
{
LOG_ERR(TAG, pc, "too many channels");
if (!pf_client_use_peer_load_balance_info(pc))
return FALSE;
}

for (i = 0; i < config->PassthroughCount; i++)
{
const char* channel_name = config->Passthrough[i];
CHANNEL_DEF channel = { 0 };

/* only connect connect this channel if already joined in peer connection */
if (!WTSVirtualChannelManagerIsChannelJoined(ps->vcm, channel_name))
{
LOG_INFO(TAG, ps, "client did not connected with channel %s, skipping passthrough",
channel_name);

continue;
}

channel.options = CHANNEL_OPTION_INITIALIZED; /* TODO: Export to config. */
strncpy(channel.name, channel_name, CHANNEL_NAME_LEN);

settings->ChannelDefArray[settings->ChannelCount++] = channel;
}
}

if (!pf_client_load_rdpsnd(pc, config))
if (!pf_client_passthrough_channels_init(pc))
return FALSE;

if (!pf_client_load_rdpsnd(pc))
{
LOG_ERR(TAG, pc, "Failed to load rdpsnd client");
return FALSE;
Expand Down
2 changes: 1 addition & 1 deletion server/shadow/freerdp-shadow-cli.1.in
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ When run as user within a X session (for example from an xterm) a socket on
Successful program execution.
.TP
.B 1
Otherweise.
Otherwise.

.SH SEE ALSO
wlog(7)
Expand Down
2 changes: 1 addition & 1 deletion winpr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ if (NOT WIN32)
endif()

# Soname versioning
set(RAW_VERSION_STRING "2.1.0")
set(RAW_VERSION_STRING "2.1.1")
if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag")
file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
elseif(USE_VERSION_FROM_GIT_TAG)
Expand Down
32 changes: 16 additions & 16 deletions winpr/include/winpr/bitstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,39 +52,39 @@ extern "C"
{
(_bs->prefetch) = 0;
if (((UINT32)(_bs->pointer - _bs->buffer) + 4) < (_bs->capacity))
(_bs->prefetch) |= (*(_bs->pointer + 4) << 24);
(_bs->prefetch) |= ((UINT32) * (_bs->pointer + 4) << 24);
if (((UINT32)(_bs->pointer - _bs->buffer) + 5) < (_bs->capacity))
(_bs->prefetch) |= (*(_bs->pointer + 5) << 16);
(_bs->prefetch) |= ((UINT32) * (_bs->pointer + 5) << 16);
if (((UINT32)(_bs->pointer - _bs->buffer) + 6) < (_bs->capacity))
(_bs->prefetch) |= (*(_bs->pointer + 6) << 8);
(_bs->prefetch) |= ((UINT32) * (_bs->pointer + 6) << 8);
if (((UINT32)(_bs->pointer - _bs->buffer) + 7) < (_bs->capacity))
(_bs->prefetch) |= (*(_bs->pointer + 7) << 0);
(_bs->prefetch) |= ((UINT32) * (_bs->pointer + 7) << 0);
}

static INLINE void BitStream_Fetch(wBitStream* _bs)
{
(_bs->accumulator) = 0;
if (((UINT32)(_bs->pointer - _bs->buffer) + 0) < (_bs->capacity))
(_bs->accumulator) |= (*(_bs->pointer + 0) << 24);
(_bs->accumulator) |= ((UINT32) * (_bs->pointer + 0) << 24);
if (((UINT32)(_bs->pointer - _bs->buffer) + 1) < (_bs->capacity))
(_bs->accumulator) |= (*(_bs->pointer + 1) << 16);
(_bs->accumulator) |= ((UINT32) * (_bs->pointer + 1) << 16);
if (((UINT32)(_bs->pointer - _bs->buffer) + 2) < (_bs->capacity))
(_bs->accumulator) |= (*(_bs->pointer + 2) << 8);
(_bs->accumulator) |= ((UINT32) * (_bs->pointer + 2) << 8);
if (((UINT32)(_bs->pointer - _bs->buffer) + 3) < (_bs->capacity))
(_bs->accumulator) |= (*(_bs->pointer + 3) << 0);
(_bs->accumulator) |= ((UINT32) * (_bs->pointer + 3) << 0);
BitStream_Prefetch(_bs);
}

static INLINE void BitStream_Flush(wBitStream* _bs)
{
if (((UINT32)(_bs->pointer - _bs->buffer) + 0) < (_bs->capacity))
*(_bs->pointer + 0) = (_bs->accumulator >> 24);
*(_bs->pointer + 0) = ((UINT32)_bs->accumulator >> 24);
if (((UINT32)(_bs->pointer - _bs->buffer) + 1) < (_bs->capacity))
*(_bs->pointer + 1) = (_bs->accumulator >> 16);
*(_bs->pointer + 1) = ((UINT32)_bs->accumulator >> 16);
if (((UINT32)(_bs->pointer - _bs->buffer) + 2) < (_bs->capacity))
*(_bs->pointer + 2) = (_bs->accumulator >> 8);
*(_bs->pointer + 2) = ((UINT32)_bs->accumulator >> 8);
if (((UINT32)(_bs->pointer - _bs->buffer) + 3) < (_bs->capacity))
*(_bs->pointer + 3) = (_bs->accumulator >> 0);
*(_bs->pointer + 3) = ((UINT32)_bs->accumulator >> 0);
}

static INLINE void BitStream_Shift(wBitStream* _bs, UINT32 _nbits)
Expand All @@ -99,21 +99,21 @@ extern "C"
_bs->offset += _nbits;
if (_bs->offset < 32)
{
_bs->mask = ((1 << _nbits) - 1);
_bs->mask = ((1UL << _nbits) - 1);
_bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask);
_bs->prefetch <<= _nbits;
}
else
{
_bs->mask = ((1 << _nbits) - 1);
_bs->mask = ((1UL << _nbits) - 1);
_bs->accumulator |= ((_bs->prefetch >> (32 - _nbits)) & _bs->mask);
_bs->prefetch <<= _nbits;
_bs->offset -= 32;
_bs->pointer += 4;
BitStream_Prefetch(_bs);
if (_bs->offset)
{
_bs->mask = ((1 << _bs->offset) - 1);
_bs->mask = ((1UL << _bs->offset) - 1);
_bs->accumulator |= ((_bs->prefetch >> (32 - _bs->offset)) & _bs->mask);
_bs->prefetch <<= _bs->offset;
}
Expand Down Expand Up @@ -149,7 +149,7 @@ extern "C"
_bs->pointer += 4;
if (_bs->offset)
{
_bs->mask = ((1 << _bs->offset) - 1);
_bs->mask = ((1UL << _bs->offset) - 1);
_bs->accumulator |= ((_bits & _bs->mask) << (32 - _bs->offset));
}
}
Expand Down
7 changes: 0 additions & 7 deletions winpr/include/winpr/sam.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,6 @@
#include <winpr/winpr.h>
#include <winpr/wtypes.h>

struct winpr_sam
{
FILE* fp;
char* line;
char* buffer;
BOOL readOnly;
};
typedef struct winpr_sam WINPR_SAM;

struct winpr_sam_entry
Expand Down
Loading