From 18cab50e04f2dbbae945d01219e070c479b56308 Mon Sep 17 00:00:00 2001 From: henning <> Date: Thu, 11 Oct 2007 11:27:31 +0000 Subject: MFC, fix by moritz: The SSL_get_shared_ciphers() function contains an off-by-one overflow. --- src/lib/libssl/src/ssl/ssl_lib.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/lib/libssl/src/ssl/ssl_lib.c b/src/lib/libssl/src/ssl/ssl_lib.c index 4e8f302a5e..0f4b7a475b 100644 --- a/src/lib/libssl/src/ssl/ssl_lib.c +++ b/src/lib/libssl/src/ssl/ssl_lib.c @@ -1168,36 +1168,33 @@ int SSL_set_cipher_list(SSL *s,const char *str) /* works well for SSLv2, not so good for SSLv3 */ char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) { - char *p; - const char *cp; + char *end; STACK_OF(SSL_CIPHER) *sk; SSL_CIPHER *c; + size_t curlen = 0; int i; if ((s->session == NULL) || (s->session->ciphers == NULL) || (len < 2)) return(NULL); - p=buf; sk=s->session->ciphers; + buf[0] = '\0'; for (i=0; iname; *cp; ) + end = buf + curlen; + if (strlcat(buf, c->name, len) >= len || + (curlen = strlcat(buf, ":", len)) >= len) { - if (len-- <= 0) - { - *p='\0'; - return(buf); - } - else - *(p++)= *(cp++); + /* remove truncated cipher from list */ + *end = '\0'; + break; } - *(p++)=':'; } - p[-1]='\0'; + /* remove trailing colon */ + if ((end = strrchr(buf, ':')) != NULL) + *end = '\0'; return(buf); } -- cgit v1.2.3-55-g6feb