Fix restore -C to handle correctly directories containing a file with the same name...
authorStelian Pop <stelian@popies.net>
Fri, 14 Jan 2005 13:04:07 +0000 (13:04 +0000)
committerStelian Pop <stelian@popies.net>
Fri, 14 Jan 2005 13:04:07 +0000 (13:04 +0000)
CHANGES
restore/symtab.c

diff --git a/CHANGES b/CHANGES
index f56eb80cda6b53228074577cf2c7092dc5792102..cdeb39609fc8023626e3fd241b3588c39803901f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.266 2005/01/14 13:01:32 stelian Exp $
+$Id: CHANGES,v 1.267 2005/01/14 13:04:07 stelian Exp $
 
 Changes between versions 0.4b38 and 0.4b39 (released ???????????????)
 =====================================================================
@@ -17,6 +17,13 @@ Changes between versions 0.4b38 and 0.4b39 (released ???????????????)
 3.     Silenced the failure to call fgetflags() when comparing an
        entry which has no ext2 attributes (as in lsattr()).
 
+4.     Fix a brown paper bug in restore -C which broke restore and
+       caused modifications on the filesystem being compared
+       (directories containing a file with the same name as the
+       directory get renamed to RSTTMP...). Thanks to Kenneth Porter
+       <shiva@sewingwitch.com> for finding the bug and helping me
+       reproduce it.
+
 Changes between versions 0.4b37 and 0.4b38 (released January 7, 2005)
 =====================================================================
 
index 8cd384c51dd36a7f2ba622f75f0214bdf93fd268..4a2e1abe969d5053c91864a16f93a635ede683cf 100644 (file)
@@ -37,7 +37,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: symtab.c,v 1.23 2004/12/14 14:07:58 stelian Exp $";
+       "$Id: symtab.c,v 1.24 2005/01/14 13:04:07 stelian Exp $";
 #endif /* not lint */
 
 /*
@@ -189,9 +189,16 @@ lookupname(char *name)
        char *np, *cp;
        char buf[MAXPATHLEN];
 
+       ep = lookupino(ROOTINO);
+
        cp = name;
+       if (*cp == '.')
+               ++cp;
+       if (*cp == '/')
+               ++cp;
+       if (*cp == '\0')
+               return ep;
 
-       ep = lookupino(ROOTINO);
        while (ep != NULL) {
                for (np = buf; *cp != '/' && *cp != '\0' &&
                                np < &buf[sizeof(buf)]; )
@@ -202,8 +209,7 @@ lookupname(char *name)
 
                oldep = ep;
 
-               if (strcmp(ep->e_name, buf) != 0 &&
-                   ep->e_entries != NULL) {
+               if (ep->e_entries != NULL) {
 
                        ep = ep->e_entries[dir_hash(buf)];
                        for ( ; ep != NULL; ep = ep->e_sibling)