socsvn commit: r237474 - in soc2012/exxo: . patches
exxo at FreeBSD.org
exxo at FreeBSD.org
Mon Jun 11 17:57:22 UTC 2012
Author: exxo
Date: Mon Jun 11 17:57:19 2012
New Revision: 237474
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237474
Log:
Adding support of getaddrinfo in openssl-1.0.1c
Added:
soc2012/exxo/bugnotes.txt
soc2012/exxo/patches/openssl-1.0.1c-getaddrinfo.patch
Added: soc2012/exxo/bugnotes.txt
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2012/exxo/bugnotes.txt Mon Jun 11 17:57:19 2012 (r237474)
@@ -0,0 +1,14 @@
+<openssl-1.0.1c>
+
+ TYPE conceptual error
+ WHERE b_sock.c:689 in BIO_get_accept_socket()
+ DESCRIPTION the parsing of source address is not complete when requesting IPv6 listening explicitly
+ (e.g "localhost::1234" leads to h="localhost:", p="1234")
+ AFFECTS all hosts with IPv6 syntax "::" excluding "::port"
+
+ --------------
+
+ TYPE incorrect behaviour of API
+ WHERE b_sock.c:705 in BIO_get_accept_socket()
+ DESCRIPTION requesting an IPv6 listening of an host without AAAA record fallback to IPv4
+ AFFECTS all hosts supporting IPv4 only
Added: soc2012/exxo/patches/openssl-1.0.1c-getaddrinfo.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2012/exxo/patches/openssl-1.0.1c-getaddrinfo.patch Mon Jun 11 17:57:19 2012 (r237474)
@@ -0,0 +1,134 @@
+diff -rup openssl-1.0.1c/crypto/bio/b_sock.c openssl-1.0.1c-working/crypto/bio/b_sock.c
+--- openssl-1.0.1c/crypto/bio/b_sock.c 2012-04-16 19:43:14.000000000 +0200
++++ openssl-1.0.1c-working/crypto/bio/b_sock.c 2012-06-10 01:09:15.000000000 +0200
+@@ -467,9 +467,60 @@ end:
+ #endif
+ }
+
++int BIO_getaddrinfo(const char *hostname, const char *servname,
++ const struct addrinfo *hints, struct addrinfo **res)
++ {
++#ifdef EAI_FAMILY
++ int err;
++ const char *reason;
++ static union { void *p;
++ int (WSAAPI *f)(const char *,const char *,
++ const struct addrinfo *,
++ struct addrinfo **);
++ } p_getaddrinfo = {NULL};
++ static union { void *p;
++ const char * (WSAAPI *f)(int);
++ } p_gai_strerror = {NULL};
++
++ if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))!=NULL)
++ {
++ if ((err = (*p_getaddrinfo.f)(hostname,servname,hints,res)))
++ {
++ BIOerr(BIO_F_BIO_GETADDRINFO,BIO_R_BAD_HOSTNAME_LOOKUP);
++ if ((p_gai_strerror.p=DSO_global_lookup("gai_strerror"))!=NULL)
++ {
++#ifdef OPENSSL_SYS_WINDOWS /* gai_strerror is not thread-safe under Microsoft Windows */
++ CRYPTO_w_lock(CRYPTO_LOCK_GAI_STRERROR);
++ reason = (*p_gai_strerror.f)(err);
++ CRYPTO_w_unlock(CRYPTO_LOCK_GAI_STRERROR);
++#else
++ reason = (*p_gai_strerror.f)(err);
++#endif
++ ERR_add_error_data(1, (*p_gai_strerror.f)(err));
++ }
++ return (-1);
++ }
++ return (1);
++ }
++#endif
++ BIOerr(BIO_F_BIO_GETADDRINFO,BIO_R_UNSUPPORTED_METHOD);
++ return (-1);
++ }
++
++void BIO_freeaddrinfo(struct addrinfo *ai)
++ {
++#ifdef EAI_FAMILY
++ static union { void *p;
++ void (WSAAPI *f)(struct addrinfo *);
++ } p_freeaddrinfo = {NULL};
++
++ if ((p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))!=NULL)
++ (*p_freeaddrinfo.f)(ai);
++#endif
++ }
+
+ int BIO_sock_init(void)
+- {
++ {
+ #ifdef OPENSSL_SYS_WINDOWS
+ static struct WSAData wsa_state;
+
+@@ -686,8 +737,9 @@ int BIO_get_accept_socket(char *host, in
+ hint.ai_flags = AI_PASSIVE;
+ if (h)
+ {
+- if (strchr(h,':'))
++ if ((e = strchr(h,':')))
+ {
++ *e = '\0';
+ if (h[1]=='\0') h=NULL;
+ #if OPENSSL_USE_IPV6
+ hint.ai_family = AF_INET6;
+diff -rup openssl-1.0.1c/crypto/bio/bio.h openssl-1.0.1c-working/crypto/bio/bio.h
+--- openssl-1.0.1c/crypto/bio/bio.h 2012-03-06 14:47:26.000000000 +0100
++++ openssl-1.0.1c-working/crypto/bio/bio.h 2012-06-10 00:06:09.000000000 +0200
+@@ -76,6 +76,9 @@
+ # endif
+ #endif
+
++/* under which condition ? */
++#include <netdb.h>
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+@@ -715,6 +718,14 @@ struct hostent *BIO_gethostbyname(const
+ * substructures; if the buffer does not suffice, NULL is returned
+ * and an appropriate error code is set).
+ */
++
++#ifndef EAI_FAMILY
++struct addrinfo { /* dummy interface */ };
++#endif
++
++int BIO_getaddrinfo(const char *hostname, const char *servname,
++ const struct addrinfo *hints, struct addrinfo **res);
++void BIO_freeaddrinfo(struct addrinfo *ai);
+ int BIO_sock_error(int sock);
+ int BIO_socket_ioctl(int fd, long type, void *arg);
+ int BIO_socket_nbio(int fd,int mode);
+@@ -782,6 +793,7 @@ void ERR_load_BIO_strings(void);
+ #define BIO_F_BIO_CALLBACK_CTRL 131
+ #define BIO_F_BIO_CTRL 103
+ #define BIO_F_BIO_GETHOSTBYNAME 120
++#define BIO_F_BIO_GETADDRINFO 133
+ #define BIO_F_BIO_GETS 104
+ #define BIO_F_BIO_GET_ACCEPT_SOCKET 105
+ #define BIO_F_BIO_GET_HOST_IP 106
+diff -rup openssl-1.0.1c/crypto/bio/bio_err.c openssl-1.0.1c-working/crypto/bio/bio_err.c
+--- openssl-1.0.1c/crypto/bio/bio_err.c 2011-12-27 15:37:43.000000000 +0100
++++ openssl-1.0.1c-working/crypto/bio/bio_err.c 2012-06-10 01:27:30.000000000 +0200
+@@ -76,6 +76,7 @@ static ERR_STRING_DATA BIO_str_functs[]=
+ {ERR_FUNC(BIO_F_BIO_CALLBACK_CTRL), "BIO_callback_ctrl"},
+ {ERR_FUNC(BIO_F_BIO_CTRL), "BIO_ctrl"},
+ {ERR_FUNC(BIO_F_BIO_GETHOSTBYNAME), "BIO_gethostbyname"},
++{ERR_FUNC(BIO_F_BIO_GETADDRINFO), "BIO_getaddrinfo"},
+ {ERR_FUNC(BIO_F_BIO_GETS), "BIO_gets"},
+ {ERR_FUNC(BIO_F_BIO_GET_ACCEPT_SOCKET), "BIO_get_accept_socket"},
+ {ERR_FUNC(BIO_F_BIO_GET_HOST_IP), "BIO_get_host_ip"},
+diff -rup openssl-1.0.1c/crypto/crypto.h openssl-1.0.1c-working/crypto/crypto.h
+--- openssl-1.0.1c/crypto/crypto.h 2011-06-01 18:54:03.000000000 +0200
++++ openssl-1.0.1c-working/crypto/crypto.h 2012-06-10 01:01:26.000000000 +0200
+@@ -222,6 +222,7 @@ typedef struct openssl_item_st
+ #define CRYPTO_LOCK_FIPS 39
+ #define CRYPTO_LOCK_FIPS2 40
+ #define CRYPTO_NUM_LOCKS 41
++#define CRYPTO_LOCK_GAI_STRERROR 42
+
+ #define CRYPTO_LOCK 1
+ #define CRYPTO_UNLOCK 2
More information about the svn-soc-all
mailing list