diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 917f26caf269f311f69e90004faf232e7007cf30..d8c3d6192f52028bfd7aab46130a21b971ea1737 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -7471,7 +7471,7 @@ static void skinny_session_cleanup(void *data) struct skinny_line *l; struct skinny_speeddial *sd; - ast_verb(3, "Ending Skinny session from %s\n", ast_inet_ntoa(s->sin.sin_addr)); + ast_verb(3, "Ending Skinny session from %s at %s\n", d ? d->name : "unknown", ast_inet_ntoa(s->sin.sin_addr)); if (s->lockstate) { ast_mutex_unlock(&s->lock); @@ -7517,6 +7517,7 @@ static void skinny_session_cleanup(void *data) static void *skinny_session(void *data) { int res; + int bytesread; struct skinny_req *req = NULL; struct skinnysession *s = data; @@ -7592,41 +7593,41 @@ static void *skinny_session(void *data) break; } - res = 0; + bytesread = 0; while (1) { - int bytesread = res; if ((res = read(s->fd, &req->data+bytesread, dlen-bytesread)) < 0) { + ast_log(LOG_WARNING, "Data read() returned error: %s\n", strerror(errno)); break; } - res += bytesread; - if (res >= dlen) { + bytesread += res; + if (bytesread >= dlen) { + if (res < bytesread) { + ast_log(LOG_WARNING, "Rest of partial data received.\n"); + } + if (bytesread > dlen) { + ast_log(LOG_WARNING, "Client sent wrong amount of data (%d), expected (%d).\n", bytesread, dlen); + res = -1; + } break; } - ast_log(LOG_WARNING, "Partial data received, waiting (%d bytes read of %d)\n", res, dlen); + + ast_log(LOG_WARNING, "Partial data received, waiting (%d bytes read of %d)\n", bytesread, dlen); if (sched_yield() < 0) { ast_log(LOG_WARNING, "Data yield() returned error: %s\n", strerror(errno)); + res = -1; break; } } - if (res < 0) { - ast_log(LOG_WARNING, "Data read() returned error: %s\n", strerror(errno)); - break; - } - if (res != dlen) { - ast_log(LOG_WARNING, "Client sent wrong amount of data (%d), expected (%d).\n", res, dlen); - break; - } s->lockstate = 0; ast_mutex_unlock(&s->lock); + if (res < 0) { + break; + } pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); res = handle_message(req, s); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - if (res < 0) { - ast_verb(3, "Ending Skinny session from %s\n", ast_inet_ntoa(s->sin.sin_addr)); - break; - } } if (req) {