From 94277a7d21e6b086c86b484d8b19bdb36eca7160 Mon Sep 17 00:00:00 2001 From: Colin Patrick Mccabe Date: Thu, 2 Oct 2014 12:42:19 -0700 Subject: [PATCH] HDFS-7162. Wrong path when deleting through fuse-dfs a file which already exists in trash (cmccabe) (cherry picked from commit 03db9cc839663cad387db7df8e4f60b312058f18) (cherry picked from commit ab1afc4e1cafc1cd81cca36eccc1c905afb7293b) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hadoop-hdfs/src/main/native/fuse-dfs/fuse_trash.c | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 6190c693b96..d989ac4fee8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -533,6 +533,9 @@ Release 2.6.0 - UNRELEASED HDFS-7181. Remove incorrect precondition check on key length in FileEncryptionInfo. (wang) + HDFS-7162. Wrong path when deleting through fuse-dfs a file which already + exists in trash (Chenging Liu via cmccabe) + BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS HDFS-6387. HDFS CLI admin tool for creating & deleting an diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/fuse_trash.c b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/fuse_trash.c index 688eae85560..5e58087e22d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/fuse_trash.c +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/native/fuse-dfs/fuse_trash.c @@ -150,13 +150,14 @@ int move_to_trash(const char *abs_path, hdfsFS userFS) if (ret) { goto done; } - if (!strncmp(trash_base, abs_path, strlen(trash_base))) { + int trash_base_len = strlen(trash_base); + if (!strncmp(trash_base, abs_path, trash_base_len) + && (strlen(abs_path) == trash_base_len || abs_path[trash_base_len] == '/')) { INFO("move_to_trash(%s): file is already in the trash; deleting.", abs_path); ret = ALREADY_IN_TRASH_ERR; goto done; } - fprintf(stderr, "trash_base='%s'\n", trash_base); if (asprintf(&target_dir, "%s%s", trash_base, parent_dir) < 0) { ret = ENOMEM; target_dir = NULL; @@ -182,7 +183,7 @@ int move_to_trash(const char *abs_path, hdfsFS userFS) int idx; for (idx = 1; idx < TRASH_RENAME_TRIES; idx++) { free(target); - if (asprintf(&target, "%s%s.%d", target_dir, pcomp, idx) < 0) { + if (asprintf(&target, "%s/%s.%d", target_dir, pcomp, idx) < 0) { target = NULL; ret = ENOMEM; goto done;