Add max allowed size to TC_Read and TC_Talk
[tedtools.git] / tcp.c
diff --git a/tcp.c b/tcp.c
index ecc3bf1..7183b42 100644 (file)
--- a/tcp.c
+++ b/tcp.c
@@ -105,7 +105,7 @@ TC_ClientInitConnection(TC_Connection *cs, char *name, u_int32_t port) {
                        ntohs(cs->serv_addr.sin_port),strerror(errno));
 
         if (setsockopt(cs->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) {
-                tlog(TL_CRIT|TL_EXIT, "socketsockopt failed: %s (d%)", strerror(errno), errno);
+                tlog(TL_CRIT|TL_EXIT, "socketsockopt failed: %s (%d)", strerror(errno), errno);
                 return CS_ERROR;
         }
 
@@ -159,7 +159,28 @@ TC_fillConnection(TC_Connection *sc, char *name, u_int32_t port) {
                sc = (TC_Connection *)tmalloc(sizeof(TC_Connection));
        memset(sc, 0, sizeof(TC_Connection));
        sc->serv_addr.sin_family = AF_INET;
-       sc->serv_addr.sin_addr.s_addr = (name) ? inet_addr(name) : htonl(INADDR_ANY);
+       sc->serv_addr.sin_addr.s_addr = (name && *name != '*' ) ? inet_addr(name) : htonl(INADDR_ANY);
+       if ( sc->serv_addr.sin_addr.s_addr == INADDR_NONE ) {
+               struct hostent *host;
+
+               /*
+                * Can't parse address: it's a DNS Name
+                */
+               host = gethostbyname(name);
+               if ( host && host->h_addrtype == AF_INET ) {
+                       memcpy(&sc->serv_addr.sin_addr.s_addr, host->h_addr_list[0], 
+                               sizeof(&sc->serv_addr.sin_addr.s_addr));
+               } else {
+#ifdef HAVE_HSTRERROR
+                       tlog(TL_CRIT,"gethostbyname: %s - %s", name, hstrerror(h_errno));
+#else
+                       tlog(TL_CRIT,"gethostbyname: %s - %s", name, strerror(errno));
+#endif
+                       sc->state = CS_ERROR;
+                       return sc;
+               }
+       }
+       
        sc->serv_addr.sin_port = htons(port);
        sc->state = CS_NOTINITED;
        return sc; 
@@ -373,7 +394,7 @@ resizeCS( TC_Connection *cs, int sz ) {
 }
 
 u_int32_t
-TC_Read( TC_Connection *cs ) {
+TC_Read( TC_Connection *cs, size_t maxsize ) {
        int sz, totalread = -1, toread=0, alreadyread;
 
        if ( cs->state == CS_ERROR )
@@ -390,6 +411,12 @@ TC_Read( TC_Connection *cs ) {
                resizeCS(cs, sizeof(u_int32_t));
        } else {
                totalread = *(u_int32_t*)(cs->buf);
+               if ( maxsize > 0 && totalread > maxsize )
+               {
+                       tlog(TL_ALARM,"TC_Read: message size (%d b) is greater than max allowed (%d b)", totalread, maxsize);
+                       cs->state = CS_ERROR;
+                       return CS_ERROR;
+               }
                toread = totalread - alreadyread;
                if ( toread == 0 ) {
                        cs->state = CS_FINISHREAD;
@@ -437,7 +464,7 @@ TC_FreeConnection( TC_Connection *cs ) {
 }
 
 u_int32_t 
-TC_Talk( TC_Connection *cs ) {
+TC_Talk( TC_Connection *cs, size_t maxsize  ) {
        if ( cs->state==CS_NOTINITED ) 
                TC_ServerInitConnect( cs );
 
@@ -458,7 +485,7 @@ TC_Talk( TC_Connection *cs ) {
        cs->ptr = cs->buf;
        while( cs->state != CS_FINISHREAD ) {
                while( !TC_ReadyIO( &cs, 1, 100) );
-               if ( TC_Read(cs) == CS_ERROR ) return CS_ERROR;
+               if ( TC_Read(cs, maxsize) == CS_ERROR ) return CS_ERROR;
        }
 
        return CS_OK;