From 625eb81d3ef6ecd53387395a0c983bcb824362ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Mon, 24 Nov 2014 22:38:41 +0100 Subject: [PATCH] 2014-11-24 22:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/hbrand.c ! fixed memory leak * src/rtl/philes.c ! fixed number to handle casting * src/rtl/version.c ! added missing break in switch statement * src/rtl/hbsockhb.c * formatting and protection against wrong parameter passed to hb_socketGetHosts() ; above modifications borrowed from Viktor's branch with some small modifications * src/rtl/hbsocket.c ! always set pSockAddr and puiLen parameters passed to hb_socketAccept() and hb_socketRecvFrom() functions * formatting and comment syncing with Viktor's branch --- ChangeLog.txt | 22 ++++++++++++++++ src/rtl/hbrand.c | 2 +- src/rtl/hbsocket.c | 63 ++++++++++++++++++++++------------------------ src/rtl/hbsockhb.c | 48 ++++++++++++++++++++++------------- src/rtl/philes.c | 2 +- src/rtl/version.c | 2 +- 6 files changed, 86 insertions(+), 53 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index b7747ca0f8..865cc0b906 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,28 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-11-24 22:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/hbrand.c + ! fixed memory leak + + * src/rtl/philes.c + ! fixed number to handle casting + + * src/rtl/version.c + ! added missing break in switch statement + + * src/rtl/hbsockhb.c + * formatting and protection against wrong parameter passed + to hb_socketGetHosts() + + ; above modifications borrowed from Viktor's branch with some small + modifications + + * src/rtl/hbsocket.c + ! always set pSockAddr and puiLen parameters passed to hb_socketAccept() + and hb_socketRecvFrom() functions + * formatting and comment syncing with Viktor's branch + 2014-11-24 10:30 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbnetio/netiocli.c * pacified warning diff --git a/src/rtl/hbrand.c b/src/rtl/hbrand.c index c41f053130..edcaca43bf 100644 --- a/src/rtl/hbrand.c +++ b/src/rtl/hbrand.c @@ -68,7 +68,7 @@ HB_FUNC( HB_RANDSTR ) { void * data = hb_xgrab( len + 1 ); hb_random_block( data, len ); - hb_retclen( ( char * ) data, len ); + hb_retclen_buffer( ( char * ) data, len ); } else hb_retc_null(); diff --git a/src/rtl/hbsocket.c b/src/rtl/hbsocket.c index c14b05712e..e08d2cf191 100644 --- a/src/rtl/hbsocket.c +++ b/src/rtl/hbsocket.c @@ -536,10 +536,10 @@ int hb_socketListen( HB_SOCKET sd, int iBacklog ) HB_SOCKET hb_socketAccept( HB_SOCKET sd, void ** pSockAddr, unsigned * puiLen, HB_MAXINT timeout ) { HB_SYMBOL_UNUSED( sd ); - HB_SYMBOL_UNUSED( pSockAddr ); - HB_SYMBOL_UNUSED( puiLen ); HB_SYMBOL_UNUSED( timeout ); hb_socketSetRawError( HB_SOCKET_ERR_INVALIDHANDLE ); + *pSockAddr = NULL; + *puiLen = 0; return HB_NO_SOCKET; } @@ -594,10 +594,10 @@ long hb_socketRecvFrom( HB_SOCKET sd, void * data, long len, int flags, void ** HB_SYMBOL_UNUSED( data ); HB_SYMBOL_UNUSED( len ); HB_SYMBOL_UNUSED( flags ); - HB_SYMBOL_UNUSED( pSockAddr ); - HB_SYMBOL_UNUSED( puiSockLen ); HB_SYMBOL_UNUSED( timeout ); hb_socketSetRawError( HB_SOCKET_ERR_INVALIDHANDLE ); + *pSockAddr = NULL; + *puiLen = 0; return -1; } @@ -2221,6 +2221,11 @@ HB_SOCKET hb_socketAccept( HB_SOCKET sd, void ** pSockAddr, unsigned * puiLen, H int ret, err; hb_vmUnlock(); + if( pSockAddr && puiLen ) + { + *pSockAddr = NULL; + *puiLen = 0; + } ret = hb_socketSelectRD( sd, timeout ); if( ret > 0 ) { @@ -2235,26 +2240,20 @@ HB_SOCKET hb_socketAccept( HB_SOCKET sd, void ** pSockAddr, unsigned * puiLen, H if( ret > 0 ) hb_socketSetBlockingIO( sd, HB_TRUE ); - if( pSockAddr && puiLen ) + if( newsd != HB_NO_SOCKET ) { - if( newsd == HB_NO_SOCKET ) - { - *pSockAddr = NULL; - *puiLen = 0; - } - else + if( pSockAddr && puiLen ) { *pSockAddr = memcpy( hb_xgrab( len + 1 ), &st.sa, len ); *puiLen = ( unsigned ) len; } - } - /* it's not guarantied that socket returned by accept will use - * blocking IO operations. On some systems it inherits blocking IO - * from parent handler so we have to force blocking IO mode - * explicitly. - */ - if( newsd != HB_NO_SOCKET ) + /* it's not guarantied that socket returned by accept will use + * blocking IO operations. On some systems it inherits blocking + * IO from parent handler so we have to force blocking IO mode + * explicitly. + */ hb_socketSetBlockingIO( newsd, HB_TRUE ); + } hb_socketSetOsError( err ); } @@ -2431,6 +2430,12 @@ long hb_socketRecvFrom( HB_SOCKET sd, void * data, long len, int flags, void ** hb_vmUnlock(); + if( pSockAddr && puiSockLen ) + { + *pSockAddr = NULL; + *puiSockLen = 0; + } + if( timeout >= 0 ) { lReceived = hb_socketSelectRD( sd, timeout ); @@ -2455,18 +2460,10 @@ long hb_socketRecvFrom( HB_SOCKET sd, void * data, long len, int flags, void ** while( lReceived == -1 && HB_SOCK_IS_EINTR( iError ) && hb_vmRequestQuery() == 0 ); - if( pSockAddr && puiSockLen ) + if( lReceived != -1 && pSockAddr && puiSockLen ) { - if( lReceived == -1 ) - { - *pSockAddr = NULL; - *puiSockLen = 0; - } - else - { - *pSockAddr = memcpy( hb_xgrab( salen + 1 ), &st.sa, salen ); - *puiSockLen = ( unsigned ) salen; - } + *pSockAddr = memcpy( hb_xgrab( salen + 1 ), &st.sa, salen ); + *puiSockLen = ( unsigned ) salen; } } hb_vmLock(); @@ -2553,7 +2550,7 @@ int hb_socketSetNoDelay( HB_SOCKET sd, HB_BOOL fNoDelay ) } /* NOTE: For notes on Windows, see: - http://paste.lisp.org/display/59751 + https://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx [vszakats] */ int hb_socketSetExclusiveAddr( HB_SOCKET sd, HB_BOOL fExclusive ) { @@ -3243,7 +3240,7 @@ static void hb_socketArraySetInetAddr( PHB_ITEM pItem, HB_SIZE nPos, } } #endif -#if defined( HB_OS_WIN ) && !defined( SIOCGIFCONF ) +#if defined( HB_OS_WIN ) && ! defined( SIOCGIFCONF ) static HB_SIZE hb_socketArrayFindInetAddr( const char * szAddr, PHB_ITEM pArray, HB_SIZE nPos ) { @@ -3429,7 +3426,7 @@ PHB_ITEM hb_socketGetIFaces( int af, HB_BOOL fNoAliases ) { char hwaddr[ 24 ]; unsigned char * data; - data = ( unsigned char * ) &pifr->ifr_hwaddr.sa_data[0]; + data = ( unsigned char * ) &pifr->ifr_hwaddr.sa_data[ 0 ]; hb_snprintf( hwaddr, sizeof( hwaddr ), "%02X:%02X:%02X:%02X:%02X:%02X", data[ 0 ], data[ 1 ], data[ 2 ], @@ -3441,7 +3438,7 @@ PHB_ITEM hb_socketGetIFaces( int af, HB_BOOL fNoAliases ) { char hwaddr[ 24 ]; unsigned char * data; - data = ( unsigned char * ) &pifr->ifr_enaddr[0]; + data = ( unsigned char * ) &pifr->ifr_enaddr[ 0 ]; hb_snprintf( hwaddr, sizeof( hwaddr ), "%02X:%02X:%02X:%02X:%02X:%02X", data[ 0 ], data[ 1 ], data[ 2 ], diff --git a/src/rtl/hbsockhb.c b/src/rtl/hbsockhb.c index a49bded9f4..35ea9a5b42 100644 --- a/src/rtl/hbsockhb.c +++ b/src/rtl/hbsockhb.c @@ -52,7 +52,7 @@ * hb_socketErrorString( [ nSocketErrror = hb_socketGetError() ] ) --> cError * hb_socketGetSockName( hSocket ) --> aAddr | NIL * hb_socketGetPeerName( hSocket ) --> aAddr | NIL - * hb_socketOpen( [ nDomain = HB_SOCKET_AF_INET ] , [ nType = HB_SOCKET_PT_STREAM ], [ nProtocol = 0 ] ) --> hSocket + * hb_socketOpen( [ nDomain = HB_SOCKET_AF_INET ], [ nType = HB_SOCKET_PT_STREAM ], [ nProtocol = 0 ] ) --> hSocket * hb_socketClose( hSocket ) --> lSuccess * hb_socketShutdown( hSocket, [ nMode = HB_SOCKET_SHUT_RDWR ] ) --> lSuccess * hb_socketBind( hSocket, aAddr ) --> lSuccess @@ -74,9 +74,9 @@ * hb_socketGetSndBufSize( hSocket, @nValue ) --> lSuccess * hb_socketGetRcvBufSize( hSocket, @nValue ) --> lSuccess * hb_socketSetMulticast( hSocket, [ nFamily = HB_SOCKET_AF_INET ], cAddr ) --> lSuccess - * hb_socketSelectRead( hSocket, [ nTimeout = FOREVER ] ) --> nRet - * hb_socketSelectWrite( hSocket, [ nTimeout = FOREVER ] ) --> nRet - * hb_socketSelectWriteEx( hSocket, [ nTimeout = FOREVER ] ) --> nRet + * hb_socketSelectRead( hSocket, [ nTimeout = FOREVER ] ) --> nRet + * hb_socketSelectWrite( hSocket, [ nTimeout = FOREVER ] ) --> nRet + * hb_socketSelectWriteEx( hSocket, [ nTimeout = FOREVER ] ) --> nRet * hb_socketSelect( aRead, lSetRead, aWrite, lSetWrite, aExcep, lSetExcep, [ nTimeout = FOREVER ] ) --> nRet * hb_socketResolveINetAddr( cAddr, nPort ) --> aAddr | NIL * hb_socketResolveAddr( cAddr, [ nFamily = HB_SOCKET_AF_INET ] ) --> cResolved @@ -640,7 +640,7 @@ HB_FUNC( HB_SOCKETRESOLVEADDR ) if( szAddr ) hb_retc_buffer( szAddr ); else - hb_retc( "" ); + hb_retc_null(); } HB_FUNC( HB_SOCKETGETHOSTNAME ) @@ -663,28 +663,42 @@ HB_FUNC( HB_SOCKETGETHOSTNAME ) HB_FUNC( HB_SOCKETGETHOSTS ) { - PHB_ITEM pItem; + const char * szAddr = hb_parc( 1 ); - socket_init(); - pItem = hb_socketGetHosts( hb_parc( 1 ), hb_parnidef( 2, HB_SOCKET_AF_INET ) ); - if( pItem ) - hb_itemReturnRelease( pItem ); + if( szAddr ) + { + PHB_ITEM pItem; + + socket_init(); + pItem = hb_socketGetHosts( szAddr, hb_parnidef( 2, HB_SOCKET_AF_INET ) ); + if( pItem ) + hb_itemReturnRelease( pItem ); + else + hb_reta( 0 ); + } else - hb_reta( 0 ); + hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } #if 0 /* This function is not implemented at C level, yet [Mindaugas] */ HB_FUNC( HB_SOCKETGETALIASES ) { - PHB_ITEM pItem; + const char * szAddr = hb_parc( 1 ); - socket_init(); - pItem = hb_socketGetAliases( hb_parc( 1 ), hb_parnidef( 2, HB_SOCKET_AF_INET ) ); - if( pItem ) - hb_itemReturnRelease( pItem ); + if( szAddr ) + { + PHB_ITEM pItem; + + socket_init(); + pItem = hb_socketGetAliases( szAddr, hb_parnidef( 2, HB_SOCKET_AF_INET ) ); + if( pItem ) + hb_itemReturnRelease( pItem ); + else + hb_reta( 0 ); + } else - hb_reta( 0 ); + hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); } #endif diff --git a/src/rtl/philes.c b/src/rtl/philes.c index c839745412..88999c5650 100644 --- a/src/rtl/philes.c +++ b/src/rtl/philes.c @@ -241,7 +241,7 @@ HB_FUNC( FREADSTR ) if( nToRead > 0 ) { - HB_FHANDLE fhnd = ( HB_FHANDLE ) hb_parni( 1 ); + HB_FHANDLE fhnd = hb_numToHandle( hb_parnint( 1 ) ); char * buffer = ( char * ) hb_xgrab( nToRead + 1 ); HB_SIZE nRead; diff --git a/src/rtl/version.c b/src/rtl/version.c index 2dd1b611ac..181d1635ee 100644 --- a/src/rtl/version.c +++ b/src/rtl/version.c @@ -124,7 +124,7 @@ HB_FUNC( HB_VERSION ) case HB_VERSION_FLAG_C: hb_retc_const( hb_verFlagsC() ); break; case HB_VERSION_FLAG_LINKER: hb_retc_const( hb_verFlagsL() ); break; case HB_VERSION_BITWIDTH: hb_retni( ( int ) sizeof( void * ) * 8 ); break; - case HB_VERSION_MT: hb_retl( hb_vmIsMt() ); + case HB_VERSION_MT: hb_retl( hb_vmIsMt() ); break; case HB_VERSION_SHARED: #if defined( HB_DYNLIB )