From f025d788d011403ef6740e777aef5ee289b35b0c Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 28 Feb 2012 15:12:44 +1100 Subject: samba-tool: dns: Copy string data when creating DNS_RPC_RECORD --- source4/scripting/python/samba/netcmd/dns.py | 41 ++++++++++++++++------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/source4/scripting/python/samba/netcmd/dns.py b/source4/scripting/python/samba/netcmd/dns.py index b84f29b4fb..15a6122883 100644 --- a/source4/scripting/python/samba/netcmd/dns.py +++ b/source4/scripting/python/samba/netcmd/dns.py @@ -363,6 +363,11 @@ def print_dnsrecords(outf, records): print_dns_record(outf, dns_rec) +# +# Always create a copy of strings when creating DNS_RPC_RECORDs +# to overcome the bug in pidl generated python bindings. +# + class ARecord(dnsserver.DNS_RPC_RECORD): def __init__(self, ip_addr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE, node_flag=0): @@ -371,7 +376,8 @@ class ARecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl - self.data = ip_addr + self._ip_addr = ip_addr[:] + self.data = self._ip_addr class AAAARecord(dnsserver.DNS_RPC_RECORD): def __init__(self, ip6_addr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE, @@ -381,7 +387,8 @@ class AAAARecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl - self.data = ip6_addr + self._ip6_addr = ip6_addr[:] + self.data = self._ip6_addr class PTRRecord(dnsserver.DNS_RPC_RECORD): def __init__(self, ptr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE, @@ -391,8 +398,9 @@ class PTRRecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtleSeconds = ttl + self._ptr = ptr[:] ptr_name = dnsserver.DNS_RPC_NAME() - ptr_name.str = ptr + ptr_name.str = self._ptr ptr_name.len = len(ptr) self.data = ptr_name @@ -404,8 +412,9 @@ class CNameRecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl + self._cname = cname[:] cname_name = dnsserver.DNS_RPC_NAME() - cname_name.str = cname + cname_name.str = self._cname cname_name.len = len(cname) self.data = cname_name @@ -417,16 +426,12 @@ class NSRecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl + self._dns_server = dns_server[:] ns = dnsserver.DNS_RPC_NAME() - ns.str = dns_server + ns.str = self._dns_server ns.len = len(dns_server) self.data = ns -# -# FIXME: In MXRecord, SOARecord, SRVRecord keep a reference to strings -# to overcome the bug in pidl generated python bindings. -# - class MXRecord(dnsserver.DNS_RPC_RECORD): def __init__(self, mail_server, preference, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE, node_flag=0): @@ -435,11 +440,11 @@ class MXRecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl + self._mail_server = mail_server[:] mx = dnsserver.DNS_RPC_RECORD_NAME_PREFERENCE() mx.wPreference = preference - self._mail_server = mail_server mx.nameExchange.str = self._mail_server - mx.nameExchange.len = len(self._mail_server) + mx.nameExchange.len = len(mail_server) self.data = mx class SOARecord(dnsserver.DNS_RPC_RECORD): @@ -451,17 +456,17 @@ class SOARecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl + self._mname = mname[:] + self._rname = rname[:] soa = dnsserver.DNS_RPC_RECORD_SOA() soa.dwSerialNo = serial soa.dwRefresh = refresh soa.dwRetry = retry soa.dwExpire = expire - self._mname = mname soa.NamePrimaryServer.str = self._mname - soa.NamePrimaryServer.len = len(self._mname) - self._rname = rname + soa.NamePrimaryServer.len = len(mname) soa.ZoneAdministratorEmail.str = self._rname - soa.ZoneAdministratorEmail.len = len(self._rname) + soa.ZoneAdministratorEmail.len = len(rname) self.data = soa class SRVRecord(dnsserver.DNS_RPC_RECORD): @@ -472,13 +477,13 @@ class SRVRecord(dnsserver.DNS_RPC_RECORD): self.dwFlags = rank | node_flag self.dwSerial = serial self.dwTtlSeconds = ttl + self._target = target[:] srv = dnsserver.DNS_RPC_RECORD_SRV() srv.wPriority = priority srv.wWeight = weight srv.wPort = port - self._target = target srv.nameTarget.str = self._target - srv.nameTarget.len = len(self._target) + srv.nameTarget.len = len(target) self.data = srv -- cgit