s4:netlogon RPC server - "LogonGetDomainInfo" - check for NULL attributes
[ira/wip.git] / source4 / rpc_server / netlogon / dcerpc_netlogon.c
index 3e0000cdb27ea52c0c69c19db1ed0f883fd2e3b9..8cd8257c240dca867cecbd9601f071ec16b4e2c8 100644 (file)
@@ -1378,7 +1378,6 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct dcesrv_call_state *dce_cal
        struct ldb_dn *workstation_dn;
        struct netr_DomainInformation *domain_info;
        struct netr_LsaPolicyInformation *lsa_policy_info;
-       struct netr_OsVersionInfoEx *os_version;
        uint32_t default_supported_enc_types = 0xFFFFFFFF;
        bool update_dns_hostname = true;
        int ret, ret3, i;
@@ -1478,9 +1477,13 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct dcesrv_call_state *dce_cal
                new_msg->dn = workstation_dn;
 
                /* Sets the OS name */
-               ret = samdb_msg_set_string(sam_ctx, mem_ctx, new_msg,
-                                          "operatingSystem",
-                                          r->in.query->workstation_info->os_name.string);
+
+               if (r->in.query->workstation_info->os_name.string == NULL) {
+                       return NT_STATUS_INVALID_PARAMETER;
+               }
+
+               ret = ldb_msg_add_string(new_msg, "operatingSystem",
+                                        r->in.query->workstation_info->os_name.string);
                if (ret != LDB_SUCCESS) {
                        return NT_STATUS_NO_MEMORY;
                }
@@ -1490,22 +1493,31 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct dcesrv_call_state *dce_cal
                 * the values are cleared.
                 */
                if (r->in.query->workstation_info->os_version.os != NULL) {
+                       struct netr_OsVersionInfoEx *os_version;
+                       const char *os_version_str;
+
                        os_version = &r->in.query->workstation_info->os_version.os->os;
 
-                       ret = samdb_msg_set_string(sam_ctx, mem_ctx, new_msg,
-                                                  "operatingSystemServicePack",
-                                                  os_version->CSDVersion);
+                       if (os_version->CSDVersion == NULL) {
+                               return NT_STATUS_INVALID_PARAMETER;
+                       }
+
+                       os_version_str = talloc_asprintf(new_msg, "%u.%u (%u)",
+                                                        os_version->MajorVersion,
+                                                        os_version->MinorVersion,
+                                                        os_version->BuildNumber);
+                       NT_STATUS_HAVE_NO_MEMORY(os_version_str);
+
+                       ret = ldb_msg_add_string(new_msg,
+                                                "operatingSystemServicePack",
+                                                os_version->CSDVersion);
                        if (ret != LDB_SUCCESS) {
                                return NT_STATUS_NO_MEMORY;
                        }
 
-                       ret = samdb_msg_set_string(sam_ctx, mem_ctx, new_msg,
-                                                  "operatingSystemVersion",
-                                                  talloc_asprintf(mem_ctx,
-                                                  "%u.%u (%u)",
-                                                  os_version->MajorVersion,
-                                                  os_version->MinorVersion,
-                                                  os_version->BuildNumber));
+                       ret = ldb_msg_add_string(new_msg,
+                                                "operatingSystemVersion",
+                                                os_version_str);
                        if (ret != LDB_SUCCESS) {
                                return NT_STATUS_NO_MEMORY;
                        }
@@ -1528,9 +1540,9 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct dcesrv_call_state *dce_cal
                 * are fine to start the update.
                 */
                if (update_dns_hostname) {
-                       ret = samdb_msg_set_string(sam_ctx, mem_ctx, new_msg,
-                                                  "dNSHostname",
-                                                  r->in.query->workstation_info->dns_hostname);
+                       ret = ldb_msg_add_string(new_msg,
+                                                "dNSHostname",
+                                                r->in.query->workstation_info->dns_hostname);
                        if (ret != LDB_SUCCESS) {
                                return NT_STATUS_NO_MEMORY;
                        }