From b930f0ba2115f71c323d4bf3d72efb763f716296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 25 Jun 2020 10:07:09 +0200 Subject: [PATCH] daemon: Correctly handle EMLINK corner case when deduplicating. Suggested by Caleb Ristvedt . * nix/libstore/optimise-store.cc (LocalStore::optimisePath_): Save errno from 'rename' before calling 'unlink'. --- nix/libstore/optimise-store.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nix/libstore/optimise-store.cc b/nix/libstore/optimise-store.cc index d8f8d2394b..eb303ab4c3 100644 --- a/nix/libstore/optimise-store.cc +++ b/nix/libstore/optimise-store.cc @@ -215,9 +215,10 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa /* Atomically replace the old file with the new hard link. */ if (rename(tempLink.c_str(), path.c_str()) == -1) { + int renameErrno = errno; if (unlink(tempLink.c_str()) == -1) printMsg(lvlError, format("unable to unlink `%1%'") % tempLink); - if (errno == EMLINK) { + if (renameErrno == EMLINK) { /* Some filesystems generate too many links on the rename, rather than on the original link. (Probably it temporarily increases the st_nlink field before