summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoritz <>2007-10-10 19:39:19 +0000
committermoritz <>2007-10-10 19:39:19 +0000
commitbd1e03a2e6753a3548e4e72197b9ca31041d113a (patch)
tree7779027f2003745fde027dded0605416cdc67ab9
parent5466c28b1bd5a7699ec46cd69510bdaa7994294e (diff)
downloadopenbsd-bd1e03a2e6753a3548e4e72197b9ca31041d113a.tar.gz
openbsd-bd1e03a2e6753a3548e4e72197b9ca31041d113a.tar.bz2
openbsd-bd1e03a2e6753a3548e4e72197b9ca31041d113a.zip
Replace use of strcpy(3) and other pointer goo in
SSL_get_shared_ciphers() with strlcat(3). ok deraadt@ markus@
-rw-r--r--src/lib/libssl/src/ssl/ssl_lib.c27
-rw-r--r--src/lib/libssl/ssl_lib.c27
2 files changed, 24 insertions, 30 deletions
diff --git a/src/lib/libssl/src/ssl/ssl_lib.c b/src/lib/libssl/src/ssl/ssl_lib.c
index e9fda28f63..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)
1168/* works well for SSLv2, not so good for SSLv3 */ 1168/* works well for SSLv2, not so good for SSLv3 */
1169char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) 1169char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1170 { 1170 {
1171 char *p; 1171 char *end;
1172 STACK_OF(SSL_CIPHER) *sk; 1172 STACK_OF(SSL_CIPHER) *sk;
1173 SSL_CIPHER *c; 1173 SSL_CIPHER *c;
1174 size_t curlen = 0;
1174 int i; 1175 int i;
1175 1176
1176 if ((s->session == NULL) || (s->session->ciphers == NULL) || 1177 if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1177 (len < 2)) 1178 (len < 2))
1178 return(NULL); 1179 return(NULL);
1179 1180
1180 p=buf;
1181 sk=s->session->ciphers; 1181 sk=s->session->ciphers;
1182 buf[0] = '\0';
1182 for (i=0; i<sk_SSL_CIPHER_num(sk); i++) 1183 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1183 { 1184 {
1184 int n;
1185
1186 c=sk_SSL_CIPHER_value(sk,i); 1185 c=sk_SSL_CIPHER_value(sk,i);
1187 n=strlen(c->name); 1186 end = buf + curlen;
1188 if (n+1 > len) 1187 if (strlcat(buf, c->name, len) >= len ||
1188 (curlen = strlcat(buf, ":", len)) >= len)
1189 { 1189 {
1190 if (p != buf) 1190 /* remove truncated cipher from list */
1191 --p; 1191 *end = '\0';
1192 *p='\0'; 1192 break;
1193 return buf;
1194 } 1193 }
1195 strcpy(p,c->name);
1196 p+=n;
1197 *(p++)=':';
1198 len-=n+1;
1199 } 1194 }
1200 p[-1]='\0'; 1195 /* remove trailing colon */
1196 if ((end = strrchr(buf, ':')) != NULL)
1197 *end = '\0';
1201 return(buf); 1198 return(buf);
1202 } 1199 }
1203 1200
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index e9fda28f63..0f4b7a475b 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1168,36 +1168,33 @@ int SSL_set_cipher_list(SSL *s,const char *str)
1168/* works well for SSLv2, not so good for SSLv3 */ 1168/* works well for SSLv2, not so good for SSLv3 */
1169char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) 1169char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
1170 { 1170 {
1171 char *p; 1171 char *end;
1172 STACK_OF(SSL_CIPHER) *sk; 1172 STACK_OF(SSL_CIPHER) *sk;
1173 SSL_CIPHER *c; 1173 SSL_CIPHER *c;
1174 size_t curlen = 0;
1174 int i; 1175 int i;
1175 1176
1176 if ((s->session == NULL) || (s->session->ciphers == NULL) || 1177 if ((s->session == NULL) || (s->session->ciphers == NULL) ||
1177 (len < 2)) 1178 (len < 2))
1178 return(NULL); 1179 return(NULL);
1179 1180
1180 p=buf;
1181 sk=s->session->ciphers; 1181 sk=s->session->ciphers;
1182 buf[0] = '\0';
1182 for (i=0; i<sk_SSL_CIPHER_num(sk); i++) 1183 for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
1183 { 1184 {
1184 int n;
1185
1186 c=sk_SSL_CIPHER_value(sk,i); 1185 c=sk_SSL_CIPHER_value(sk,i);
1187 n=strlen(c->name); 1186 end = buf + curlen;
1188 if (n+1 > len) 1187 if (strlcat(buf, c->name, len) >= len ||
1188 (curlen = strlcat(buf, ":", len)) >= len)
1189 { 1189 {
1190 if (p != buf) 1190 /* remove truncated cipher from list */
1191 --p; 1191 *end = '\0';
1192 *p='\0'; 1192 break;
1193 return buf;
1194 } 1193 }
1195 strcpy(p,c->name);
1196 p+=n;
1197 *(p++)=':';
1198 len-=n+1;
1199 } 1194 }
1200 p[-1]='\0'; 1195 /* remove trailing colon */
1196 if ((end = strrchr(buf, ':')) != NULL)
1197 *end = '\0';
1201 return(buf); 1198 return(buf);
1202 } 1199 }
1203 1200