fix loop in pkg_add

Marc Espie <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
It's not pretty, but at least it avoids the loop.

Suggestions for making it nicer welcome.


Index: Dependencies.pm
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.sbin/pkg_add/OpenBSD/Dependencies.pm,v
diff -u -p -r1.175 Dependencies.pm
--- Dependencies.pm	13 Jun 2023 09:07:17 -0000	1.175
+++ Dependencies.pm	24 Jun 2026 19:36:36 -0000
@@ -149,6 +149,7 @@ sub check_for_loops($self, $state)
 		}
 	}
 	if (@to_merge > 0) {
+		my $merge = 0;
 		my $merged = {};
 		my @real = ();
 		$state->say("Detected loop, merging sets #1", $state->ntogo);
@@ -156,6 +157,7 @@ sub check_for_loops($self, $state)
 		for my $set (@to_merge) {
 			my $k = $set;
 			while ($k ne $initial && !$merged->{$k}) {
+				$merge++;
 				unless ($k->{finished}) {
 					$state->say("| #1", $k->print);
 					delete $k->solver->{deplist};
@@ -168,8 +170,14 @@ sub check_for_loops($self, $state)
 		}
 		delete $initial->solver->{deplist};
 		delete $initial->solver->{to_register};
-		$initial->merge($state->tracker, @real);
+		if ($merge) {
+			$initial->merge($state->tracker, @real);
+			return 1;
+		} else {
+			return 0;
+		}
 	}
+	return 1;
 }
 
 sub find_dep_in_repositories($self, $state, $dep)
Index: PkgAdd.pm
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm,v
diff -u -p -r1.152 PkgAdd.pm
--- PkgAdd.pm	6 May 2025 18:36:20 -0000	1.152
+++ PkgAdd.pm	24 Jun 2026 19:17:15 -0000
@@ -953,8 +953,14 @@ sub process_set($self, $set, $state)
 	}
 	if (@deps > 0) {
 		$state->build_deptree($set, @deps);
-		$set->solver->check_for_loops($state);
-		return (@deps, $set);
+		if ($set->solver->check_for_loops($state)) {
+			return (@deps, $set);
+		} else {
+			$state->{bad}++;
+			$set->cleanup(OpenBSD::Handle::CANT_INSTALL);
+			$state->tracker->cant($set);
+			return ();
+		}
 	}
 
 	$set->figure_out_kept($state);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.