[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Thu Jul 9 01:49:04 UTC 2015


The branch, master has been updated
       via  6cff239 docs: Correct list of supported socket options
       via  595fbbd tdb: Reproducer for Bug 11381
       via  1061a9c tdb: Fix bug 11381, deadlock
       via  be9c4f9 librpc: Fix a "ignoring asprint return" warning
       via  4e935c5 Fix format size errors for i386 in source3/librpc/crypto/gse.c
       via  9658112 Fix ldap_bind compilation for i386
       via  3e35e0d Fix gensec_gssapi compilation for i386
      from  7447abc s4:torture/rpc: extend and improve rpc.lsa.trusted.domains

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6cff239a1e00dadc37d6b72706b3ee529b999c0d
Author: Uri Simchoni <urisimchoni at gmail.com>
Date:   Wed Jun 24 13:09:24 2015 +0300

    docs: Correct list of supported socket options
    
    Bring the list of supported socket options in smb.conf in sync
    with the code
    
    Signed-off-by: Uri Simchoni <urisimchoni at gmail.com>
    Reviewed-by: Volker Lendecke <Volker.Lendecke at SerNet.DE>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Thu Jul  9 03:48:13 CEST 2015 on sn-devel-104

commit 595fbbd85de84bae47aa54639a4cd15d3fba1b08
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jul 6 10:49:47 2015 +0200

    tdb: Reproducer for Bug 11381
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=11381
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 1061a9cafda7d73ebcd2f74e69e74f4adc485d5d
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jul 6 13:13:36 2015 +0200

    tdb: Fix bug 11381, deadlock
    
    This fixes a deadlock in tdb that is a bad interaction between tdb_lockall
    and tdb_traverse. This deadlock condition has been around even before
    tdb mutexes, it's just that the kernel fcntl EDEADLK detection protected
    us from this ABBA lock condition to become a real deadlock stalling
    processes. With tdb mutexes, this deadlock protection is gone, so we do
    lock dead.
    
    This patch glosses over this particular ABBA condition, making tdb with
    mutexes behave the same as tdb without mutexes. Admittedly this is no
    real fix, but it works around a real user's problem.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=11381
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit be9c4f90331a244c50543d080db769a94e01d77b
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jul 7 15:36:07 2015 +0200

    librpc: Fix a "ignoring asprint return" warning
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4e935c59518f32ed02308e772ac1e8d8eec16bcd
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jun 26 16:01:10 2015 +1200

    Fix format size errors for i386 in source3/librpc/crypto/gse.c
    
    Again, sizeof(size_t) != sizeof(uintmax_t).
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 9658112e104f7c31a3caaea3ce69c52d88cc40a1
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jun 26 15:25:55 2015 +1200

    Fix ldap_bind compilation for i386
    
    More size_t != uintmax_t issues:
    
    ../source4/libcli/ldap/ldap_bind.c: In function ‘ldap_bind_sasl’:
    ../source4/libcli/ldap/ldap_bind.c:237:3: error: format ‘%ju’ expects argument of type ‘uintmax_t’, but argument 2 has type ‘size_t’ [-Werror=format=]
    
       DEBUG(1, ("SASL bind triggered with non empty send_queue[%ju]: %s\n",
          ^
          cc1: all warnings being treated as errors
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 3e35e0d6f8c21bd24fb19e4abc30965b9fb6742d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Jun 26 15:05:48 2015 +1200

    Fix gensec_gssapi compilation for i386
    
    Fixes this:
    
    ../source4/auth/gensec/gensec_gssapi.c:1017:3: error: format ‘%ju’ expects argument of type ‘uintmax_t’, but argument 3 has type ‘size_t’ [-Werror=format=]
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/tuning/socketoptions.xml   |  12 ++
 lib/tdb/common/traverse.c                      |  14 +-
 lib/tdb/test/run-allrecord-traverse-deadlock.c | 203 +++++++++++++++++++++++++
 lib/tdb/wscript                                |   1 +
 source3/librpc/crypto/gse.c                    |  14 +-
 source4/auth/gensec/gensec_gssapi.c            |  14 +-
 source4/libcli/ldap/ldap_bind.c                |   2 +-
 source4/librpc/rpc/dcerpc.c                    |  10 +-
 8 files changed, 250 insertions(+), 20 deletions(-)
 create mode 100644 lib/tdb/test/run-allrecord-traverse-deadlock.c


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/tuning/socketoptions.xml b/docs-xml/smbdotconf/tuning/socketoptions.xml
index d02f323..fd61163 100644
--- a/docs-xml/smbdotconf/tuning/socketoptions.xml
+++ b/docs-xml/smbdotconf/tuning/socketoptions.xml
@@ -54,12 +54,24 @@
     	<listitem><para>SO_REUSEADDR</para></listitem>
     	<listitem><para>SO_BROADCAST</para></listitem>
     	<listitem><para>TCP_NODELAY</para></listitem>
+	<listitem><para>TCP_KEEPCNT *</para></listitem>
+	<listitem><para>TCP_KEEPIDLE *</para></listitem>
+	<listitem><para>TCP_KEEPINTVL *</para></listitem>
     	<listitem><para>IPTOS_LOWDELAY</para></listitem>
     	<listitem><para>IPTOS_THROUGHPUT</para></listitem>
+	<listitem><para>SO_REUSEPORT</para></listitem>
     	<listitem><para>SO_SNDBUF *</para></listitem>
     	<listitem><para>SO_RCVBUF *</para></listitem>
     	<listitem><para>SO_SNDLOWAT *</para></listitem>
     	<listitem><para>SO_RCVLOWAT *</para></listitem>
+	<listitem><para>SO_SNDTIMEO *</para></listitem>
+	<listitem><para>SO_RCVTIMEO *</para></listitem>
+	<listitem><para>TCP_FASTACK *</para></listitem>
+	<listitem><para>TCP_QUICKACK</para></listitem>
+	<listitem><para>TCP_NODELAYACK</para></listitem>
+	<listitem><para>TCP_KEEPALIVE_THRESHOLD *</para></listitem>
+	<listitem><para>TCP_KEEPALIVE_ABORT_THRESHOLD *</para></listitem>
+	<listitem><para>TCP_DEFER_ACCEPT *</para></listitem>
     </itemizedlist>
 
     <para>Those marked with a <emphasis>'*'</emphasis> take an integer 
diff --git a/lib/tdb/common/traverse.c b/lib/tdb/common/traverse.c
index 618670f..e18e3c3 100644
--- a/lib/tdb/common/traverse.c
+++ b/lib/tdb/common/traverse.c
@@ -245,13 +245,25 @@ _PUBLIC_ int tdb_traverse(struct tdb_context *tdb,
 		 tdb_traverse_func fn, void *private_data)
 {
 	struct tdb_traverse_lock tl = { NULL, 0, 0, F_WRLCK };
+	enum tdb_lock_flags lock_flags;
 	int ret;
 
 	if (tdb->read_only || tdb->traverse_read) {
 		return tdb_traverse_read(tdb, fn, private_data);
 	}
 
-	if (tdb_transaction_lock(tdb, F_WRLCK, TDB_LOCK_WAIT)) {
+	lock_flags = TDB_LOCK_WAIT;
+
+	if (tdb->allrecord_lock.count != 0) {
+		/*
+		 * This avoids a deadlock between tdb_lockall() and
+		 * tdb_traverse(). See
+		 * https://bugzilla.samba.org/show_bug.cgi?id=11381
+		 */
+		lock_flags = TDB_LOCK_NOWAIT;
+	}
+
+	if (tdb_transaction_lock(tdb, F_WRLCK, lock_flags)) {
 		return -1;
 	}
 
diff --git a/lib/tdb/test/run-allrecord-traverse-deadlock.c b/lib/tdb/test/run-allrecord-traverse-deadlock.c
new file mode 100644
index 0000000..2c58206
--- /dev/null
+++ b/lib/tdb/test/run-allrecord-traverse-deadlock.c
@@ -0,0 +1,203 @@
+#include "../common/tdb_private.h"
+#include "../common/io.c"
+#include "../common/tdb.c"
+#include "../common/lock.c"
+#include "../common/freelist.c"
+#include "../common/traverse.c"
+#include "../common/transaction.c"
+#include "../common/error.c"
+#include "../common/open.c"
+#include "../common/check.c"
+#include "../common/hash.c"
+#include "../common/mutex.c"
+#include "tap-interface.h"
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdarg.h>
+#include "logging.h"
+
+static void do_allrecord_lock(const char *name, int tdb_flags, int up,
+			      int down)
+{
+	struct tdb_context *tdb;
+	int ret;
+	ssize_t nread, nwritten;
+	char c = 0;
+
+	tdb = tdb_open_ex(name, 3, tdb_flags,
+			  O_RDWR|O_CREAT, 0755, &taplogctx, NULL);
+	ok(tdb, "tdb_open_ex should succeed");
+
+	ret = tdb_lockall(tdb);
+	ok(ret == 0, "tdb_lockall should succeed");
+
+	nwritten = write(up, &c, sizeof(c));
+	ok(nwritten == sizeof(c), "write should succeed");
+
+	nread = read(down, &c, sizeof(c));
+	ok(nread == sizeof(c), "read should succeed");
+
+	ret = tdb_traverse(tdb, NULL, NULL);
+	ok(ret == -1, "do_allrecord_lock: traverse should fail");
+
+	nwritten = write(up, &c, sizeof(c));
+	ok(nwritten == sizeof(c), "write should succeed");
+
+	exit(0);
+}
+
+static void do_traverse(const char *name, int tdb_flags, int up, int down)
+{
+	struct tdb_context *tdb;
+	int ret;
+	ssize_t nread, nwritten;
+	char c = 0;
+
+	tdb = tdb_open_ex(name, 3, tdb_flags,
+			  O_RDWR|O_CREAT, 0755, &taplogctx, NULL);
+	ok(tdb, "tdb_open_ex should succeed");
+
+	ret = tdb_traverse(tdb, NULL, NULL);
+	ok(ret == 1, "do_traverse: tdb_traverse should return 1 record");
+
+	nwritten = write(up, &c, sizeof(c));
+	ok(nwritten == sizeof(c), "write should succeed");
+
+	nread = read(down, &c, sizeof(c));
+	ok(nread == sizeof(c), "read should succeed");
+
+	exit(0);
+}
+
+/*
+ * Process 1: get the allrecord_lock on a tdb.
+ * Process 2: start a traverse, this will stall waiting for the
+ *            first chainlock: That is taken by the allrecord_lock
+ * Process 1: start a traverse: This will get EDEADLK in trying to
+ *            get the TRANSACTION_LOCK. It will deadlock for mutexes,
+ *            which don't have built-in deadlock detection.
+ */
+
+static int do_tests(const char *name, int tdb_flags)
+{
+	struct tdb_context *tdb;
+	int ret;
+	pid_t traverse_child, allrecord_child;
+	int traverse_down[2];
+	int traverse_up[2];
+	int allrecord_down[2];
+	int allrecord_up[2];
+	char c;
+	ssize_t nread, nwritten;
+	TDB_DATA key, data;
+
+	key.dsize = strlen("hi");
+	key.dptr = discard_const_p(uint8_t, "hi");
+	data.dsize = strlen("world");
+	data.dptr = discard_const_p(uint8_t, "world");
+
+	tdb = tdb_open_ex(name, 3, tdb_flags,
+			  O_RDWR|O_CREAT, 0755, &taplogctx, NULL);
+	ok(tdb, "tdb_open_ex should succeed");
+
+	ret = tdb_store(tdb, key, data, TDB_INSERT);
+	ok(ret == 0, "tdb_store should succeed");
+
+	ret = pipe(traverse_down);
+	ok(ret == 0, "pipe should succeed");
+
+	ret = pipe(traverse_up);
+	ok(ret == 0, "pipe should succeed");
+
+	ret = pipe(allrecord_down);
+	ok(ret == 0, "pipe should succeed");
+
+	ret = pipe(allrecord_up);
+	ok(ret == 0, "pipe should succeed");
+
+	allrecord_child = fork();
+	ok(allrecord_child != -1, "fork should succeed");
+
+	if (allrecord_child == 0) {
+		tdb_close(tdb);
+		close(traverse_up[0]);
+		close(traverse_up[1]);
+		close(traverse_down[0]);
+		close(traverse_down[1]);
+		close(allrecord_up[0]);
+		close(allrecord_down[1]);
+		do_allrecord_lock(name, tdb_flags,
+				  allrecord_up[1], allrecord_down[0]);
+		exit(0);
+	}
+	close(allrecord_up[1]);
+	close(allrecord_down[0]);
+
+	nread = read(allrecord_up[0], &c, sizeof(c));
+	ok(nread == sizeof(c), "read should succeed");
+
+	traverse_child = fork();
+	ok(traverse_child != -1, "fork should succeed");
+
+	if (traverse_child == 0) {
+		tdb_close(tdb);
+		close(traverse_up[0]);
+		close(traverse_down[1]);
+		close(allrecord_up[0]);
+		close(allrecord_down[1]);
+		do_traverse(name, tdb_flags,
+			    traverse_up[1], traverse_down[0]);
+		exit(0);
+	}
+	close(traverse_up[1]);
+	close(traverse_down[0]);
+
+	poll(NULL, 0, 1000);
+
+	nwritten = write(allrecord_down[1], &c, sizeof(c));
+	ok(nwritten == sizeof(c), "write should succeed");
+
+	nread = read(traverse_up[0], &c, sizeof(c));
+	ok(nread == sizeof(c), "read should succeed");
+
+	nwritten = write(traverse_down[1], &c, sizeof(c));
+	ok(nwritten == sizeof(c), "write should succeed");
+
+	nread = read(allrecord_up[0], &c, sizeof(c));
+	ok(nread == sizeof(c), "ret should succeed");
+
+	close(traverse_up[0]);
+	close(traverse_down[1]);
+	close(allrecord_up[0]);
+	close(allrecord_down[1]);
+	diag("%s tests done", name);
+	return exit_status();
+}
+
+int main(int argc, char *argv[])
+{
+	int ret;
+	bool mutex_support;
+
+	mutex_support = tdb_runtime_check_for_robust_mutexes();
+
+	ret = do_tests("marklock-deadlock-fcntl.tdb",
+		       TDB_CLEAR_IF_FIRST |
+		       TDB_INCOMPATIBLE_HASH);
+	ok(ret == 0, "marklock-deadlock-fcntl.tdb tests should succeed");
+
+	if (!mutex_support) {
+		skip(1, "No robust mutex support, "
+			"skipping marklock-deadlock-mutex.tdb tests");
+		return exit_status();
+	}
+
+	ret = do_tests("marklock-deadlock-mutex.tdb",
+		       TDB_CLEAR_IF_FIRST |
+		       TDB_MUTEX_LOCKING |
+		       TDB_INCOMPATIBLE_HASH);
+	ok(ret == 0, "marklock-deadlock-mutex.tdb tests should succeed");
+
+	return exit_status();
+}
diff --git a/lib/tdb/wscript b/lib/tdb/wscript
index b86671e..c573d36 100644
--- a/lib/tdb/wscript
+++ b/lib/tdb/wscript
@@ -41,6 +41,7 @@ tdb1_unit_tests = [
     'run-wronghash-fail',
     'run-zero-append',
     'run-marklock-deadlock',
+    'run-allrecord-traverse-deadlock',
     'run-mutex-openflags2',
     'run-mutex-trylock',
     'run-mutex-allrecord-bench',
diff --git a/source3/librpc/crypto/gse.c b/source3/librpc/crypto/gse.c
index 46b5c6d..33a32c3 100644
--- a/source3/librpc/crypto/gse.c
+++ b/source3/librpc/crypto/gse.c
@@ -755,8 +755,8 @@ static NTSTATUS gensec_gse_seal_packet(struct gensec_security *gensec_security,
 				    whole_pdu, pdu_length,
 				    mem_ctx, sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_seal_packet(hdr_signing=%u,sig_size=%ju,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_seal_packet(hdr_signing=%u,sig_size=%zu,"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig_size, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -787,8 +787,8 @@ static NTSTATUS gensec_gse_unseal_packet(struct gensec_security *gensec_security
 				      whole_pdu, pdu_length,
 				      sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_unseal_packet(hdr_signing=%u,sig_size=%ju,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_unseal_packet(hdr_signing=%u,sig_size=%zu,"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig->length, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -821,7 +821,7 @@ static NTSTATUS gensec_gse_sign_packet(struct gensec_security *gensec_security,
 				    mem_ctx, sig);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0, ("gssapi_sign_packet(hdr_signing=%u,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -852,8 +852,8 @@ static NTSTATUS gensec_gse_check_packet(struct gensec_security *gensec_security,
 				     whole_pdu, pdu_length,
 				     sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_check_packet(hdr_signing=%u,sig_size=%ju"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_check_packet(hdr_signing=%u,sig_size=%zu"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig->length, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
diff --git a/source4/auth/gensec/gensec_gssapi.c b/source4/auth/gensec/gensec_gssapi.c
index 899dcfd..a12447a 100644
--- a/source4/auth/gensec/gensec_gssapi.c
+++ b/source4/auth/gensec/gensec_gssapi.c
@@ -1014,8 +1014,8 @@ static NTSTATUS gensec_gssapi_seal_packet(struct gensec_security *gensec_securit
 				    whole_pdu, pdu_length,
 				    mem_ctx, sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_seal_packet(hdr_signing=%u,sig_size=%ju,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_seal_packet(hdr_signing=%u,sig_size=%zu,"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig_size, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -1045,8 +1045,8 @@ static NTSTATUS gensec_gssapi_unseal_packet(struct gensec_security *gensec_secur
 				      whole_pdu, pdu_length,
 				      sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_unseal_packet(hdr_signing=%u,sig_size=%ju,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_unseal_packet(hdr_signing=%u,sig_size=%zu,"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig->length, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -1078,7 +1078,7 @@ static NTSTATUS gensec_gssapi_sign_packet(struct gensec_security *gensec_securit
 				    mem_ctx, sig);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0, ("gssapi_sign_packet(hdr_signing=%u,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
@@ -1108,8 +1108,8 @@ static NTSTATUS gensec_gssapi_check_packet(struct gensec_security *gensec_securi
 				     whole_pdu, pdu_length,
 				     sig);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(0, ("gssapi_check_packet(hdr_signing=%u,sig_size=%ju,"
-			  "data=%ju,pdu=%ju) failed: %s\n",
+		DEBUG(0, ("gssapi_check_packet(hdr_signing=%u,sig_size=%zu,"
+			  "data=%zu,pdu=%zu) failed: %s\n",
 			  hdr_signing, sig->length, length, pdu_length,
 			  nt_errstr(status)));
 		return status;
diff --git a/source4/libcli/ldap/ldap_bind.c b/source4/libcli/ldap/ldap_bind.c
index daa7662..0da49f3 100644
--- a/source4/libcli/ldap/ldap_bind.c
+++ b/source4/libcli/ldap/ldap_bind.c
@@ -234,7 +234,7 @@ _PUBLIC_ NTSTATUS ldap_bind_sasl(struct ldap_connection *conn,
 	queue_length = tevent_queue_length(conn->sockets.send_queue);
 	if (queue_length != 0) {
 		status = NT_STATUS_INVALID_PARAMETER_MIX;
-		DEBUG(1, ("SASL bind triggered with non empty send_queue[%ju]: %s\n",
+		DEBUG(1, ("SASL bind triggered with non empty send_queue[%zu]: %s\n",
 			  queue_length, nt_errstr(status)));
 		goto failed;
 	}
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index 6e3410b..6ce0d35 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -485,10 +485,12 @@ static void dcerpc_bh_ndr_pull_failed(struct dcerpc_binding_handle *h,
 
 	for (i=0;i<num_examples;i++) {
 		char *name=NULL;
-		asprintf(&name, "%s/rpclog/%s-out.%d",
-			 hs->p->conn->packet_log_dir,
-			 call->name, i);
-		if (name == NULL) {
+		int ret;
+
+		ret = asprintf(&name, "%s/rpclog/%s-out.%d",
+			       hs->p->conn->packet_log_dir,
+			       call->name, i);
+		if (ret == -1) {
 			return;
 		}
 		if (!file_exist(name)) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list