Commit c33ba23a authored by Laurent Aimar's avatar Laurent Aimar

Clean up remoteosd (use picture_*, fix a few race conditions and memory

leaks).
parent 04c2b122
...@@ -64,63 +64,8 @@ ...@@ -64,63 +64,8 @@
#include <gcrypt.h> /* to encrypt password */ #include <gcrypt.h> /* to encrypt password */
#include <vlc_gcrypt.h> #include <vlc_gcrypt.h>
#define CHALLENGESIZE 16
#define MAX_VNC_SERVER_NAME_LENGTH 255
#include "remoteosd_rfbproto.h" /* type definitions of the RFB protocol for VNC */ #include "remoteosd_rfbproto.h" /* type definitions of the RFB protocol for VNC */
/*****************************************************************************
* Local prototypes
*****************************************************************************/
/* subfilter functions */
static int CreateFilter ( vlc_object_t * );
static void DestroyFilter( vlc_object_t * );
static subpicture_t *Filter( filter_t *, mtime_t );
static int MouseEvent ( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static void stop_osdvnc ( filter_t *p_filter );
static void vnc_worker_thread ( vlc_object_t *p_thread_obj );
static void update_request_thread( vlc_object_t *p_thread_obj );
static bool open_vnc_connection ( filter_t *p_filter );
static bool handshaking ( filter_t *p_filter );
static bool process_server_message ( filter_t *p_filter,
rfbServerToClientMsg *msg );
static bool read_exact( filter_t *p_filter,
int i_socket,
char* p_readbuf,
int i_bytes );
static bool write_exact( filter_t *p_filter,
int i_socket,
char* p_writebuf,
int i_bytes );
static inline void rgb_to_yuv( uint8_t *y, uint8_t *u, uint8_t *v,
int r, int g, int b );
static inline bool fill_rect( filter_sys_t* p_sys,
uint16_t i_x, uint16_t i_y,
uint16_t i_w, uint16_t i_h,
uint8_t i_color );
static inline bool raw_line( filter_sys_t* p_sys,
uint16_t i_x, uint16_t i_y,
uint16_t i_w );
static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -167,6 +112,8 @@ static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd ); ...@@ -167,6 +112,8 @@ static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd );
#define RMTOSD_UPDATE_DEFAULT 1000 #define RMTOSD_UPDATE_DEFAULT 1000
#define RMTOSD_UPDATE_MAX 300 #define RMTOSD_UPDATE_MAX 300
static int CreateFilter ( vlc_object_t * );
static void DestroyFilter( vlc_object_t * );
vlc_module_begin(); vlc_module_begin();
set_description( N_("Remote-OSD over VNC") ); set_description( N_("Remote-OSD over VNC") );
...@@ -197,6 +144,50 @@ vlc_module_begin(); ...@@ -197,6 +144,50 @@ vlc_module_begin();
vlc_module_end(); vlc_module_end();
/*****************************************************************************
* Local prototypes
*****************************************************************************/
#define CHALLENGESIZE 16
#define MAX_VNC_SERVER_NAME_LENGTH 255
/* subfilter functions */
static subpicture_t *Filter( filter_t *, mtime_t );
static int MouseEvent ( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static void stop_osdvnc ( filter_t *p_filter );
static void vnc_worker_thread ( vlc_object_t *p_thread_obj );
static void update_request_thread( vlc_object_t *p_thread_obj );
static bool open_vnc_connection ( filter_t *p_filter );
static bool handshaking ( filter_t *p_filter );
static bool process_server_message ( filter_t *p_filter,
rfbServerToClientMsg *msg );
static inline void rgb_to_yuv( uint8_t *y, uint8_t *u, uint8_t *v,
int r, int g, int b );
static inline bool fill_rect( filter_sys_t* p_sys,
uint16_t i_x, uint16_t i_y,
uint16_t i_w, uint16_t i_h,
uint8_t i_color );
static inline bool raw_line( filter_sys_t* p_sys,
uint16_t i_x, uint16_t i_y,
uint16_t i_w );
static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd );
/***************************************************************************** /*****************************************************************************
* Sub filter code * Sub filter code
*****************************************************************************/ *****************************************************************************/
...@@ -243,7 +234,6 @@ struct filter_sys_t ...@@ -243,7 +234,6 @@ struct filter_sys_t
bool b_continue; bool b_continue;
vlc_object_t* p_worker_thread; vlc_object_t* p_worker_thread;
vlc_object_t* p_update_request_thread;
uint8_t ar_color_table_yuv[256][4]; uint8_t ar_color_table_yuv[256][4];
}; };
...@@ -258,15 +248,16 @@ static int CreateFilter ( vlc_object_t *p_this ) ...@@ -258,15 +248,16 @@ static int CreateFilter ( vlc_object_t *p_this )
msg_Dbg( p_filter, "Creating vnc osd filter..." ); msg_Dbg( p_filter, "Creating vnc osd filter..." );
p_filter->p_sys = p_sys = (filter_sys_t *) malloc( sizeof(filter_sys_t) ); p_filter->p_sys = p_sys = malloc( sizeof(*p_sys) );
if( !p_filter->p_sys ) if( !p_filter->p_sys )
return VLC_ENOMEM; return VLC_ENOMEM;
memset( p_sys, 0, sizeof(filter_sys_t) ); memset( p_sys, 0, sizeof(*p_sys) );
/* Populating struct */ /* Populating struct */
vlc_mutex_init( &p_sys->lock ); vlc_mutex_init( &p_sys->lock );
p_sys->b_continue = true; p_sys->b_continue = true;
p_sys->i_socket = -1; p_sys->i_socket = -1;
p_sys->p_pic = NULL;
p_sys->psz_host = var_CreateGetString( p_this, RMTOSD_CFG "host" ); p_sys->psz_host = var_CreateGetString( p_this, RMTOSD_CFG "host" );
if( EMPTY_STR(p_sys->psz_host) ) if( EMPTY_STR(p_sys->psz_host) )
...@@ -342,7 +333,6 @@ static int CreateFilter ( vlc_object_t *p_this ) ...@@ -342,7 +333,6 @@ static int CreateFilter ( vlc_object_t *p_this )
{ {
vlc_object_detach( p_sys->p_worker_thread ); vlc_object_detach( p_sys->p_worker_thread );
vlc_object_release( p_sys->p_worker_thread ); vlc_object_release( p_sys->p_worker_thread );
p_sys->p_worker_thread = NULL;
msg_Err( p_filter, "cannot spawn vnc message reader thread" ); msg_Err( p_filter, "cannot spawn vnc message reader thread" );
goto error; goto error;
} }
...@@ -354,10 +344,9 @@ static int CreateFilter ( vlc_object_t *p_this ) ...@@ -354,10 +344,9 @@ static int CreateFilter ( vlc_object_t *p_this )
error: error:
msg_Err( p_filter, "osdvnc filter discarded" ); msg_Err( p_filter, "osdvnc filter discarded" );
p_sys->b_continue = false;
stop_osdvnc( p_filter ); stop_osdvnc( p_filter );
vlc_mutex_destroy( &p_sys->lock );
free( p_sys->psz_host ); free( p_sys->psz_host );
free( p_sys->psz_passwd ); free( p_sys->psz_passwd );
free( p_sys ); free( p_sys );
...@@ -387,7 +376,6 @@ static void DestroyFilter( vlc_object_t *p_this ) ...@@ -387,7 +376,6 @@ static void DestroyFilter( vlc_object_t *p_this )
KeyEvent, p_this ); KeyEvent, p_this );
vlc_object_release( p_sys->p_vout ); vlc_object_release( p_sys->p_vout );
p_sys->p_vout = NULL;
} }
var_Destroy( p_this, RMTOSD_CFG "host" ); var_Destroy( p_this, RMTOSD_CFG "host" );
...@@ -399,6 +387,7 @@ static void DestroyFilter( vlc_object_t *p_this ) ...@@ -399,6 +387,7 @@ static void DestroyFilter( vlc_object_t *p_this )
var_Destroy( p_this, RMTOSD_CFG "key-events" ); var_Destroy( p_this, RMTOSD_CFG "key-events" );
var_Destroy( p_this, RMTOSD_CFG "alpha" ); var_Destroy( p_this, RMTOSD_CFG "alpha" );
vlc_mutex_destroy( &p_sys->lock );
free( p_sys->psz_host ); free( p_sys->psz_host );
free( p_sys->psz_passwd ); free( p_sys->psz_passwd );
free( p_sys ); free( p_sys );
...@@ -408,30 +397,20 @@ static void stop_osdvnc ( filter_t *p_filter ) ...@@ -408,30 +397,20 @@ static void stop_osdvnc ( filter_t *p_filter )
{ {
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
if (p_sys->i_socket >= 0) /* It will unlock socket reading */
{ vlc_object_kill( p_filter );
net_Close(p_sys->i_socket);
}
p_sys->b_continue = false; /* this causes the threads to stop */
if ( p_sys->p_worker_thread ) /* */
if( p_sys->p_worker_thread )
{ {
msg_Dbg( p_filter, "joining worker_thread" ); msg_Dbg( p_filter, "joining worker_thread" );
vlc_object_kill( p_sys->p_worker_thread );
vlc_thread_join( p_sys->p_worker_thread ); vlc_thread_join( p_sys->p_worker_thread );
vlc_object_detach( p_sys->p_worker_thread ); vlc_object_detach( p_sys->p_worker_thread );
vlc_object_release( p_sys->p_worker_thread ); vlc_object_release( p_sys->p_worker_thread );
msg_Dbg( p_filter, "released worker_thread" ); msg_Dbg( p_filter, "released worker_thread" );
} }
if ( p_sys->p_update_request_thread )
{
msg_Dbg( p_filter, "joining update_request_thread" );
vlc_thread_join( p_sys->p_update_request_thread );
vlc_object_detach( p_sys->p_update_request_thread );
vlc_object_release( p_sys->p_update_request_thread );
msg_Dbg( p_filter, "released update_request_thread" );
}
msg_Dbg( p_filter, "osdvnc stopped" ); msg_Dbg( p_filter, "osdvnc stopped" );
} }
...@@ -689,19 +668,20 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj ) ...@@ -689,19 +668,20 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj )
{ {
filter_t* p_filter = (filter_t*)(p_thread_obj->p_parent); filter_t* p_filter = (filter_t*)(p_thread_obj->p_parent);
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
vlc_object_t *p_update_request_thread;
msg_Dbg( p_filter, "VNC worker thread started" ); msg_Dbg( p_filter, "VNC worker thread started" );
if ( open_vnc_connection ( p_filter ) == false ) if( !open_vnc_connection ( p_filter ) )
{ {
msg_Err( p_filter, "Could not connect to vnc host" ); msg_Err( p_filter, "Could not connect to vnc host" );
return; goto exit;
} }
if ( handshaking ( p_filter ) == false ) if( !handshaking ( p_filter ) )
{ {
msg_Err( p_filter, "Error occured while handshaking vnc host" ); msg_Err( p_filter, "Error occured while handshaking vnc host" );
return; goto exit;
} }
p_sys->b_connection_active = true; /* to enable sending key p_sys->b_connection_active = true; /* to enable sending key
...@@ -709,60 +689,45 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj ) ...@@ -709,60 +689,45 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj )
/* Create an empty picture for VNC the data */ /* Create an empty picture for VNC the data */
vlc_mutex_lock( &p_sys->lock ); vlc_mutex_lock( &p_sys->lock );
p_sys->p_pic = malloc( sizeof(picture_t) ); p_sys->p_pic = picture_New( VLC_FOURCC('Y','U','V','A'),
p_sys->i_vnc_width, p_sys->i_vnc_height, VOUT_ASPECT_FACTOR );
if( !p_sys->p_pic ) if( !p_sys->p_pic )
{ {
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
return; goto exit;
}
vout_AllocatePicture( VLC_OBJECT(p_filter), p_sys->p_pic,
VLC_FOURCC('Y','U','V','A'),
p_sys->i_vnc_width,
p_sys->i_vnc_height,
VOUT_ASPECT_FACTOR );
if( !p_sys->p_pic->i_planes )
{
free( p_sys->p_pic );
p_sys->p_pic = NULL;
vlc_mutex_unlock( &p_sys->lock );
return;
} }
p_sys->i_vnc_pixels = p_sys->i_vnc_width * p_sys->i_vnc_height; p_sys->i_vnc_pixels = p_sys->i_vnc_width * p_sys->i_vnc_height;
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
/* create the update request thread */ /* create the update request thread */
p_sys->p_update_request_thread = vlc_object_create( p_filter, p_update_request_thread = vlc_object_create( p_filter,
sizeof( vlc_object_t ) ); sizeof( vlc_object_t ) );
vlc_object_attach( p_sys->p_update_request_thread, p_filter ); vlc_object_attach( p_update_request_thread, p_filter );
if( vlc_thread_create( p_sys->p_update_request_thread, if( vlc_thread_create( p_update_request_thread,
"vnc update request thread", "vnc update request thread",
update_request_thread, update_request_thread,
VLC_THREAD_PRIORITY_LOW, false ) ) VLC_THREAD_PRIORITY_LOW, false ) )
{ {
vlc_object_detach( p_sys->p_update_request_thread ); vlc_object_detach( p_update_request_thread );
vlc_object_release( p_sys->p_update_request_thread ); vlc_object_release( p_update_request_thread );
p_sys->p_update_request_thread = NULL;
msg_Err( p_filter, "cannot spawn vnc update request thread" ); msg_Err( p_filter, "cannot spawn vnc update request thread" );
return; goto exit;
} }
/* connection is initialized, now read and handle server messages */ /* connection is initialized, now read and handle server messages */
while( vlc_object_alive( p_thread_obj ) )
{
rfbServerToClientMsg msg;
int i_msgSize; int i_msgSize;
rfbServerToClientMsg msg; memset( &msg, 0, sizeof(msg) );
while (p_sys->b_continue) if( !read_exact(p_filter, p_sys->i_socket, (char*)&msg, 1 ) )
{
msg.type = 0;
if ( !read_exact(p_filter, p_sys->i_socket, (char*)&msg, 1 ) )
{ {
msg_Err( p_filter, "Error while waiting for next server message"); msg_Err( p_filter, "Error while waiting for next server message");
p_sys->b_continue = false; break;
} }
else
{
switch (msg.type) switch (msg.type)
{ {
case rfbFramebufferUpdate: case rfbFramebufferUpdate:
...@@ -783,42 +748,49 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj ) ...@@ -783,42 +748,49 @@ static void vnc_worker_thread( vlc_object_t *p_thread_obj )
default: default:
i_msgSize = 0; i_msgSize = 0;
msg_Err( p_filter, "Invalid message %u received", msg.type ); msg_Err( p_filter, "Invalid message %u received", msg.type );
p_sys->b_continue = false; break;
} }
if (p_sys->b_continue == true)
{ if( i_msgSize <= 0 )
if (--i_msgSize > 0) break;
if( --i_msgSize > 0 )
{ {
if ( !read_exact( p_filter, p_sys->i_socket, if ( !read_exact( p_filter, p_sys->i_socket,
((char*)&msg)+1, i_msgSize ) ) ((char*)&msg)+1, i_msgSize ) )
{ {
msg_Err( p_filter, "Error while reading message of type %u", msg_Err( p_filter, "Error while reading message of type %u",
msg.type ); msg.type );
p_sys->b_continue = false; break;
}
else
{
process_server_message( p_filter, &msg);
} }
} }
else
{
process_server_message( p_filter, &msg); process_server_message( p_filter, &msg);
} }
}
} msg_Dbg( p_filter, "joining update_request_thread" );
vlc_object_kill( p_update_request_thread );
vlc_thread_join( p_update_request_thread );
vlc_object_detach( p_update_request_thread );
vlc_object_release( p_update_request_thread );
msg_Dbg( p_filter, "released update_request_thread" );
if (!vlc_object_alive (p_sys->p_worker_thread) || exit:
p_sys->p_worker_thread->b_error)
{
p_sys->b_continue = false;
}
} vlc_mutex_lock( &p_sys->lock );
p_sys->b_connection_active = false;
msg_Dbg( p_filter, "VNC message reader thread ended" ); if (p_sys->i_socket >= 0)
net_Close(p_sys->i_socket);
if( p_sys->p_pic )
picture_Release( p_sys->p_pic );
/* It will hide the subtitle */
p_sys->b_continue = false;
p_sys->b_need_update = true;
vlc_mutex_unlock( &p_sys->lock );
msg_Dbg( p_filter, "VNC message reader thread ended" );
} }
static void update_request_thread( vlc_object_t *p_thread_obj ) static void update_request_thread( vlc_object_t *p_thread_obj )
...@@ -841,33 +813,31 @@ static void update_request_thread( vlc_object_t *p_thread_obj ) ...@@ -841,33 +813,31 @@ static void update_request_thread( vlc_object_t *p_thread_obj )
{ {
msg_Err( p_filter, "Could not write rfbFramebufferUpdateRequestMsg." ); msg_Err( p_filter, "Could not write rfbFramebufferUpdateRequestMsg." );
p_sys->b_continue = false; p_sys->b_continue = false;
return;
} }
udr.incremental = 1; udr.incremental = 1;
mtime_t i_poll_interval_microsec = p_sys->i_vnc_poll_interval * 1000; mtime_t i_poll_interval_microsec = p_sys->i_vnc_poll_interval * 1000;
if (p_sys->b_vnc_poll) if( p_sys->b_vnc_poll)
{ {
while ( p_sys->b_continue == true ) while( vlc_object_alive( p_thread_obj ) )
{ {
msleep( i_poll_interval_microsec ); msleep( i_poll_interval_microsec );
if( write_exact(p_filter, p_sys->i_socket, (char*)&udr, if( write_exact(p_filter, p_sys->i_socket, (char*)&udr,
sz_rfbFramebufferUpdateRequestMsg) == false) sz_rfbFramebufferUpdateRequestMsg) == false)
{ {
msg_Err( p_filter, "Could not write rfbFramebufferUpdateRequestMsg." ); msg_Err( p_filter, "Could not write rfbFramebufferUpdateRequestMsg." );
p_sys->b_continue = false; break;
}
if (!vlc_object_alive (p_sys->p_update_request_thread) ||
p_sys->p_update_request_thread->b_error)
{
p_sys->b_continue = false;
} }
} }
p_sys->b_continue = false;
} }
else else
{ {
msg_Dbg( p_filter, "VNC polling disabled." ); msg_Dbg( p_filter, "VNC polling disabled." );
} }
msg_Dbg( p_filter, "VNC update request thread ended" ); msg_Dbg( p_filter, "VNC update request thread ended" );
} }
...@@ -1146,6 +1116,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date ) ...@@ -1146,6 +1116,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
p_spu->i_stop = 0; p_spu->i_stop = 0;
p_spu->b_ephemer = true; p_spu->b_ephemer = true;
if( !p_sys->b_continue )
p_spu->i_stop = p_spu->i_start + 1;
/* Create new SPU region */ /* Create new SPU region */
memset( &fmt, 0, sizeof(video_format_t) ); memset( &fmt, 0, sizeof(video_format_t) );
fmt.i_chroma = VLC_FOURCC('Y','U','V','A'); fmt.i_chroma = VLC_FOURCC('Y','U','V','A');
...@@ -1270,9 +1243,6 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1270,9 +1243,6 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var,
filter_t *p_filter = (filter_t *)p_data; filter_t *p_filter = (filter_t *)p_data;
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
if( !p_sys->b_connection_active )
return VLC_SUCCESS;
if( !p_sys->b_vnc_mouse_events ) if( !p_sys->b_vnc_mouse_events )
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -1298,6 +1268,13 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1298,6 +1268,13 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var,
/* FIXME: calculate x and y coordinates for scaled output */ /* FIXME: calculate x and y coordinates for scaled output */
vlc_mutex_lock( &p_sys->lock );
if( !p_sys->b_connection_active )
{
vlc_mutex_unlock( &p_sys->lock );
return VLC_SUCCESS;
}
/* buttonMask bits 0-7 are buttons 1-8, 0=up, 1=down */ /* buttonMask bits 0-7 are buttons 1-8, 0=up, 1=down */
rfbPointerEventMsg ev; rfbPointerEventMsg ev;
ev.type = rfbPointerEvent; ev.type = rfbPointerEvent;
...@@ -1308,6 +1285,8 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1308,6 +1285,8 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var,
write_exact( p_filter, p_sys->i_socket, write_exact( p_filter, p_sys->i_socket,
(char*)&ev, sz_rfbPointerEventMsg); (char*)&ev, sz_rfbPointerEventMsg);
vlc_mutex_unlock( &p_sys->lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -1322,9 +1301,6 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1322,9 +1301,6 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
filter_t *p_filter = (filter_t *)p_data; filter_t *p_filter = (filter_t *)p_data;
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
if( !p_sys->b_connection_active )
return VLC_SUCCESS;
if( !p_sys->b_vnc_key_events ) if( !p_sys->b_vnc_key_events )
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -1336,6 +1312,13 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1336,6 +1312,13 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
return VLC_EGENERIC; return VLC_EGENERIC;
} }
vlc_mutex_lock( &p_sys->lock );
if( !p_sys->b_connection_active )
{
vlc_mutex_unlock( &p_sys->lock );
return VLC_SUCCESS;
}
uint32_t i_key32 = newval.i_int; uint32_t i_key32 = newval.i_int;
i_key32 = htonl(i_key32); i_key32 = htonl(i_key32);
rfbKeyEventMsg ev; rfbKeyEventMsg ev;
...@@ -1392,6 +1375,7 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var, ...@@ -1392,6 +1375,7 @@ static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
write_exact( p_filter, p_sys->i_socket, write_exact( p_filter, p_sys->i_socket,
(char*)&ev, sz_rfbKeyEventMsg); (char*)&ev, sz_rfbKeyEventMsg);
} }
vlc_mutex_unlock( &p_sys->lock );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -1423,3 +1407,4 @@ static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd ) ...@@ -1423,3 +1407,4 @@ static void vnc_encrypt_bytes( unsigned char *bytes, char *passwd )
gcry_cipher_encrypt( ctx, bytes, CHALLENGESIZE, bytes, CHALLENGESIZE ); gcry_cipher_encrypt( ctx, bytes, CHALLENGESIZE, bytes, CHALLENGESIZE );
gcry_cipher_close( ctx ); gcry_cipher_close( ctx );
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment