summaryrefslogtreecommitdiff
path: root/ln.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-08-06 12:12:00 -0400
committerJakob Kaivo <jkk@ung.org>2019-08-06 12:12:00 -0400
commit81cd8690e7c4fb4d316355b016a31b823ec9b507 (patch)
tree638e7ae054a4d050e0884af813ecb23a1ffa0ac9 /ln.c
parent309293405cafadd2ba79e17d7e9555630e7ed21f (diff)
prevent unlinking file if attempt to link to itself
Diffstat (limited to 'ln.c')
-rw-r--r--ln.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/ln.c b/ln.c
index 4f30824..6929bfa 100644
--- a/ln.c
+++ b/ln.c
@@ -47,6 +47,14 @@ static int ln(const char *path, int dirfd, const char *target, int sym, int forc
fprintf(stderr, "ln: %s: %s\n", target, strerror(EEXIST));
return 1;
}
+
+ struct stat s2;
+ if (stat(path, &s2) == 0) {
+ if (st.st_dev == s2.st_dev && st.st_ino == s2.st_ino) {
+ fprintf(stderr, "ln: %s -> %s: same file\n", path, target);
+ return 1;
+ }
+ }
if (unlinkat(dirfd, target, 0) != 0) {
fprintf(stderr, "ln: %s: %s\n", target, strerror(errno));