aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrelan <relan@users.noreply.github.com>2015-12-19 11:16:21 +0300
committerrelan <relan@users.noreply.github.com>2015-12-19 11:16:21 +0300
commit1bacc536bb3ef013bc502937ee0d89ed32b253d7 (patch)
treef21e6af73b5d8d14ced9a7fa6d02a5ccf1a64c63
parent5bf2c77b6e2e4956bb4e66f58290e16d775af4ec (diff)
downloadandroid_external_exfat-1bacc536bb3ef013bc502937ee0d89ed32b253d7.tar.gz
android_external_exfat-1bacc536bb3ef013bc502937ee0d89ed32b253d7.tar.bz2
android_external_exfat-1bacc536bb3ef013bc502937ee0d89ed32b253d7.zip
Fix clusters loss when file renaming replaces target.
Add missing exfat_cleanup_node() call after exfat_unlink().
-rw-r--r--libexfat/node.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libexfat/node.c b/libexfat/node.c
index d05f20d..4dd4dc6 100644
--- a/libexfat/node.c
+++ b/libexfat/node.c
@@ -1130,6 +1130,16 @@ int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path)
exfat_put_node(ef, existing);
if (rc != 0)
{
+ /* free clusters even if something went wrong; overwise they
+ will be just lost */
+ exfat_cleanup_node(ef, existing);
+ exfat_put_node(ef, dir);
+ exfat_put_node(ef, node);
+ return rc;
+ }
+ rc = exfat_cleanup_node(ef, existing);
+ if (rc != 0)
+ {
exfat_put_node(ef, dir);
exfat_put_node(ef, node);
return rc;