summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2014-06-24 17:42:54 +0000
committerjsing <>2014-06-24 17:42:54 +0000
commit26677f9bb3a482ca44869c898847f16dda2be01e (patch)
treee87a0d93886ee8eaca1c7e439a46f6f7b71fbc22 /src
parentd4f132e9609745e345c90835ab2d403f8629ba03 (diff)
downloadopenbsd-26677f9bb3a482ca44869c898847f16dda2be01e.tar.gz
openbsd-26677f9bb3a482ca44869c898847f16dda2be01e.tar.bz2
openbsd-26677f9bb3a482ca44869c898847f16dda2be01e.zip
Replace 48 lines of code with a single inet_pton() call. The previous
handrolled version could not even make use of sscanf(), since that would not work with a certain antiquated compiler. It is worth noting that there is a tiny change in behaviour - previously calling BIO_get_host_ip() with something that looked like it might be a valid IP address (for example, "1." or even ".") would result in it returning failure rather than trying a BIO_gethostbyname() - now we'll always try a BIO_gethostbyname() if it was not a valid IPv4 address. ok beck@ miod@ deraadt@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/bio/b_sock.c51
-rw-r--r--src/lib/libssl/src/crypto/bio/b_sock.c51
2 files changed, 6 insertions, 96 deletions
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c
index 62d545a129..5f8b1e052f 100644
--- a/src/lib/libcrypto/bio/b_sock.c
+++ b/src/lib/libcrypto/bio/b_sock.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: b_sock.c,v 1.42 2014/06/24 17:30:00 jsing Exp $ */ 1/* $OpenBSD: b_sock.c,v 1.43 2014/06/24 17:42:54 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -59,6 +59,7 @@
59#include <sys/ioctl.h> 59#include <sys/ioctl.h>
60#include <sys/socket.h> 60#include <sys/socket.h>
61 61
62#include <arpa/inet.h>
62#include <netinet/in.h> 63#include <netinet/in.h>
63#include <netinet/tcp.h> 64#include <netinet/tcp.h>
64 65
@@ -72,8 +73,6 @@
72 73
73#include "cryptlib.h" 74#include "cryptlib.h"
74 75
75static int get_ip(const char *str, unsigned char *ip);
76
77int 76int
78BIO_get_host_ip(const char *str, unsigned char *ip) 77BIO_get_host_ip(const char *str, unsigned char *ip)
79{ 78{
@@ -82,15 +81,7 @@ BIO_get_host_ip(const char *str, unsigned char *ip)
82 int locked = 0; 81 int locked = 0;
83 struct hostent *he; 82 struct hostent *he;
84 83
85 i = get_ip(str, ip); 84 if (inet_pton(AF_INET, str, ip) == 1)
86 if (i < 0) {
87 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS);
88 goto err;
89 }
90
91 /* If the string actually contained an IP address, we need not do
92 anything more */
93 if (i > 0)
94 return (1); 85 return (1);
95 86
96 /* do a gethostbyname */ 87 /* do a gethostbyname */
@@ -228,42 +219,6 @@ BIO_socket_ioctl(int fd, long type, void *arg)
228 return (i); 219 return (i);
229} 220}
230 221
231/* The reason I have implemented this instead of using sscanf is because
232 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
233static int
234get_ip(const char *str, unsigned char ip[4])
235{
236 unsigned int tmp[4];
237 int num = 0, c, ok = 0;
238
239 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;
240
241 for (;;) {
242 c= *(str++);
243 if ((c >= '0') && (c <= '9')) {
244 ok = 1;
245 tmp[num] = tmp[num]*10 + c-'0';
246 if (tmp[num] > 255)
247 return (0);
248 } else if (c == '.') {
249 if (!ok)
250 return (-1);
251 if (num == 3)
252 return (0);
253 num++;
254 ok = 0;
255 } else if (c == '\0' && (num == 3) && ok)
256 break;
257 else
258 return (0);
259 }
260 ip[0] = tmp[0];
261 ip[1] = tmp[1];
262 ip[2] = tmp[2];
263 ip[3] = tmp[3];
264 return (1);
265}
266
267int 222int
268BIO_get_accept_socket(char *host, int bind_mode) 223BIO_get_accept_socket(char *host, int bind_mode)
269{ 224{
diff --git a/src/lib/libssl/src/crypto/bio/b_sock.c b/src/lib/libssl/src/crypto/bio/b_sock.c
index 62d545a129..5f8b1e052f 100644
--- a/src/lib/libssl/src/crypto/bio/b_sock.c
+++ b/src/lib/libssl/src/crypto/bio/b_sock.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: b_sock.c,v 1.42 2014/06/24 17:30:00 jsing Exp $ */ 1/* $OpenBSD: b_sock.c,v 1.43 2014/06/24 17:42:54 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -59,6 +59,7 @@
59#include <sys/ioctl.h> 59#include <sys/ioctl.h>
60#include <sys/socket.h> 60#include <sys/socket.h>
61 61
62#include <arpa/inet.h>
62#include <netinet/in.h> 63#include <netinet/in.h>
63#include <netinet/tcp.h> 64#include <netinet/tcp.h>
64 65
@@ -72,8 +73,6 @@
72 73
73#include "cryptlib.h" 74#include "cryptlib.h"
74 75
75static int get_ip(const char *str, unsigned char *ip);
76
77int 76int
78BIO_get_host_ip(const char *str, unsigned char *ip) 77BIO_get_host_ip(const char *str, unsigned char *ip)
79{ 78{
@@ -82,15 +81,7 @@ BIO_get_host_ip(const char *str, unsigned char *ip)
82 int locked = 0; 81 int locked = 0;
83 struct hostent *he; 82 struct hostent *he;
84 83
85 i = get_ip(str, ip); 84 if (inet_pton(AF_INET, str, ip) == 1)
86 if (i < 0) {
87 BIOerr(BIO_F_BIO_GET_HOST_IP, BIO_R_INVALID_IP_ADDRESS);
88 goto err;
89 }
90
91 /* If the string actually contained an IP address, we need not do
92 anything more */
93 if (i > 0)
94 return (1); 85 return (1);
95 86
96 /* do a gethostbyname */ 87 /* do a gethostbyname */
@@ -228,42 +219,6 @@ BIO_socket_ioctl(int fd, long type, void *arg)
228 return (i); 219 return (i);
229} 220}
230 221
231/* The reason I have implemented this instead of using sscanf is because
232 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
233static int
234get_ip(const char *str, unsigned char ip[4])
235{
236 unsigned int tmp[4];
237 int num = 0, c, ok = 0;
238
239 tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;
240
241 for (;;) {
242 c= *(str++);
243 if ((c >= '0') && (c <= '9')) {
244 ok = 1;
245 tmp[num] = tmp[num]*10 + c-'0';
246 if (tmp[num] > 255)
247 return (0);
248 } else if (c == '.') {
249 if (!ok)
250 return (-1);
251 if (num == 3)
252 return (0);
253 num++;
254 ok = 0;
255 } else if (c == '\0' && (num == 3) && ok)
256 break;
257 else
258 return (0);
259 }
260 ip[0] = tmp[0];
261 ip[1] = tmp[1];
262 ip[2] = tmp[2];
263 ip[3] = tmp[3];
264 return (1);
265}
266
267int 222int
268BIO_get_accept_socket(char *host, int bind_mode) 223BIO_get_accept_socket(char *host, int bind_mode)
269{ 224{