]> code.citadel.org Git - citadel.git/blobdiff - webcit/tcp_sockets.c
Memleak: getaddrinfo needs freeadrinfo here too.
[citadel.git] / webcit / tcp_sockets.c
index fa37c18d3a7ff42f0264cb8f4e02427480f54144..2ee3cb27e0b81e0289c766cdc70eadf97d1797a3 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright (c) 1987-2010 by the citadel.org team
  *
  * This program is free software; you can redistribute it and/or modify
@@ -112,6 +110,7 @@ int tcp_connectsock(char *host, char *service)
        rc = getaddrinfo(host, service, &hints, &res);
        if (rc != 0) {
                lprintf(1, "%s: %s\n", host, gai_strerror(rc));
+               freeaddrinfo(res);
                return(-1);
        }
 
@@ -127,10 +126,12 @@ int tcp_connectsock(char *host, char *service)
                s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
                if (s < 0) {
                        lprintf(1, "socket() failed: %s\n", strerror(errno));
+                       freeaddrinfo(res);
                        return(-1);
                }
-               rc = connect(s, res->ai_addr, res->ai_addrlen);
+               rc = connect(s, ai->ai_addr, ai->ai_addrlen);
                if (rc >= 0) {
+                       freeaddrinfo(res);
                        return(s);
                }
                else {
@@ -138,7 +139,7 @@ int tcp_connectsock(char *host, char *service)
                        close(s);
                }
        }
-
+        freeaddrinfo(res);
        return(-1);
 }
 
@@ -191,9 +192,9 @@ int StrBuf_ServGetln(StrBuf *buf)
 #ifdef SERV_TRACE
        else 
        {
-               long pos=0;
+               long pos = 0;
                if (WCC->ReadPos != NULL)
-                       pos = WCC->ReadPos - ChrPtr(buf);
+                       pos = WCC->ReadPos - ChrPtr(WCC->ReadBuf);
                lprintf(9, "%3d<<<[%ld]%s\n", WC->serv_sock, pos, ChrPtr(buf));
        }
 #endif
@@ -256,6 +257,42 @@ int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize)
        return rc;
 }
 
+
+void FlushReadBuf (void)
+{
+       long len;
+       const char *pch;
+       const char *pche;
+       wcsession *WCC = WC;
+
+       len = StrLength(WCC->ReadBuf);
+       if ((len > 0) &&
+           (WCC->ReadPos != NULL) && 
+           (WCC->ReadPos != StrBufNOTNULL))
+               
+       {
+               pch = ChrPtr(WCC->ReadBuf);
+               pche = pch + len;
+               if (WCC->ReadPos != pche)
+               {
+                       lprintf(1, "ERROR: somebody didn't eat his soup! Remaing Chars: %d [%s]\n", 
+                               pche - WCC->ReadPos, pche);
+                       lprintf(1, 
+                               "--------------------------------------------------------------------------------\n"
+                               "Whole buf: [%s]\n"
+                               "--------------------------------------------------------------------------------\n", 
+                               pch);
+                       AppendImportantMessage(HKEY("Suppenkasper alert! watch your webcit logfile and get connected to your favourite opensource Crew."));
+               }
+       }
+
+       FlushStrBuf(WCC->ReadBuf);
+       WCC->ReadPos = NULL;
+
+
+}
+
+
 /*
  *  send binary to server
  *  buf the buffer to write to citadel server
@@ -267,8 +304,7 @@ void serv_write(const char *buf, int nbytes)
        int bytes_written = 0;
        int retval;
 
-       FlushStrBuf(WCC->ReadBuf);
-       WCC->ReadPos = NULL;
+       FlushReadBuf();
        while (bytes_written < nbytes) {
                retval = write(WCC->serv_sock, &buf[bytes_written],
                               nbytes - bytes_written);
@@ -293,12 +329,10 @@ void serv_write(const char *buf, int nbytes)
  */
 void serv_puts(const char *string)
 {
-       wcsession *WCC = WC;
 #ifdef SERV_TRACE
        lprintf(9, "%3d>>>%s\n", WC->serv_sock, string);
 #endif
-       FlushStrBuf(WCC->ReadBuf);
-       WCC->ReadPos = NULL;
+       FlushReadBuf();
 
        serv_write(string, strlen(string));
        serv_write("\n", 1);
@@ -310,12 +344,10 @@ void serv_puts(const char *string)
  */
 void serv_putbuf(const StrBuf *string)
 {
-       wcsession *WCC = WC;
 #ifdef SERV_TRACE
        lprintf(9, "%3d>>>%s\n", WC->serv_sock, ChrPtr(string));
 #endif
-       FlushStrBuf(WCC->ReadBuf);
-       WCC->ReadPos = NULL;
+       FlushReadBuf();
 
        serv_write(ChrPtr(string), StrLength(string));
        serv_write("\n", 1);
@@ -329,13 +361,11 @@ void serv_putbuf(const StrBuf *string)
  */
 void serv_printf(const char *format,...)
 {
-       wcsession *WCC = WC;
        va_list arg_ptr;
        char buf[SIZ];
        size_t len;
 
-       FlushStrBuf(WCC->ReadBuf);
-       WCC->ReadPos = NULL;
+       FlushReadBuf();
 
        va_start(arg_ptr, format);
        vsnprintf(buf, sizeof buf, format, arg_ptr);