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

File fix-stalls-on-symlinks-rev1.patch, 1.9 KB (added by slavazanko, 10 years ago)
  • vfs/fish.c

    diff --git a/vfs/fish.c b/vfs/fish.c
    index 2a2deb6..905aba3 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            while (*copy_buffer){ 
     421                if (strncmp(copy_buffer," -> ",4)==0){ 
     422                    filename = copy_buffer; 
     423                    break; 
     424                } 
     425                copy_buffer++; 
     426            } 
     427            if (filename != linkname) { 
     428                int f_size = filename - linkname; 
     429                ent->name = malloc(f_size+1); 
     430                strncpy(ent->name,linkname,f_size); 
     431                ent->name[f_size] = '\0'; 
     432                ent->ino->linkname = strdup(filename + 4); 
     433            } else { 
     434                ent->name = g_strdup(buffer+1);  
     435            } 
     436            break; 
     437        } 
    420438        case 'S': 
    421439#ifdef HAVE_ATOLL 
    422440            ST.st_size = (off_t) atoll (buffer+1); 
    fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) 
    426444            break; 
    427445        case 'P': { 
    428446            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             } 
     447            vfs_parse_filemode (buffer + 1, &skipped, &ST.st_mode); 
    434448            break; 
    435449        } 
    436450        case 'd': {