Submitted by:            DJ Lucas (dj_AT_linuxfromscratch_DOT_org)
Date:                    2017-05-27
Initial Package Version: 2.10.11
Upstream Status:         Submitted
Origin:                  https://git.archlinux.org/svntogit/packages.git/plain/trunk/openssl-1.1.0.patch?h=packages/ptlib
Description:             Fixes build with OpenSSL-1.1.0.


diff -Naurp ptlib-2.10.11-orig/src/ptclib/pssl.cxx ptlib-2.10.11/src/ptclib/pssl.cxx
--- ptlib-2.10.11-orig/src/ptclib/pssl.cxx	2017-05-27 14:10:00.609612786 -0500
+++ ptlib-2.10.11/src/ptclib/pssl.cxx	2017-05-27 14:11:20.232842073 -0500
@@ -140,7 +140,7 @@ PFACTORY_CREATE_SINGLETON(PProcessStartu
 class PSSL_BIO
 {
   public:
-    PSSL_BIO(BIO_METHOD *method = BIO_s_file_internal())
+    PSSL_BIO(const BIO_METHOD *method = BIO_s_file())
       { bio = BIO_new(method); }
 
     ~PSSL_BIO()
@@ -627,9 +627,10 @@ PSSLDiffieHellman::PSSLDiffieHellman(con
   if (dh == NULL)
     return;
 
-  dh->p = BN_bin2bn(pData, pSize, NULL);
-  dh->g = BN_bin2bn(gData, gSize, NULL);
-  if (dh->p != NULL && dh->g != NULL)
+  BIGNUM *p = BN_bin2bn(pData, pSize, NULL);
+  BIGNUM *g = BN_bin2bn(gData, gSize, NULL);
+  DH_set0_pqg(dh, p, NULL, g);
+  if (p != NULL && p != NULL)
     return;
 
   DH_free(dh);
@@ -805,13 +806,11 @@ void PSSLContext::Construct(Method metho
   SSL_METHOD * meth;
 
   switch (method) {
-    case SSLv3:
-      meth = SSLv3_method();
-      break;
     case TLSv1:
       meth = TLSv1_method(); 
       break;
     case SSLv23:
+    case SSLv3:
     default:
       meth = SSLv23_method();
       break;
@@ -1117,7 +1116,7 @@ PBoolean PSSLChannel::RawSSLRead(void *
 //
 
 
-#define PSSLCHANNEL(bio)      ((PSSLChannel *)(bio->ptr))
+#define PSSLCHANNEL(bio)      ((PSSLChannel *)BIO_get_data(bio))
 
 extern "C" {
 
@@ -1130,10 +1129,9 @@ typedef long (*lfptr)();
 
 static int Psock_new(BIO * bio)
 {
-  bio->init     = 0;
-  bio->num      = 0;
-  bio->ptr      = NULL;    // this is really (PSSLChannel *)
-  bio->flags    = 0;
+  BIO_set_init(bio, 0);
+  BIO_set_data(bio, NULL);
+  BIO_clear_flags(bio, ~0);
 
   return(1);
 }
@@ -1144,13 +1142,13 @@ static int Psock_free(BIO * bio)
   if (bio == NULL)
     return 0;
 
-  if (bio->shutdown) {
-    if (bio->init) {
+  if (BIO_get_shutdown(bio)) {
+    if (BIO_get_init(bio)) {
       PSSLCHANNEL(bio)->Shutdown(PSocket::ShutdownReadAndWrite);
       PSSLCHANNEL(bio)->Close();
     }
-    bio->init  = 0;
-    bio->flags = 0;
+    BIO_set_init(bio, 0);
+    BIO_clear_flags(bio, ~0);
   }
   return 1;
 }
@@ -1160,11 +1158,11 @@ static long Psock_ctrl(BIO * bio, int cm
 {
   switch (cmd) {
     case BIO_CTRL_SET_CLOSE:
-      bio->shutdown = (int)num;
+      BIO_set_shutdown(bio, (int)num);
       return 1;
 
     case BIO_CTRL_GET_CLOSE:
-      return bio->shutdown;
+      return BIO_get_shutdown(bio);
 
     case BIO_CTRL_FLUSH:
       return 1;
@@ -1239,7 +1237,8 @@ static int Psock_puts(BIO * bio, const c
 };
 
 
-static BIO_METHOD methods_Psock =
+static BIO_METHOD *methods_Psock = NULL;
+/*
 {
   BIO_TYPE_SOCKET,
   "PTLib-PSSLChannel",
@@ -1261,19 +1260,33 @@ static BIO_METHOD methods_Psock =
   Psock_free
 #endif
 };
-
+*/
 
 PBoolean PSSLChannel::OnOpen()
 {
-  BIO * bio = BIO_new(&methods_Psock);
+  if (methods_Psock == NULL) {
+    methods_Psock = BIO_meth_new(BIO_TYPE_SOCKET | BIO_get_new_index(), "PTLib-PSSLChannel");
+    if (methods_Psock == NULL ||
+        BIO_meth_set_write(methods_Psock, Psock_write) ||
+	BIO_meth_set_read(methods_Psock, Psock_read) ||
+	BIO_meth_set_puts(methods_Psock, Psock_puts) ||
+	BIO_meth_set_gets(methods_Psock, NULL) ||
+	BIO_meth_set_ctrl(methods_Psock, Psock_ctrl) ||
+	BIO_meth_set_create(methods_Psock, Psock_new) ||
+	BIO_meth_set_destroy(methods_Psock, Psock_free)) {
+      SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
+      return PFalse;
+    }
+  }
+  BIO * bio = BIO_new(methods_Psock);
   if (bio == NULL) {
     SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
     return PFalse;
   }
 
   // "Open" then bio
-  bio->ptr  = this;
-  bio->init = 1;
+  BIO_set_data(bio, this);
+  BIO_set_init(bio, 1);
 
   SSL_set_bio(ssl, bio, bio);
   return PTrue;
