Package: libocamlnet-ssl-ocaml
Version: 2.2.8.1-1
Severity: grave
Tags: patch
Justification: renders package unusable

        Hi !

While playing with the ssl_client.ml example, I ended up correcting two
issues:
* ssl_client.ml must use:
    let cl_ctx = Ssl.create_context Ssl.TLSv1 Ssl.Client_context  in
  to use the correct function from ocaml-ssl
* The example segfaulted..

After some introspection, helped by Sam, we found out that the package
ships its custom ssl extra-bindings.
These are out-of-date and caused the segfault.

Attached is patch that fixes them.


Of course, those bindings may be directly provided by ocaml-ssl, this
would help to get them in sync with latest ocaml-ssl has well as
debugging them along the others...


Romain

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.22-1-amd64 (SMP w/1 CPU core)
Locale: LANG=fr_FR, LC_CTYPE=fr_FR (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash

Versions of packages libocamlnet-ssl-ocaml depends on:
ii  libc6                         2.6.1-6    GNU C Library: Shared libraries
ii  libocamlnet-ocaml             2.2.8.1-1  OCaml application-level Internet l
ii  libssl-ocaml                  0.4.2-3    OCaml bindings for OpenSSL
ii  ocaml-base-nox [ocaml-base-no 3.10.0-8   Runtime system for ocaml bytecode 

libocamlnet-ssl-ocaml recommends no packages.

-- no debconf information
--- ocamlnet-2.2.8.1.orig/src/equeue-ssl/ssl_exts_stubs.c
+++ ocamlnet-2.2.8.1/src/equeue-ssl/ssl_exts_stubs.c
@@ -6,41 +6,29 @@
 #include <caml/memory.h>
 #include <caml/misc.h>
 #include <caml/mlvalues.h>
-
+#include <caml/signals.h>
 #include <openssl/ssl.h>
 #include <openssl/pem.h>
 #include <openssl/err.h>
 #include <openssl/bio.h>
 #include <unistd.h>
 
-
-/* The following definitions are copied from ssl_stubs.c: */
-
-struct ssl_socket__t
-{
-  SSL *handler;
-  int fd;
-};
-
-typedef struct ssl_socket__t ssl_socket_t;
-
-static ssl_socket_t* ssl_socket_of_block(value block)
-{
-  return (ssl_socket_t*)Field(block, 1);
-}
+#define SSL_val(v) (*((SSL**)Data_custom_val(v)))
 
 
 CAMLprim value ocaml_ssl_single_shutdown(value socket)
 {
   CAMLparam1(socket);
   int ret;
-  ssl_socket_t *ssl = ssl_socket_of_block(socket);
 
-  ret = SSL_shutdown(ssl->handler);
+  SSL *ssl = SSL_val(socket);
+  caml_enter_blocking_section();
+  ret = SSL_shutdown(ssl);
   if (ret == -1) {
       raise_with_arg(*caml_named_value("ssl_exn_shutdown_error"), 
-		     Val_int(SSL_get_error(ssl->handler, ret)));
+		     Val_int(SSL_get_error(ssl, ret)));
   };
+  caml_leave_blocking_section();
 
   CAMLreturn(Val_unit);
 }
@@ -52,8 +40,10 @@
   CAMLlocal3(rcvd,sent,ret);
   int r;
   
-  ssl_socket_t *ssl = ssl_socket_of_block(socket);
-  r = SSL_get_shutdown(ssl->handler);
+  SSL *ssl = SSL_val(socket);
+  caml_enter_blocking_section();
+  r = SSL_get_shutdown(ssl);
+  caml_leave_blocking_section();
   rcvd = Val_bool(r & SSL_RECEIVED_SHUTDOWN);
   sent = Val_bool(r & SSL_SENT_SHUTDOWN);
   ret = alloc_tuple(2);
@@ -71,8 +61,10 @@
     BIO *b;
     int eof;
 
-    ssl_socket_t *ssl = ssl_socket_of_block(socket);
-    b = SSL_get_rbio(ssl->handler);
+    SSL *ssl = SSL_val(socket);
+    caml_enter_blocking_section();
+    b = SSL_get_rbio(ssl);
+    caml_leave_blocking_section();
     if (b == NULL) 
 	failwith("Ssl.get_rbio_eof: No rbio found");
     eof = BIO_eof(b);
@@ -87,8 +79,10 @@
     CAMLparam1(socket);
     CAMLlocal1(ret);
     long m;
-    ssl_socket_t *ssl = ssl_socket_of_block(socket);
-    m = SSL_get_mode(ssl->handler);
+    SSL *ssl = SSL_val(socket);
+    caml_enter_blocking_section();
+    m = SSL_get_mode(ssl);
+    caml_leave_blocking_section();
     ret = alloc_tuple(3);
     Store_field(ret, 0, Val_bool(m & SSL_MODE_ENABLE_PARTIAL_WRITE));
     Store_field(ret, 1, Val_bool(m & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER));
@@ -100,12 +94,14 @@
 {
     CAMLparam2(socket,mode);
     long m;
-    ssl_socket_t *ssl = ssl_socket_of_block(socket);
+    SSL *ssl = SSL_val(socket);
     m = 0;
     if (Bool_val(Field(mode, 0))) m |= SSL_MODE_ENABLE_PARTIAL_WRITE;
     if (Bool_val(Field(mode, 1))) m |= SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER;
     if (Bool_val(Field(mode, 2))) m |= SSL_MODE_AUTO_RETRY;
-    SSL_set_mode(ssl->handler, m);
+    caml_enter_blocking_section();
+    SSL_set_mode(ssl, m);
+    caml_leave_blocking_section();
     CAMLreturn(Val_unit);
 }
 

Reply via email to