Date: Mon, 23 Jun 2025 08:39:08 +0000 From: bugzilla-noreply@freebsd.org To: bugs@FreeBSD.org Subject: [Bug 287741] ctld deletes ports if they already exist Message-ID: <bug-287741-227@https.bugs.freebsd.org/bugzilla/>
index | next in thread | raw e-mail
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=287741 Bug ID: 287741 Summary: ctld deletes ports if they already exist Product: Base System Version: CURRENT Hardware: Any OS: Any Status: New Severity: Affects Some People Priority: --- Component: bin Assignee: bugs@FreeBSD.org Reporter: des@FreeBSD.org CC: asomers@FreeBSD.org, jhb@FreeBSD.org, mav@FreeBSD.org I've been helping a client track down an issue introduced by commit 15b3e3bb7efcbf7c29ab76e9ea7990c17df790e6 to ctld. Here is the change, with a little extra context: /* * Now add new ports or modify existing ones. */ - TAILQ_FOREACH(newport, &newconf->conf_ports, p_next) { + TAILQ_FOREACH_SAFE(newport, &newconf->conf_ports, p_next, tmpport) { if (port_is_dummy(newport)) continue; oldport = port_find(oldconf, newport->p_name); if (oldport == NULL || port_is_dummy(oldport)) { log_debugx("adding port \"%s\"", newport->p_name); (1) error = kernel_port_add(newport); } else { log_debugx("updating port \"%s\"", newport->p_name); newport->p_ctl_port = oldport->p_ctl_port; (2) error = kernel_port_update(newport, oldport); } if (error != 0) { log_warnx("failed to %s port %s", (3) (oldport == NULL) ? "add" : "update", newport->p_name); + if (oldport == NULL || port_is_dummy(oldport)) +(4) port_delete(newport); /* * XXX: Uncomment after fixing the root cause. * * cumulated_error++; */ } } Some observations: (1) If kernel_port_add() fails because the port being added already exists, it returns non-zero, with no way for the caller to determine that the error can safely be ignored. (2) kernel_port_update() always returns zero, regardless of outcome. (3) The log_warnx() call in the error case should print "add" when port_is_dummy(newport) is true, not only when oldport is NULL. In fact, this log_warnx() call is only reached in the add case since kernel_port_update() never returns non-zero. (4) If kernel_port_add() failed because the port already existed, we now react by deleting it. I'm still working on determining why ctld thinks the port is new when it in fact already exists, but we should handle this gracefully regardless. -- You are receiving this mail because: You are the assignee for the bug.home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-287741-227>
