Fixed a race condition triggered by receive_meta() and the new
authentication scheme.
This commit is contained in:
parent
f4887b981f
commit
f1a082823c
1 changed files with 12 additions and 13 deletions
25
src/meta.c
25
src/meta.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue