diff options
-rw-r--r-- | apps/fileop.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/apps/fileop.c b/apps/fileop.c index 1aaee3bb64..65a3b37e0a 100644 --- a/apps/fileop.c +++ b/apps/fileop.c | |||
@@ -51,6 +51,7 @@ struct file_op_params | |||
51 | unsigned long long total_size; | 51 | unsigned long long total_size; |
52 | unsigned long long processed_size; | 52 | unsigned long long processed_size; |
53 | size_t append; /* Append position in 'path' for stack push */ | 53 | size_t append; /* Append position in 'path' for stack push */ |
54 | size_t extra_len; /* Length added by dst path compared to src */ | ||
54 | }; | 55 | }; |
55 | 56 | ||
56 | static int prompt_name(char* buf, size_t bufsz) | 57 | static int prompt_name(char* buf, size_t bufsz) |
@@ -131,6 +132,7 @@ static void init_file_op(struct file_op_params *param, | |||
131 | param->toplevel_name = selected_file; | 132 | param->toplevel_name = selected_file; |
132 | } | 133 | } |
133 | param->is_dir = dir_exists(param->path); | 134 | param->is_dir = dir_exists(param->path); |
135 | param->extra_len = 0; | ||
134 | param->objects = 0; /* how many files and subdirectories*/ | 136 | param->objects = 0; /* how many files and subdirectories*/ |
135 | param->processed = 0; | 137 | param->processed = 0; |
136 | param->total_size = 0; | 138 | param->total_size = 0; |
@@ -209,7 +211,7 @@ static int directory_fileop(struct file_op_params *param, enum file_op_current f | |||
209 | break; | 211 | break; |
210 | } | 212 | } |
211 | 213 | ||
212 | if (param->append >= sizeof (param->path)) { | 214 | if (param->append + param->extra_len >= sizeof (param->path)) { |
213 | rc = FORC_PATH_TOO_LONG; | 215 | rc = FORC_PATH_TOO_LONG; |
214 | break; /* no space left in buffer */ | 216 | break; /* no space left in buffer */ |
215 | } | 217 | } |
@@ -523,6 +525,10 @@ int copy_move_fileobject(const char *src_path, const char *dst_path, unsigned in | |||
523 | /* Try renaming first */ | 525 | /* Try renaming first */ |
524 | rc = move_by_rename(&src, dst.path, &flags); | 526 | rc = move_by_rename(&src, dst.path, &flags); |
525 | if (rc < FORC_SUCCESS) { | 527 | if (rc < FORC_SUCCESS) { |
528 | int extra_len = dst.append - src.append; | ||
529 | if (extra_len > 0) | ||
530 | src.extra_len = extra_len; | ||
531 | |||
526 | rc = check_count_fileobjects(&src); | 532 | rc = check_count_fileobjects(&src); |
527 | if (rc == FORC_SUCCESS) { | 533 | if (rc == FORC_SUCCESS) { |
528 | rc = copy_move_directory(&src, &dst, flags); | 534 | rc = copy_move_directory(&src, &dst, flags); |