Well, crashed again at the same place, ("if (TLS_buffer[i] == '\n')" line). So, better patch is attached.
-- ...Bye..Dmitry.
--- echoping-6.0.2.orig/readline.c +++ echoping-6.0.2/readline.c @@ -139,7 +139,8 @@ if (ln) { /* Empty buffer */ if (buf_end == 0) { - rc = gnutls_record_recv(session, TLS_buffer, maxlen); + rc = gnutls_record_recv(session, TLS_buffer, + maxlen > MAXTOREAD ? MAXTOREAD : maxlen); if (rc == -1) return rc; buf_end = rc; @@ -148,23 +149,24 @@ /* No more data in the buffer */ else if (buf_ptr == buf_end) { buf_ptr = 0; - rc = gnutls_record_recv(session, TLS_buffer, maxlen); + rc = gnutls_record_recv(session, TLS_buffer, + maxlen > MAXTOREAD ? MAXTOREAD : maxlen); if (rc == -1) return rc; buf_end = rc; } else if (TLS_buffer[buf_end] != '\n') { rc = gnutls_record_recv(session, TLS_buffer + buf_end, - maxlen); + maxlen > MAXTOREAD - buf_end ? MAXTOREAD - buf_end : maxlen); if (rc == -1) return rc; buf_end = buf_end + rc; } for (oi = buf_ptr, i = buf_ptr; - i <= buf_end && TLS_buffer[i] != '\n'; i++) { + i < buf_end && TLS_buffer[i] != '\n'; i++) { *ptr++ = TLS_buffer[i]; buf_ptr++; } - if (TLS_buffer[i] == '\n') + if (i < buf_end && TLS_buffer[i] == '\n') buf_ptr++; *ptr = '\0'; /* printf ("DEBUG: TLS_readline returns %d (%s)\n", i - oi,