From 1895d3a959982e6a9b1bcae177a4135e4244f71a Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Sat, 9 Feb 2013 22:22:31 +0100 Subject: [PATCH] Fixed severe bug in PSOCK_READTO (?) Either I found and fixed a severe bug in PSOCK_READTO() or I misunderstood something completely. To me PSOCK_READTO() is supposed to return if either the supplied character was read or if the user supplied buffer is exhausted - sor far so good. However if the latter occurs up to now PSOCK_READTO() was continuing to process characters already read from the network (aka present in the uIP buffer) in order to check if the supplied character was found there and adjust the return value accordingly. But this means that the character processed this way were lost forever for the caller as the next call to PSOCK_READTO() would continue to read past the characters processed this way. Therefore I removed that character processing altogether. So now if the user supplied buffer is exhausted before the supplied character is found the next call to PSOCK_READTO() starts exactly where previous call left off. --- core/net/psock.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/core/net/psock.c b/core/net/psock.c index fa488f724..47893a5de 100644 --- a/core/net/psock.c +++ b/core/net/psock.c @@ -124,16 +124,6 @@ buf_bufto(CC_REGISTER_ARG struct psock_buf *buf, uint8_t endmarker, return BUF_NOT_FOUND; } - while(*datalen > 0) { - c = **dataptr; - --*datalen; - ++*dataptr; - - if(c == endmarker) { - return BUF_FOUND | BUF_FULL; - } - } - return BUF_FULL; } /*---------------------------------------------------------------------------*/ @@ -274,9 +264,9 @@ PT_THREAD(psock_readto(CC_REGISTER_ARG struct psock *psock, unsigned char c)) psock->readptr = (uint8_t *)uip_appdata; psock->readlen = uip_datalen(); } - } while((buf_bufto(&psock->buf, c, - &psock->readptr, - &psock->readlen) & BUF_FOUND) == 0); + } while(buf_bufto(&psock->buf, c, + &psock->readptr, + &psock->readlen) == BUF_NOT_FOUND); if(psock_datalen(psock) == 0) { psock->state = STATE_NONE;