From ca829c4b81bfcdb7ea676694c5cfd0b79ccbb646 Mon Sep 17 00:00:00 2001 From: bigbiff bigbiff Date: Mon, 28 Jan 2013 08:14:25 -0500 Subject: Update exFAT to 1.0 Change-Id: I059cf52c41e76c584f76534b84af8b398d9e4617 --- exfat/libexfat/node.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'exfat/libexfat/node.c') diff --git a/exfat/libexfat/node.c b/exfat/libexfat/node.c index bacb01d10..ff2cea9ab 100644 --- a/exfat/libexfat/node.c +++ b/exfat/libexfat/node.c @@ -2,7 +2,7 @@ node.c (09.10.09) exFAT file system implementation library. - Copyright (C) 2010-2012 Andrew Nayenko + Copyright (C) 2010-2013 Andrew Nayenko This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -486,7 +486,7 @@ void exfat_reset_cache(struct exfat* ef) reset_cache(ef, ef->root); } -void next_entry(struct exfat* ef, const struct exfat_node* parent, +static void next_entry(struct exfat* ef, const struct exfat_node* parent, cluster_t* cluster, off64_t* offset) { *offset += sizeof(struct exfat_entry); @@ -908,6 +908,23 @@ int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path) exfat_put_node(ef, node); return rc; } + + /* check that target is not a subdirectory of the source */ + if (node->flags & EXFAT_ATTRIB_DIR) + { + struct exfat_node* p; + + for (p = dir; p; p = p->parent) + if (node == p) + { + if (existing != NULL) + exfat_put_node(ef, existing); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return -EINVAL; + } + } + if (existing != NULL) { /* remove target if it's not the same node as source */ -- cgit v1.2.3