svn commit: samba r10620 - in branches/tmp/samba4-winsrepl/source:
nbt_server/wins wrepl_server
metze at samba.org
metze at samba.org
Thu Sep 29 16:07:09 GMT 2005
Author: metze
Date: 2005-09-29 16:07:08 +0000 (Thu, 29 Sep 2005)
New Revision: 10620
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10620
Log:
- handle mutliple addresses in WREPL_REPL_SEND_REPLY
- make strings always valid talloc pointers
metze
Modified:
branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c
Changeset:
Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c 2005-09-29 15:57:21 UTC (rev 10619)
+++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c 2005-09-29 16:07:08 UTC (rev 10620)
@@ -183,7 +183,11 @@
if (!p) {
/* support old entries, with only the address */
addr->address = talloc_steal(addr, val->data);
- addr->wins_owner = rec->wins_owner;
+ addr->wins_owner = talloc_reference(addr, rec->wins_owner);
+ if (!addr->wins_owner) {
+ status = NT_STATUS_NO_MEMORY;
+ goto failed;
+ }
addr->expire_time = rec->expire_time;
*_addr = addr;
return NT_STATUS_OK;
@@ -439,7 +443,13 @@
talloc_steal(rec, rec->wins_owner);
talloc_steal(rec, rec->registered_by);
- if (!rec->wins_owner) rec->wins_owner = WINSDB_OWNER_LOCAL;
+ if (!rec->wins_owner) {
+ rec->wins_owner = talloc_strdup(rec, WINSDB_OWNER_LOCAL);
+ if (rec->wins_owner == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto failed;
+ }
+ }
el = ldb_msg_find_element(msg, "address");
if (el == NULL) {
@@ -447,6 +457,13 @@
goto failed;
}
+ if (!(rec->nb_flags & 2)) {
+ if (el->num_values != 1) {
+ status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+ goto failed;
+ }
+ }
+
rec->addresses = talloc_array(rec, struct winsdb_addr *, el->num_values+1);
if (rec->addresses == NULL) {
status = NT_STATUS_NO_MEMORY;
Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c 2005-09-29 15:57:21 UTC (rev 10619)
+++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_in_call.c 2005-09-29 16:07:08 UTC (rev 10620)
@@ -157,8 +157,14 @@
return 0;
}
-static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx, struct wrepl_wins_name *name, struct winsdb_record *rec)
+static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx,
+ const char *our_address,
+ struct wrepl_wins_name *name,
+ struct winsdb_record *rec)
{
+ uint32_t num_ips, i;
+ struct wrepl_ip *ips;
+
name->name = *rec->name;
talloc_steal(mem_ctx, rec->name->name);
talloc_steal(mem_ctx, rec->name->scope);
@@ -174,8 +180,24 @@
talloc_steal(mem_ctx, rec->addresses[0]->address);
break;
case 2:
- name->addresses.addresses.num_ips = 0;
- name->addresses.addresses.ips = NULL;
+ num_ips = winsdb_addr_list_length(rec->addresses);
+ ips = talloc_array(mem_ctx, struct wrepl_ip, num_ips);
+ NT_STATUS_HAVE_NO_MEMORY(ips);
+
+ for (i = 0; i < num_ips; i++) {
+ if (strcasecmp(WINSDB_OWNER_LOCAL, rec->addresses[i]->wins_owner) == 0) {
+ ips[i].owner = talloc_strdup(ips, our_address);
+ NT_STATUS_HAVE_NO_MEMORY(ips[i].owner);
+ } else {
+ ips[i].owner = rec->addresses[i]->wins_owner;
+ talloc_steal(ips, rec->addresses[i]->wins_owner);
+ }
+ ips[i].ip = rec->addresses[i]->address;
+ talloc_steal(ips, rec->addresses[i]->address);
+ }
+
+ name->addresses.addresses.num_ips = num_ips;
+ name->addresses.addresses.ips = ips;
break;
}
@@ -254,7 +276,7 @@
status = winsdb_record(res[i], NULL, call, &rec);
NT_STATUS_NOT_OK_RETURN(status);
- status = wreplsrv_record2wins_name(names, &names[i], rec);
+ status = wreplsrv_record2wins_name(names, call->wreplconn->our_ip, &names[i], rec);
NT_STATUS_NOT_OK_RETURN(status);
talloc_free(rec);
talloc_free(res[i]);
@@ -263,6 +285,10 @@
/* sort the names before we send them */
qsort(names, ret, sizeof(struct wrepl_wins_name), (comparison_fn_t)wreplsrv_in_sort_wins_name);
+ DEBUG(0,("WINSREPL:reply [%u] records owner[%s] min[%llu] max[%llu] to partner[%s]\n",
+ ret, owner_in->address, owner_in->min_version, owner_in->max_version,
+ call->wreplconn->partner->address));
+
reply_out->num_names = ret;
reply_out->names = names;
More information about the samba-cvs
mailing list