summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_lib.c')
-rw-r--r--src/lib/libssl/ssl_lib.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index 68eee77e6f..1ac7d6f951 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1226,36 +1226,33 @@ int SSL_set_cipher_list(SSL *s,const char *str)
1226/* works well for SSLv2, not so good for SSLv3 */ 1226/* works well for SSLv2, not so good for SSLv3 */
1227char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) 1227char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1228 { 1228 {
1229 char *p; 1229 char *end;
1230 STACK_OF(SSL_CIPHER) *sk; 1230 STACK_OF(SSL_CIPHER) *sk;
1231 SSL_CIPHER *c; 1231 SSL_CIPHER *c;
1232 size_t curlen = 0;
1232 int i; 1233 int i;
1233 1234
1234 if ((s->session == NULL) || (s->session->ciphers == NULL) || 1235 if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1235 (len < 2)) 1236 (len < 2))
1236 return(NULL); 1237 return(NULL);
1237 1238
1238 p=buf;
1239 sk=s->session->ciphers; 1239 sk=s->session->ciphers;
1240 buf[0] = '\0';
1240 for (i=0; i<sk_SSL_CIPHER_num(sk); i++) 1241 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1241 { 1242 {
1242 int n;
1243
1244 c=sk_SSL_CIPHER_value(sk,i); 1243 c=sk_SSL_CIPHER_value(sk,i);
1245 n=strlen(c->name); 1244 end = buf + curlen;
1246 if (n+1 > len) 1245 if (strlcat(buf, c->name, len) >= len ||
1246 (curlen = strlcat(buf, ":", len)) >= len)
1247 { 1247 {
1248 if (p != buf) 1248 /* remove truncated cipher from list */
1249 --p; 1249 *end = '\0';
1250 *p='\0'; 1250 break;
1251 return buf;
1252 } 1251 }
1253 strcpy(p,c->name);
1254 p+=n;
1255 *(p++)=':';
1256 len-=n+1;
1257 } 1252 }
1258 p[-1]='\0'; 1253 /* remove trailing colon */
1254 if ((end = strrchr(buf, ':')) != NULL)
1255 *end = '\0';
1259 return(buf); 1256 return(buf);
1260 } 1257 }
1261 1258