samba-tool: dns: Copy string data when creating DNS_RPC_RECORD
authorAmitay Isaacs <amitay@gmail.com>
Tue, 28 Feb 2012 04:12:44 +0000 (15:12 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Thu, 1 Mar 2012 13:24:50 +0000 (00:24 +1100)
source4/scripting/python/samba/netcmd/dns.py

index b84f29b4fba9535fd74389e194e2f3a329b8d1ab..15a6122883a3a565c56c4748fa3b3c556c633889 100644 (file)
@@ -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