Fixed a race condition triggered by receive_meta() and the new
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 12 Mar 2001 23:58:19 +0000 (23:58 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 12 Mar 2001 23:58:19 +0000 (23:58 +0000)
authentication scheme.

src/meta.c

index f9b18ca34be2f5374649316a001d4224c8623e80..ecf875c7107338827a870810f505cbe142d465e5 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: meta.c,v 1.1.2.15 2001/02/25 11:09:29 guus Exp $
+    $Id: meta.c,v 1.1.2.16 2001/03/12 23:58:19 guus Exp $
 */
 
 #include "config.h"
@@ -94,6 +94,7 @@ int receive_meta(connection_t *cl)
   int lenin = 0;
   char inbuf[MAXBUFSIZE];
   char *bufp;
+  int decrypted = 0;
 cp
   if(getsockopt(cl->meta_socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
     {
@@ -108,12 +109,7 @@ cp
       return -1;
     }
 
-  if(cl->status.decryptin)
-    bufp = inbuf;
-  else
-    bufp = cl->buffer + cl->buflen;
-
-  lenin = read(cl->meta_socket, bufp, MAXBUFSIZE - cl->buflen);
+  lenin = read(cl->meta_socket, cl->buffer + cl->buflen, MAXBUFSIZE - cl->buflen);
 
   if(lenin<=0)
     {
@@ -133,16 +129,18 @@ cp
       return -1;
     }
 
-  if(cl->status.decryptin)
-    {
-      EVP_DecryptUpdate(cl->cipher_inctx, cl->buffer + cl->buflen, &lenin, inbuf, lenin);
-    }
-
   oldlen = cl->buflen;
   cl->buflen += lenin;
 
-  for(;;)
+  while(lenin)
     {
+      if(cl->status.decryptin && !decrypted)
+        {
+          EVP_DecryptUpdate(cl->cipher_inctx, inbuf, &lenin, cl->buffer + oldlen, lenin);
+          memcpy(cl->buffer + oldlen, inbuf, lenin);
+          decrypted = 1;
+        }
+
       cl->reqlen = 0;
 
       for(i = oldlen; i < cl->buflen; i++)
@@ -165,6 +163,7 @@ cp
             return -1;
 
           cl->buflen -= cl->reqlen;
+          lenin -= cl->reqlen;
           memmove(cl->buffer, cl->buffer + cl->reqlen, cl->buflen);
           oldlen = 0;
         }