Browse Source

prevent access violation on null file/socket

Nicolas Cannasse 8 years ago
parent
commit
7d50c31bf6
2 changed files with 39 additions and 7 deletions
  1. 9 1
      src/std/file.c
  2. 30 6
      src/std/socket.c

+ 9 - 1
src/std/file.c

@@ -54,44 +54,52 @@ HL_PRIM hl_fdesc *hl_file_open( vbyte *name, int mode, bool binary ) {
 }
 
 HL_PRIM void hl_file_close( hl_fdesc *f ) {
+	if( !f ) return;
 	if( f->f ) fclose(f->f);
 	f->f = NULL;
 	f->finalize = NULL;
 }
 
 HL_PRIM int hl_file_write( hl_fdesc *f, vbyte *buf, int pos, int len ) {
+	if( !f ) return -1;
 	return (int)fwrite(buf+pos,1,len,f->f);
 }
 
 HL_PRIM int hl_file_read( hl_fdesc *f, vbyte *buf, int pos, int len ) {
+	if( !f ) return -1;
 	return (int)fread((char*)buf+pos,1,len,f->f);
 }
 
 HL_PRIM bool hl_file_write_char( hl_fdesc *f, int c ) {
 	unsigned char cc = (unsigned char)c;
+	if( !f ) return false;
 	return fwrite(&cc,1,1,f->f) == 1;
 }
 
 HL_PRIM int hl_file_read_char( hl_fdesc *f ) {
 	unsigned char cc;
-	if( fread(&cc,1,1,f->f) != 1 )
+	if( !f || fread(&cc,1,1,f->f) != 1 )
 		return -2;
 	return cc;
 }
 
 HL_PRIM bool hl_file_seek( hl_fdesc *f, int pos, int kind ) {
+	if( !f ) return false;
 	return fseek(f->f,pos,kind) == 0;
 }
 
 HL_PRIM int hl_file_tell( hl_fdesc *f ) {
+	if( !f ) return -1;
 	return ftell(f->f);
 }
 
 HL_PRIM bool hl_file_eof( hl_fdesc *f ) {
+	if( !f ) return true;
 	return (bool)feof(f->f);
 }
 
 HL_PRIM bool hl_file_flush( hl_fdesc *f ) {
+	if( !f ) return false;
 	return fflush( f->f ) == 0;
 }
 

+ 30 - 6
src/std/socket.c

@@ -124,6 +124,7 @@ HL_PRIM hl_socket *hl_socket_new( bool udp ) {
 }
 
 HL_PRIM void hl_socket_close( hl_socket *s ) {
+	if( !s ) return;
 	closesocket(s->sock);
 	s->sock = INVALID_SOCKET;
 }
@@ -131,13 +132,18 @@ HL_PRIM void hl_socket_close( hl_socket *s ) {
 HL_PRIM int hl_socket_send_char( hl_socket *s, int c ) {
 	char cc;
 	cc = (char)(unsigned char)c;
+	if( !s )
+		return -2;
 	if( send(s->sock,&cc,1,MSG_NOSIGNAL) == SOCKET_ERROR )
 		return block_error();
 	return 1;
 }
 
 HL_PRIM int hl_socket_send( hl_socket *s, vbyte *buf, int pos, int len ) {
-	int r = send(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
+	int r;
+	if( !s )
+		return -2;
+	r = send(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
 	if( r == SOCKET_ERROR )
 		return block_error();
 	return len;
@@ -145,7 +151,10 @@ HL_PRIM int hl_socket_send( hl_socket *s, vbyte *buf, int pos, int len ) {
 
 
 HL_PRIM int hl_socket_recv( hl_socket *s, vbyte *buf, int pos, int len ) {
-	int	ret = recv(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
+	int	ret;
+	if( !s )
+		return -2;
+	ret = recv(s->sock, (char*)buf + pos, len, MSG_NOSIGNAL);
 	if( ret == SOCKET_ERROR )
 		return block_error();
 	return ret;
@@ -153,7 +162,9 @@ HL_PRIM int hl_socket_recv( hl_socket *s, vbyte *buf, int pos, int len ) {
 
 HL_PRIM int hl_socket_recv_char( hl_socket *s ) {
 	char cc;
-	int ret = recv(s->sock,&cc,1,MSG_NOSIGNAL);
+	int ret;
+	if( !s ) return -2;
+	ret = recv(s->sock,&cc,1,MSG_NOSIGNAL);
 	if( ret == SOCKET_ERROR || ret == 0 )
 		return block_error();
 	return (unsigned char)cc;
@@ -213,6 +224,7 @@ HL_PRIM bool hl_socket_connect( hl_socket *s, int host, int port ) {
 	addr.sin_family = AF_INET;
 	addr.sin_port = htons((unsigned short)port);
 	*(int*)&addr.sin_addr.s_addr = host;
+	if( !s ) return false;
 	if( connect(s->sock,(struct sockaddr*)&addr,sizeof(addr)) != 0 ) {
 		int err = block_error();
 		if( err == -1 ) return true; // in progress
@@ -222,11 +234,13 @@ HL_PRIM bool hl_socket_connect( hl_socket *s, int host, int port ) {
 }
 
 HL_PRIM bool hl_socket_listen( hl_socket *s, int n ) {
+	if( !s ) return false;
 	return listen(s->sock,n) != SOCKET_ERROR;
 }
 
 HL_PRIM bool hl_socket_bind( hl_socket *s, int host, int port ) {
 	struct sockaddr_in addr;
+	if( !s ) return false;
 	memset(&addr,0,sizeof(addr));
 	addr.sin_family = AF_INET;
 	addr.sin_port = htons((unsigned short)port);
@@ -243,6 +257,7 @@ HL_PRIM hl_socket *hl_socket_accept( hl_socket *s ) {
 	_sockaddr addrlen = sizeof(addr);
 	SOCKET nsock;
 	hl_socket *hs;
+	if( !s ) return NULL;
 	nsock = accept(s->sock,(struct sockaddr*)&addr,&addrlen);
 	if( nsock == INVALID_SOCKET )
 		return NULL;
@@ -254,7 +269,7 @@ HL_PRIM hl_socket *hl_socket_accept( hl_socket *s ) {
 HL_PRIM bool hl_socket_peer( hl_socket *s, int *host, int *port ) {
 	struct sockaddr_in addr;
 	_sockaddr addrlen = sizeof(addr);
-	if( getpeername(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
+	if( !s || getpeername(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
 		return false;
 	*host = *(int*)&addr.sin_addr;
 	*port = ntohs(addr.sin_port);
@@ -264,7 +279,7 @@ HL_PRIM bool hl_socket_peer( hl_socket *s, int *host, int *port ) {
 HL_PRIM bool hl_socket_host( hl_socket *s, int *host, int *port ) {
 	struct sockaddr_in addr;
 	_sockaddr addrlen = sizeof(addr);
-	if( getsockname(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
+	if( !s || getsockname(s->sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR )
 		return false;
 	*host = *(int*)&addr.sin_addr;
 	*port = ntohs(addr.sin_port);
@@ -283,6 +298,7 @@ HL_PRIM bool hl_socket_set_timeout( hl_socket *s, double t ) {
 	struct timeval time;
 	init_timeval(t,&time);
 #endif
+	if( !s ) return false;
 	if( setsockopt(s->sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&time,sizeof(time)) != 0 )
 		return false;
 	if( setsockopt(s->sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time)) != 0 )
@@ -291,6 +307,8 @@ HL_PRIM bool hl_socket_set_timeout( hl_socket *s, double t ) {
 }
 
 HL_PRIM bool hl_socket_shutdown( hl_socket *s, bool r, bool w ) {
+	if( !s )
+		return false;
 	if( !r && !w )
 		return true;
 	return shutdown(s->sock,r?(w?SHUT_RDWR:SHUT_RD):SHUT_WR) == 0;
@@ -299,9 +317,12 @@ HL_PRIM bool hl_socket_shutdown( hl_socket *s, bool r, bool w ) {
 HL_PRIM bool hl_socket_set_blocking( hl_socket *s, bool b ) {
 #ifdef HL_WIN
 	unsigned long arg = b?0:1;
+	if( !s ) return false;
 	return ioctlsocket(s->sock,FIONBIO,&arg) == 0;
 #else
-	int rights = fcntl(s->sock,F_GETFL);
+	int rights;
+	if( !s ) return false;
+	rights = fcntl(s->sock,F_GETFL);
 	if( rights == -1 )
 		return false;
 	if( b )
@@ -314,11 +335,13 @@ HL_PRIM bool hl_socket_set_blocking( hl_socket *s, bool b ) {
 
 HL_PRIM bool hl_socket_set_fast_send( hl_socket *s, bool b ) {
 	int fast = b;
+	if( !s ) return false;
 	return setsockopt(s->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&fast,sizeof(fast)) == 0;
 }
 
 HL_PRIM int hl_socket_send_to( hl_socket *s, char *data, int len, int host, int port ) {
 	struct sockaddr_in addr;
+	if( !s ) return -2;
 	memset(&addr,0,sizeof(addr));
 	addr.sin_family = AF_INET;
 	addr.sin_port = htons((unsigned short)port);
@@ -332,6 +355,7 @@ HL_PRIM int hl_socket_send_to( hl_socket *s, char *data, int len, int host, int
 HL_PRIM int hl_socket_recv_from( hl_socket *s, char *data, int len, int *host, int *port ) {
 	struct sockaddr_in saddr;
 	int slen = sizeof(saddr);
+	if( !s ) return -2;
 	len = recvfrom(s->sock, data, len, MSG_NOSIGNAL, (struct sockaddr*)&saddr, &slen);
 	if( len == SOCKET_ERROR ) {
 #ifdef	HL_WIN