svn commit: samba r8279 - in branches/SAMBA_4_0/source/lib/messaging: .

tridge at samba.org tridge at samba.org
Sun Jul 10 06:17:39 GMT 2005


Author: tridge
Date: 2005-07-10 06:17:39 +0000 (Sun, 10 Jul 2005)
New Revision: 8279

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8279

Log:
make sure we hold a lock when manipulating the irpc names db


Modified:
   branches/SAMBA_4_0/source/lib/messaging/messaging.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/messaging/messaging.c
===================================================================
--- branches/SAMBA_4_0/source/lib/messaging/messaging.c	2005-07-10 05:15:08 UTC (rev 8278)
+++ branches/SAMBA_4_0/source/lib/messaging/messaging.c	2005-07-10 06:17:39 UTC (rev 8279)
@@ -728,11 +728,16 @@
 	t = irpc_namedb_open(msg_ctx);
 	NT_STATUS_HAVE_NO_MEMORY(t);
 
+	if (tdb_lock_bystring(t->tdb, name) != 0) {
+		talloc_free(t);
+		return NT_STATUS_LOCK_NOT_GRANTED;
+	}
 	rec = tdb_fetch_bystring(t->tdb, name);
 	count = rec.dsize / sizeof(uint32_t);
 	rec.dptr = (char *)realloc_p(rec.dptr, uint32_t, count+1);
 	rec.dsize += sizeof(uint32_t);
 	if (rec.dptr == NULL) {
+		tdb_unlock_bystring(t->tdb, name);
 		talloc_free(t);
 		return NT_STATUS_NO_MEMORY;
 	}
@@ -741,6 +746,7 @@
 		status = NT_STATUS_INTERNAL_ERROR;
 	}
 	free(rec.dptr);
+	tdb_unlock_bystring(t->tdb, name);
 	talloc_free(t);
 
 	msg_ctx->names = str_list_add(msg_ctx->names, name);
@@ -764,21 +770,29 @@
 		return NULL;
 	}
 
+	if (tdb_lock_bystring(t->tdb, name) != 0) {
+		talloc_free(t);
+		return NULL;
+	}
 	rec = tdb_fetch_bystring(t->tdb, name);
 	if (rec.dptr == NULL) {
+		tdb_unlock_bystring(t->tdb, name);
 		talloc_free(t);
 		return NULL;
 	}
 	count = rec.dsize / sizeof(uint32_t);
-	ret = talloc_array(msg_ctx, uint32_t, count);
+	ret = talloc_array(msg_ctx, uint32_t, count+1);
 	if (ret == NULL) {
+		tdb_unlock_bystring(t->tdb, name);
 		talloc_free(t);
 		return NULL;
 	}
 	for (i=0;i<count;i++) {
 		ret[i] = ((uint32_t *)rec.dptr)[i];
 	}
+	ret[i] = 0;
 	free(rec.dptr);
+	tdb_unlock_bystring(t->tdb, name);
 	talloc_free(t);
 
 	return ret;
@@ -801,9 +815,14 @@
 		return;
 	}
 
+	if (tdb_lock_bystring(t->tdb, name) != 0) {
+		talloc_free(t);
+		return;
+	}
 	rec = tdb_fetch_bystring(t->tdb, name);
 	count = rec.dsize / sizeof(uint32_t);
 	if (count == 0) {
+		tdb_unlock_bystring(t->tdb, name);
 		talloc_free(t);
 		return;
 	}
@@ -819,5 +838,6 @@
 	}
 	tdb_store_bystring(t->tdb, name, rec, 0);
 	free(rec.dptr);
+	tdb_unlock_bystring(t->tdb, name);
 	talloc_free(t);
 }



More information about the samba-cvs mailing list