network: fix crashing "modify" option for hostname

The original condition caused (after adding modify option)
possibly access to not allocated memory. For consistency added
new check for multiple same records.

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/654
Signed-off-by: Adam Julis <ajulis@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Adam Julis 2024-08-06 09:01:42 +02:00 committed by Michal Privoznik
parent 959ecee474
commit f3e670ee6b

View File

@ -3167,7 +3167,7 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def,
/* when adding we want to only check duplicates of address since having /* when adding we want to only check duplicates of address since having
* multiple addresses with the same hostname is a legitimate configuration */ * multiple addresses with the same hostname is a legitimate configuration */
if (!isAdd) { if (command == VIR_NETWORK_UPDATE_COMMAND_DELETE) {
for (j = 0; j < host.nnames && !foundThisTime; j++) { for (j = 0; j < host.nnames && !foundThisTime; j++) {
for (k = 0; k < dns->hosts[i].nnames && !foundThisTime; k++) { for (k = 0; k < dns->hosts[i].nnames && !foundThisTime; k++) {
if (STREQ(host.names[j], dns->hosts[i].names[k])) if (STREQ(host.names[j], dns->hosts[i].names[k]))
@ -3224,6 +3224,13 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def,
goto cleanup; goto cleanup;
} }
if (foundCt > 1) {
virReportError(VIR_ERR_OPERATION_INVALID,
_("multiple matching DNS HOST records were found in network %1$s"),
def->name);
goto cleanup;
}
virNetworkDNSHostDefClear(&dns->hosts[foundIdxModify]); virNetworkDNSHostDefClear(&dns->hosts[foundIdxModify]);
memcpy(&dns->hosts[foundIdxModify], &host, sizeof(virNetworkDNSHostDef)); memcpy(&dns->hosts[foundIdxModify], &host, sizeof(virNetworkDNSHostDef));