ln can be used to overwrite a link like so: ln -sfn target link_name, because:
ln [OPTION]... [-T] TARGET LINK_NAME
Here's a minimal reproducer:
$ mkdir a b; ln -s a mylink # setup
$ readlink mylink # verify setup
a
$ ../../../gnu/src/ln -sfn b mylink # demonstrate that GNU works
$ readlink mylink # verify success
b
$ rm mylink; ln -s a mylink; readlink mylink # reset and verify
a
$ cargo run -q ln -sfn b mylink
ln: Could not update 'mylink': Not a directory (os error 20)
$ echo $? # fails according to stderr, but actually works
0
$ readlink mylink # also, it did the right thing
b
Originally reported by @LuNeder. Apparently this affects NixOS adversely.
Similar to, but different from #5974. In particular, #5975 does NOT fix this issue (I tested it).