DEVEL15-windows-fix-recursion-detection-20070822
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 22 Aug 2007 17:11:07 +0000 (17:11 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 22 Aug 2007 17:11:07 +0000 (17:11 +0000)
handle symlinks to absolute paths

(cherry picked from commit 10c60218471b1312f4235135aa2e74cd9687a0a4)

src/WINNT/afsd/cm_vnodeops.c

index 6db7a17..227973f 100644 (file)
@@ -1859,8 +1859,10 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags,
                 if (code == 0) {
                     if (!strcmp(component,".."))
                         fid_count -=2;
+                    else if (!strcmp(component,"."))
+                        fid_count -=1;
                     for ( i=0; i<fid_count; i++) {
-                        if ( strcmp(component,".") && !cm_FidCmp(&nscp->fid, &fids[i]) ) {
+                        if ( !cm_FidCmp(&nscp->fid, &fids[i]) ) {
                             code = CM_ERROR_TOO_MANY_SYMLINKS;
                             cm_ReleaseSCache(nscp);
                             nscp = NULL;
@@ -1942,12 +1944,16 @@ long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags,
                     code = cm_AssembleLink(tscp, restp, &linkScp, &tempsp, userp, reqp);
 
                     if (code == 0 && linkScp != NULL) {
-                        for ( i=0; i<fid_count; i++) {
-                            if ( !cm_FidCmp(&linkScp->fid, &fids[i]) ) {
-                                code = CM_ERROR_TOO_MANY_SYMLINKS;
-                                cm_ReleaseSCache(linkScp);
-                                nscp = NULL;
-                                break;
+                        if (linkScp == cm_data.rootSCachep) 
+                            fid_count = 0;
+                        else {
+                            for ( i=0; i<fid_count; i++) {
+                                if ( !cm_FidCmp(&linkScp->fid, &fids[i]) ) {
+                                    code = CM_ERROR_TOO_MANY_SYMLINKS;
+                                    cm_ReleaseSCache(linkScp);
+                                    nscp = NULL;
+                                    break;
+                                }
                             }
                         }
                         if (i == fid_count && fid_count < MAX_FID_COUNT) {