Ticket #10: fix-stalls-on-symlinks-rev3.patch

File fix-stalls-on-symlinks-rev3.patch, 2.1 KB (added by Patrick Winnertz, 11 years ago)

Added by email2trac

  • vfs/fish.c

    diff --git a/vfs/fish.c b/vfs/fish.c
    index 2a2deb6..5cd7236 100644
    a b fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    369369            "#LIST /%s\n" 
    370370            "if ls -1 /%s >/dev/null 2>&1 ;\n" 
    371371            "then\n" 
    372             "ls -lLan /%s 2>/dev/null | grep '^[^cbt]' | (\n" 
     372            "ls -lan /%s 2>/dev/null | grep '^[^cbt]' | (\n" 
    373373              "while read p l u g s m d y n; do\n" 
    374374                "echo \"P$p $u.$g\nS$s\nd$m $d $y\n:$n\n\"\n" 
    375375              "done\n" 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    412412 
    413413        switch(buffer[0]) { 
    414414        case ':': { 
    415                       if (!strcmp(buffer+1, ".") || !strcmp(buffer+1, "..")) 
    416                           break;  /* We'll do . and .. ourself */ 
    417                       ent->name = g_strdup(buffer+1);  
    418                       break; 
    419                   } 
     415            char *copy_buffer = buffer+1; 
     416            char *filename = buffer+1; 
     417            char *linkname = buffer+1; 
     418            if (!strcmp(buffer+1, ".") || !strcmp(buffer+1, "..")) 
     419                        break;  /* We'll do . and .. ourself */ 
     420 
     421                if (S_ISLNK(ST.st_mode)) { 
     422                        while (*copy_buffer){ 
     423                                if (strncmp(copy_buffer," -> ",4)==0) 
     424                                        filename = copy_buffer; 
     425                                copy_buffer++; 
     426                        } 
     427                        int f_size = filename - linkname; 
     428                        ent->name = malloc(f_size+1); 
     429                        strncpy(ent->name,linkname,f_size); 
     430                        ent->name[f_size] = '\0'; 
     431                        ent->ino->linkname = strdup(filename + 4); 
     432                } else { 
     433                        ent->name = g_strdup(buffer+1); 
     434                } 
     435                break; 
     436        } 
    420437        case 'S': 
    421438#ifdef HAVE_ATOLL 
    422439            ST.st_size = (off_t) atoll (buffer+1); 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    426443            break; 
    427444        case 'P': { 
    428445            size_t skipped; 
    429  
    430             if (vfs_parse_filemode (buffer + 1, &skipped, &ST.st_mode)) { 
    431                 if (S_ISLNK(ST.st_mode)) 
    432                     ST.st_mode = 0; 
    433             } 
     446            vfs_parse_filemode (buffer + 1, &skipped, &ST.st_mode); 
    434447            break; 
    435448        } 
    436449        case 'd': { 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    456469                      ST.st_rdev = makedev (maj, min); 
    457470#endif 
    458471                  } 
    459         case 'L': ent->ino->linkname = g_strdup(buffer+1); 
    460                   break; 
    461472        } 
    462473    } 
    463474