use SSL_peek for sock_gets
[claws.git] / src / socket.c
index acd7192b8cef77df6bbd6f7d854ea98be2d1a3fa..d739a71846fba95cd3832b0e7538227d034d409b 100644 (file)
@@ -447,20 +447,21 @@ gint fd_gets(gint fd, gchar *buf, gint len)
 #if USE_SSL
 gint ssl_gets(SSL *ssl, gchar *buf, gint len)
 {
-       gchar *bp = buf;
-       gboolean newline = FALSE;
+       gchar *newline, *bp = buf;
        gint n;
 
        if (--len < 1)
                return -1;
-       while (len > 0 && !newline) {
-               *bp = '\0';
-               if ((n = SSL_read(ssl, bp, 1)) < 0)
+       do {
+               if ((n = SSL_peek(ssl, bp, len)) <= 0)
+                       return -1;
+               if ((newline = memchr(bp, '\n', n)) != NULL)
+                       n = newline - bp + 1;
+               if ((n = SSL_read(ssl, bp, n)) < 0)
                        return -1;
-               if (*bp == '\n')
-                       newline = TRUE;
                bp += n;
-       }
+               len -= n;
+       } while (!newline && len);
 
        *bp = '\0';
        return bp - buf;