diff options
author | relan <relan@users.noreply.github.com> | 2015-12-19 11:16:21 +0300 |
---|---|---|
committer | relan <relan@users.noreply.github.com> | 2015-12-19 11:16:21 +0300 |
commit | 1bacc536bb3ef013bc502937ee0d89ed32b253d7 (patch) | |
tree | f21e6af73b5d8d14ced9a7fa6d02a5ccf1a64c63 | |
parent | 5bf2c77b6e2e4956bb4e66f58290e16d775af4ec (diff) | |
download | android_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.c | 10 |
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; |