Not sure this is sensible as it encourages people to simply
update the table.
I was inclined to remove the code entirely but I am not sure
what broken systems might rely on this.
Only build tested.
Thoughts?
Index: b_sock.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/bio/b_sock.c,v
retrieving revision 1.33
diff -u -p -r1.33 b_sock.c
--- b_sock.c 26 Apr 2014 18:56:37 -0000 1.33
+++ b_sock.c 29 Apr 2014 13:55:39 -0000
@@ -140,6 +140,19 @@ BIO_get_port(const char *str, unsigned s
{
int i;
struct servent *s;
+ size_t len;
+ struct {
+ const char *name;
+ int port;
+ } servmap[] = {
+ { "http", 80 },
+ { "telnet", 23 },
+ { "socks", 1080 },
+ { "https", 443 },
+ { "ssl", 443 },
+ { "ftp", 21 },
+ { "gopher", 70 }
+ };
if (str == NULL) {
BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED);
@@ -155,21 +168,14 @@ BIO_get_port(const char *str, unsigned s
*port_ptr = ntohs((unsigned short)s->s_port);
CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
if (s == NULL) {
- if (strcmp(str, "http") == 0)
- *port_ptr = 80;
- else if (strcmp(str, "telnet") == 0)
- *port_ptr = 23;
- else if (strcmp(str, "socks") == 0)
- *port_ptr = 1080;
- else if (strcmp(str, "https") == 0)
- *port_ptr = 443;
- else if (strcmp(str, "ssl") == 0)
- *port_ptr = 443;
- else if (strcmp(str, "ftp") == 0)
- *port_ptr = 21;
- else if (strcmp(str, "gopher") == 0)
- *port_ptr = 70;
- else {
+ len = sizeof(servmap) / sizeof(servmap[0]);
+ for (i = 0; i < len; i++) {
+ if (strcmp(str, servmap[i].name) == 0) {
+ *port_ptr = servmap[i].port;
+ break;
+ }
+ }
+ if (i == len) {
SYSerr(SYS_F_GETSERVBYNAME, errno);
ERR_asprintf_error_data("service='%s'", str);
return (0);