[ejabberd] Fixed LDAP and more

Peter Lemenkov peter at fedoraproject.org
Thu Aug 26 19:36:12 UTC 2010


commit debe20658df7108b6cb55885ecd8f0d9cebc36c4
Author: Peter Lemenkov <lemenkov at gmail.com>
Date:   Thu Aug 26 23:35:56 2010 +0400

    Fixed LDAP and more
    
    Signed-off-by: Peter Lemenkov <lemenkov at gmail.com>

 ejabberd-0010-Fix-http-poll.patch                  |   28 ----
 ....1-driver-explicitly-to-avoid-races-in-LD.patch |   25 +++
 ...ml.c-correctly-compiles-on-R14A-EJAB-1288.patch |  157 ++++++++++++++++++++
 ejabberd-0012-fixes-typo-for-table-copy.patch      |   25 +++
 ...d-0013-fixes-ampersand-escaping-EJAB-1258.patch |   26 ++++
 ...-poll-for-correctly-parsing-binary-thanks.patch |   31 ++++
 ejabberd.spec                                      |   27 +++-
 7 files changed, 287 insertions(+), 32 deletions(-)
---
diff --git a/ejabberd-0010-Loading-ASN.1-driver-explicitly-to-avoid-races-in-LD.patch b/ejabberd-0010-Loading-ASN.1-driver-explicitly-to-avoid-races-in-LD.patch
new file mode 100644
index 0000000..e989690
--- /dev/null
+++ b/ejabberd-0010-Loading-ASN.1-driver-explicitly-to-avoid-races-in-LD.patch
@@ -0,0 +1,25 @@
+From c9ff37027805d1d72446b5bcbc1a60da0f2aaae4 Mon Sep 17 00:00:00 2001
+From: Evgeniy Khramtsov <ekhramtsov at process-one.net>
+Date: Wed, 4 Aug 2010 19:23:52 +1000
+Subject: [PATCH 01/11] Loading ASN.1 driver explicitly to avoid races in LDAP (EJAB-1284)
+
+---
+ src/ejabberd_app.erl |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
+index 97ae7fe..2227904 100644
+--- a/src/ejabberd_app.erl
++++ b/src/ejabberd_app.erl
+@@ -57,6 +57,8 @@ start(normal, _Args) ->
+     ejabberd_config:start(),
+     ejabberd_check:config(),
+     connect_nodes(),
++    %% Loading ASN.1 driver explicitly to avoid races in LDAP
++    catch asn1rt:load_driver(),
+     Sup = ejabberd_sup:start_link(),
+     ejabberd_rdbms:start(),
+     ejabberd_auth:start(),
+-- 
+1.7.2.1
+
diff --git a/ejabberd-0011-Make-xml.c-correctly-compiles-on-R14A-EJAB-1288.patch b/ejabberd-0011-Make-xml.c-correctly-compiles-on-R14A-EJAB-1288.patch
new file mode 100644
index 0000000..c181016
--- /dev/null
+++ b/ejabberd-0011-Make-xml.c-correctly-compiles-on-R14A-EJAB-1288.patch
@@ -0,0 +1,157 @@
+From 1ea09b09a227d1e630d9dde3db68d46b0cb44f55 Mon Sep 17 00:00:00 2001
+From: Evgeniy Khramtsov <ekhramtsov at process-one.net>
+Date: Sat, 7 Aug 2010 21:06:50 +1000
+Subject: [PATCH 04/11] Make xml.c correctly compiles on R14A (EJAB-1288)
+
+---
+ src/Makefile.in |    1 +
+ src/xml.c       |   60 ++++++++++++++++++++++++++++++++++++++++--------------
+ 2 files changed, 45 insertions(+), 16 deletions(-)
+
+diff --git a/src/Makefile.in b/src/Makefile.in
+index cf600c3..7d225f3 100644
+--- a/src/Makefile.in
++++ b/src/Makefile.in
+@@ -31,6 +31,7 @@ else
+ endif
+ 
+ EFLAGS += @ERLANG_SSLVER@ -pa .
++ERLANG_CFLAGS += @ERLANG_SSLVER@
+ 
+ # make debug=true to compile Erlang module with debug informations.
+ ifdef debug
+diff --git a/src/xml.c b/src/xml.c
+index d1b2b7f..e363fed 100644
+--- a/src/xml.c
++++ b/src/xml.c
+@@ -2,6 +2,23 @@
+ #include <string.h>
+ #include <stdio.h>
+ 
++#ifdef SSL40
++#define ENIF_ALLOC(SIZE) enif_alloc(SIZE)
++#define ENIF_FREE(PTR) enif_free(PTR)
++#define ENIF_REALLOC(PTR, SIZE) enif_realloc(PTR, SIZE)
++#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(SIZE, BIN)
++#define ENIF_COMPARE(TERM1, TERM2) enif_compare(TERM1, TERM2)
++#else
++#define ENIF_ALLOC(SIZE) enif_alloc(env, SIZE)
++#define ENIF_FREE(PTR) enif_free(env, PTR)
++#define ENIF_REALLOC(PTR, SIZE) enif_realloc(env, PTR, SIZE)
++#define ENIF_ALLOC_BINARY(SIZE, BIN) enif_alloc_binary(env, SIZE, BIN)
++#define ENIF_COMPARE(TERM1, TERM2) enif_compare(env, TERM1, TERM2)
++#endif
++
++static ERL_NIF_TERM atom_xmlelement;
++static ERL_NIF_TERM atom_xmlcdata;
++
+ struct buf {
+   int limit;
+   int len;
+@@ -10,12 +27,19 @@ struct buf {
+ 
+ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el);
+ 
++static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info)
++{
++  atom_xmlelement = enif_make_atom(env, "xmlelement");
++  atom_xmlcdata = enif_make_atom(env, "xmlcdata");
++  return 0;
++}
++
+ static struct buf *init_buf(ErlNifEnv* env)
+ {
+-  struct buf *rbuf = enif_alloc(env, sizeof(struct buf));
++  struct buf *rbuf = ENIF_ALLOC(sizeof(struct buf));
+   rbuf->limit = 1024;
+   rbuf->len = 0;
+-  rbuf->b = enif_alloc(env, rbuf->limit);
++  rbuf->b = ENIF_ALLOC(rbuf->limit);
+   return rbuf;
+ }
+ 
+@@ -23,9 +47,9 @@ static void destroy_buf(ErlNifEnv* env, struct buf *rbuf)
+ {
+   if (rbuf) {
+     if (rbuf->b) {
+-      enif_free(env, rbuf->b);
++      ENIF_FREE(rbuf->b);
+     };
+-    enif_free(env, rbuf);
++    ENIF_FREE(rbuf);
+   };
+ }
+ 
+@@ -35,7 +59,7 @@ inline void resize_buf(ErlNifEnv* env, struct buf *rbuf, int len_to_add)
+   
+   if (new_len >= rbuf->limit) {
+     rbuf->limit = ((new_len / 1024) + 1) * 1024;
+-    rbuf->b = enif_realloc(env, rbuf->b, rbuf->limit);
++    rbuf->b = ENIF_REALLOC(rbuf->b, rbuf->limit);
+   };
+ }
+ 
+@@ -141,7 +165,7 @@ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el)
+ 
+   if (enif_get_tuple(env, el, &arity, &tuple)) {
+     if (arity == 2) {
+-      if (!enif_compare(env, tuple[0], enif_make_atom(env, "xmlcdata"))) {
++      if (!ENIF_COMPARE(tuple[0], atom_xmlcdata)) {
+ 	if (enif_inspect_iolist_as_binary(env, tuple[1], &cdata)) {
+ 	  crypt(env, rbuf, cdata.data, cdata.size);
+ 	  ret = 1;
+@@ -149,7 +173,7 @@ static int make_element(ErlNifEnv* env, struct buf *rbuf, ERL_NIF_TERM el)
+       };
+     };
+     if (arity == 4) {
+-      if (!enif_compare(env, tuple[0], enif_make_atom(env, "xmlelement"))) {
++      if (!ENIF_COMPARE(tuple[0], atom_xmlelement)) {
+ 	if (enif_inspect_iolist_as_binary(env, tuple[1], &name)) {
+ 	  buf_add_char(env, rbuf, '<');
+ 	  buf_add_str(env, rbuf, (char *)name.data, name.size);
+@@ -192,7 +216,7 @@ static ERL_NIF_TERM element_to(ErlNifEnv* env, int argc,
+ 	destroy_buf(env, rbuf);
+ 	return result;
+       }	else {
+-	if (enif_alloc_binary(env, rbuf->len, &output)) {
++	if (ENIF_ALLOC_BINARY(rbuf->len, &output)) {
+ 	  memcpy(output.data, rbuf->b, rbuf->len);
+ 	  result = enif_make_binary(env, &output);
+ 	  destroy_buf(env, rbuf);
+@@ -206,11 +230,13 @@ static ERL_NIF_TERM element_to(ErlNifEnv* env, int argc,
+   return enif_make_badarg(env);
+ }
+ 
+-/* static ERL_NIF_TERM element_to_string(ErlNifEnv* env, int argc, */
+-/* 				      const ERL_NIF_TERM argv[]) */
+-/* { */
+-/*   return element_to(env, argc, argv, 1); */
+-/* } */
++#ifdef SSL40
++static ERL_NIF_TERM element_to_string(ErlNifEnv* env, int argc,
++				      const ERL_NIF_TERM argv[])
++{
++  return element_to(env, argc, argv, 1);
++}
++#endif
+ 
+ static ERL_NIF_TERM element_to_binary(ErlNifEnv* env, int argc,
+ 				      const ERL_NIF_TERM argv[])
+@@ -222,9 +248,11 @@ static ErlNifFunc nif_funcs[] =
+   {
+     /* Stupid Erlang bug with enif_make_string() is fixed
+        in R14A only (OTP-8685), so we can't use
+-       element_to_string yet.*/
+-    /* {"element_to_string", 1, element_to_string}, */
++       element_to_string in Erlang < R14A.*/
++#ifdef SSL40
++    {"element_to_string", 1, element_to_string},
++#endif
+     {"element_to_binary", 1, element_to_binary}
+   };
+ 
+-ERL_NIF_INIT(xml, nif_funcs, NULL, NULL, NULL, NULL)
++ERL_NIF_INIT(xml, nif_funcs, load, NULL, NULL, NULL)
+-- 
+1.7.2.1
+
diff --git a/ejabberd-0012-fixes-typo-for-table-copy.patch b/ejabberd-0012-fixes-typo-for-table-copy.patch
new file mode 100644
index 0000000..ac62cc5
--- /dev/null
+++ b/ejabberd-0012-fixes-typo-for-table-copy.patch
@@ -0,0 +1,25 @@
+From f8dd973373a139b9857720dcb4405509e5e4fc76 Mon Sep 17 00:00:00 2001
+From: Evgeniy Khramtsov <ekhramtsov at process-one.net>
+Date: Tue, 10 Aug 2010 19:42:22 +1000
+Subject: [PATCH 08/11] fixes typo for table copy
+
+---
+ src/odbc/ejabberd_odbc_sup.erl |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/odbc/ejabberd_odbc_sup.erl b/src/odbc/ejabberd_odbc_sup.erl
+index 45ede18..8fb6e25 100644
+--- a/src/odbc/ejabberd_odbc_sup.erl
++++ b/src/odbc/ejabberd_odbc_sup.erl
+@@ -54,7 +54,7 @@ start_link(Host) ->
+ 			 {type, bag},
+ 			 {local_content, true},
+ 			 {attributes, record_info(fields, sql_pool)}]),
+-    mnesia:add_table_copy(local_config, node(), ram_copies),
++    mnesia:add_table_copy(sql_pool, node(), ram_copies),
+     F = fun() ->
+ 		mnesia:delete({sql_pool, Host})
+ 	end,
+-- 
+1.7.2.1
+
diff --git a/ejabberd-0013-fixes-ampersand-escaping-EJAB-1258.patch b/ejabberd-0013-fixes-ampersand-escaping-EJAB-1258.patch
new file mode 100644
index 0000000..2db4aba
--- /dev/null
+++ b/ejabberd-0013-fixes-ampersand-escaping-EJAB-1258.patch
@@ -0,0 +1,26 @@
+From 3024bb0cbf359f3e14b5386ed14ecfb168e8a267 Mon Sep 17 00:00:00 2001
+From: Evgeniy Khramtsov <ekhramtsov at process-one.net>
+Date: Thu, 19 Aug 2010 16:28:31 +1000
+Subject: [PATCH 09/11] fixes ampersand escaping (EJAB-1258)
+
+---
+ src/eldap/eldap_filter.erl |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/eldap/eldap_filter.erl b/src/eldap/eldap_filter.erl
+index 51dac5e..341fba1 100644
+--- a/src/eldap/eldap_filter.erl
++++ b/src/eldap/eldap_filter.erl
+@@ -171,7 +171,7 @@ do_sub(S, {RegExp, New, Times}, Iter) ->
+     end.
+ 
+ replace_amps(String) ->
+-    lists:map(
++    lists:flatmap(
+       fun($&) -> "\\&";
+-	 (Chr) -> Chr
++	 (Chr) -> [Chr]
+       end, String).
+-- 
+1.7.2.1
+
diff --git a/ejabberd-0014-Bugfix-http-poll-for-correctly-parsing-binary-thanks.patch b/ejabberd-0014-Bugfix-http-poll-for-correctly-parsing-binary-thanks.patch
new file mode 100644
index 0000000..6fa5aa8
--- /dev/null
+++ b/ejabberd-0014-Bugfix-http-poll-for-correctly-parsing-binary-thanks.patch
@@ -0,0 +1,31 @@
+From d87fff1a4c500d9abe3945cbfea792b4eddfa3f2 Mon Sep 17 00:00:00 2001
+From: Badlop <badlop at process-one.net>
+Date: Thu, 19 Aug 2010 17:37:21 +0200
+Subject: [PATCH 10/11] Bugfix http-poll for correctly parsing binary (thanks to Peter Lemenkov)
+
+---
+ src/web/ejabberd_http_poll.erl |    8 +++++++-
+ 1 files changed, 7 insertions(+), 1 deletions(-)
+
+diff --git a/src/web/ejabberd_http_poll.erl b/src/web/ejabberd_http_poll.erl
+index 0bdbc62..faa0f3c 100644
+--- a/src/web/ejabberd_http_poll.erl
++++ b/src/web/ejabberd_http_poll.erl
+@@ -272,7 +272,13 @@ handle_event(_Event, StateName, StateData) ->
+ %%          {stop, Reason, Reply, NewStateData}                    
+ %%----------------------------------------------------------------------
+ handle_sync_event({send, Packet}, _From, StateName, StateData) ->
+-    Output = StateData#state.output ++ [lists:flatten(Packet)],
++    Packet2 = if
++		  is_binary(Packet) ->
++		      binary_to_list(Packet);
++		  true ->
++		      Packet
++	      end,
++    Output = StateData#state.output ++ [lists:flatten(Packet2)],
+     Reply = ok,
+     {reply, Reply, StateName, StateData#state{output = Output}};
+ 
+-- 
+1.7.2.1
+
diff --git a/ejabberd.spec b/ejabberd.spec
index 6c58f7c..9efb71a 100644
--- a/ejabberd.spec
+++ b/ejabberd.spec
@@ -11,7 +11,7 @@
 
 Name:           ejabberd
 Version:        2.1.5
-Release:        4%{?dist}
+Release:        6%{?dist}
 Summary:        A distributed, fault-tolerant Jabber/XMPP server
 
 Group:          Applications/Internet
@@ -56,8 +56,16 @@ Patch7:	ejabberd-0007-Install-.so-objects-with-0755-permissions.patch
 Patch8: ejabberd-0008-Use-versioned-directory-for-storing-docs.patch
 # Backported from upstream
 Patch9: ejabberd-0009-Support-SASL-GSSAPI-authentication-thanks-to-Mikael-.patch
-# Will be proposed for inclusion into upstream
-Patch10: ejabberd-0010-Fix-http-poll.patch
+# Backported from upstream
+Patch10: ejabberd-0010-Loading-ASN.1-driver-explicitly-to-avoid-races-in-LD.patch
+# Backported from upstream
+Patch11: ejabberd-0011-Make-xml.c-correctly-compiles-on-R14A-EJAB-1288.patch
+# Backported from upstream
+Patch12: ejabberd-0012-fixes-typo-for-table-copy.patch
+# Backported from upstream
+Patch13: ejabberd-0013-fixes-ampersand-escaping-EJAB-1258.patch
+# Backported from upstream
+Patch14: ejabberd-0014-Bugfix-http-poll-for-correctly-parsing-binary-thanks.patch
 
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -123,7 +131,11 @@ Documentation for ejabberd.
 %patch7 -p1 -b .fix_perms
 %patch8 -p1 -b .versioned_docdir
 %patch9 -p1 -b .gssapi
-%patch10 -p1 -b .http-poll
+%patch10 -p1 -b .load_asn1
+%patch11 -p1 -b .R14A
+%patch12 -p1 -b .typo
+%patch13 -p1 -b .ldap_ampersand_escaping
+%patch14 -p1 -b .http-poll
 
 cp %{S:4} src
 cp %{S:5} src
@@ -354,6 +366,13 @@ rm -rf %{buildroot}
 %doc %{_docdir}/%{name}-%{version}/*.txt
 
 %changelog
+* Thu Aug 26 2010 Peter Lemenkov <lemenkov at gmail.com> 2.1.5-6
+- More patches from trunk
+- Rebased patches
+
+* Thu Aug 26 2010 Peter Lemenkov <lemenkov at gmail.com> 2.1.5-5
+- Backported %%patch11 from upstream (fixes LDAP)
+
 * Wed Aug 18 2010 Peter Lemenkov <lemenkov at gmail.com> 2.1.5-4
 - Add accidentally forgotten changes to ejabberd.logrotate
 


More information about the scm-commits mailing list