Overview
Comment: | Fixed inode lookup and determination of a file being packaged or not |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: | 1e2435553a4cdb1c2e2d07cf0d2fe706cbc062a8 |
User & Date: | rkeene on 2015-07-31 03:02:37 |
Other Links: | manifest | tags |
Context
2015-10-14
| ||
17:47 | Changed mount options to remove "direct_io", which breaks mmap and performed additional cleanups check-in: 1c47ca9097 user: rkeene tags: trunk | |
2015-07-31
| ||
03:02 | Fixed inode lookup and determination of a file being packaged or not check-in: 1e2435553a user: rkeene tags: trunk | |
2015-05-26
| ||
15:46 | Post-release version increment check-in: f90c4863fb user: rkeene tags: trunk | |
Changes
Modified appfsd.c from [388927f9ca] to [647fdab61a].
646 646 } 647 647 648 648 if (uid >= 0) { 649 649 retval += uid; 650 650 retval++; 651 651 } 652 652 653 + APPFS_DEBUG("Looked up inode number for path=%s,uid=%i: %u", path, uid, retval); 654 + 653 655 return(retval); 654 656 } 655 657 656 658 /* 657 659 * Cache Get Path Info lookups for speed 658 660 */ 659 661 static int appfs_get_path_info_cache_get(const char *path, uid_t uid, struct appfs_pathinfo *pathinfo) { ................................................................................ 665 667 666 668 pthread_ret = pthread_mutex_lock(&appfs_path_info_cache_mutex); 667 669 if (pthread_ret != 0) { 668 670 APPFS_DEBUG("Unable to lock path_info cache mutex !"); 669 671 670 672 return(-1); 671 673 } 674 + 675 + APPFS_DEBUG("Looking up cache entry for path=%s,uid=%lli...", path, (long long) uid); 672 676 673 677 if (appfs_path_info_cache != NULL) { 674 678 hash_idx = (appfs_get_path_inode(path, uid)) % appfs_path_info_cache_size; 675 679 676 680 if (appfs_path_info_cache[hash_idx]._cache_path != NULL) { 677 681 if (strcmp(appfs_path_info_cache[hash_idx]._cache_path, path) == 0 && appfs_path_info_cache[hash_idx]._cache_uid == uid) { 678 682 retval = 0; ................................................................................ 687 691 if (pthread_ret != 0) { 688 692 APPFS_DEBUG("Unable to unlock path_info cache mutex !"); 689 693 690 694 return(-1); 691 695 } 692 696 693 697 if (retval == 0) { 694 - APPFS_DEBUG("Cache hit on %s", path); 698 + APPFS_DEBUG("Cache hit on path=%s,uid=%lli", path, (long long) uid); 695 699 } else { 696 - APPFS_DEBUG("Cache miss on %s", path); 700 + APPFS_DEBUG("Cache miss on path=%s,uid=%lli", path, (long long) uid); 697 701 } 698 702 699 703 return(retval); 700 704 } 701 705 702 706 static void appfs_get_path_info_cache_add(const char *path, uid_t uid, struct appfs_pathinfo *pathinfo) { 703 707 unsigned int hash_idx; ................................................................................ 1019 1023 1020 1024 if (pathinfo->packaged) { 1021 1025 pathinfo->inode = appfs_get_path_inode(path, -1); 1022 1026 } else { 1023 1027 pathinfo->inode = appfs_get_path_inode(path, fsuid); 1024 1028 } 1025 1029 1030 + APPFS_DEBUG("Caching inode for path=%s,uid=%lli as %llu (packaged = %i)", path, (long long) fsuid, pathinfo->inode, pathinfo->packaged); 1031 + 1026 1032 if (retval == 0) { 1027 1033 appfs_get_path_info_cache_add(path, fsuid, pathinfo); 1028 1034 } else { 1029 1035 APPFS_DEBUG("error: Invalid type for \"%s\" from Tcl", path); 1030 1036 } 1031 1037 1032 1038 return(retval); ................................................................................ 1211 1217 case APPFS_PATHTYPE_FILE: 1212 1218 stbuf->st_mode = S_IFREG | 0444; 1213 1219 1214 1220 if (pathinfo.typeinfo.file.executable) { 1215 1221 stbuf->st_mode |= 0111; 1216 1222 } 1217 1223 1218 - if (pathinfo.typeinfo.file.suidRoot) { 1219 - changeOwnerToUserIfPackaged = 0; 1224 + if (pathinfo.packaged) { 1225 + if (pathinfo.typeinfo.file.suidRoot) { 1226 + changeOwnerToUserIfPackaged = 0; 1220 1227 1221 - stbuf->st_mode |= 04000; 1228 + stbuf->st_mode |= 04000; 1229 + } 1222 1230 } 1223 1231 1224 1232 if (pathinfo.typeinfo.file.worldaccessible) { 1225 1233 stbuf->st_mode &= ~077; 1226 1234 } 1227 1235 1228 1236 stbuf->st_nlink = 1; ................................................................................ 1250 1258 break; 1251 1259 case APPFS_PATHTYPE_INVALID: 1252 1260 retval = -EIO; 1253 1261 1254 1262 break; 1255 1263 } 1256 1264 1257 - if (pathinfo.packaged && changeOwnerToUserIfPackaged) { 1265 + if ((pathinfo.packaged && changeOwnerToUserIfPackaged) || (!pathinfo.packaged)) { 1258 1266 stbuf->st_uid = appfs_get_fsuid(); 1259 1267 stbuf->st_gid = appfs_get_fsgid(); 1260 1268 stbuf->st_mode |= 0200; 1261 1269 } 1262 1270 1263 1271 return(retval); 1264 1272 } ................................................................................ 2016 2024 #else 2017 2025 appfs_threaded_tcl = 0; 2018 2026 #endif 2019 2027 2020 2028 /** 2021 2029 ** Add FUSE arguments which we always supply 2022 2030 **/ 2023 - fuse_opt_add_arg(args, "-odefault_permissions,fsname=appfs,subtype=appfsd,use_ino,kernel_cache,entry_timeout=0,attr_timeout=0,big_writes,intr,hard_remove"); 2031 + fuse_opt_add_arg(args, "-odefault_permissions,fsname=appfs,subtype=appfsd,use_ino,direct_io,entry_timeout=0,attr_timeout=0,big_writes,intr,hard_remove"); 2024 2032 2025 2033 if (getuid() == 0) { 2026 2034 fuse_opt_parse(args, NULL, NULL, NULL); 2027 2035 fuse_opt_add_arg(args, "-oallow_other"); 2028 2036 2029 2037 /* 2030 2038 * This should generally be avoided, but if there are security
Modified appfsd.tcl from [a394650d8e] to [e7e131fd9c].
675 675 array set retval [list] 676 676 677 677 catch { 678 678 ::appfs::getindex $pathinfo(hostname) 679 679 ::appfs::getpkgmanifest $pathinfo(hostname) $pathinfo(package_sha1) 680 680 } 681 681 682 + set retval(path_type) $pathinfo(_type) 683 + 682 684 switch -- $pathinfo(_type) { 683 685 "toplevel" { 684 686 set retval(type) directory 685 687 set retval(childcount) [llength [getchildren $path]] 686 688 } 687 689 "sites" { 688 690 set check [::appfs::db onecolumn {SELECT 1 FROM packages WHERE hostname = $pathinfo(hostname);}] ................................................................................ 752 754 file lstat $localpath localpathinfo 753 755 } 754 756 } 755 757 } 756 758 757 759 if {$localpath != "" && [info exists localpathinfo]} { 758 760 set retval(is_localfile) 1 761 + unset retval(packaged) 759 762 catch { 760 763 set retval(time) $localpathinfo(mtime) 761 764 762 765 switch -- $localpathinfo(type) { 763 766 "directory" { 764 767 set retval(type) "directory" 765 768 set retval(childcount) [llength [getchildren $path]] ................................................................................ 837 840 return [array get retval] 838 841 } 839 842 840 843 proc openpath {path mode} { 841 844 array set pathinfo [_parsepath $path] 842 845 843 846 if {$pathinfo(_type) != "files"} { 844 - return -code error "invalid type" 847 + return -code error "invalid path type: Got \"$pathinfo(_type)\", need \"files\"" 845 848 } 846 849 847 850 set localpath [_localpath $pathinfo(package) $pathinfo(hostname) $pathinfo(file)] 848 851 849 852 if {$mode == "create"} { 850 853 if {$localpath == ""} { 851 854 return -code error "Asked to create, but no home directory." ................................................................................ 901 904 return $localcachefile 902 905 } 903 906 904 907 proc localpath {path} { 905 908 array set pathinfo [_parsepath $path] 906 909 907 910 if {$pathinfo(_type) != "files"} { 908 - return -code error "invalid type" 911 + return -code error "invalid path type: Got \"$pathinfo(_type)\", need \"files\"" 909 912 } 910 913 911 914 set localpath [_localpath $pathinfo(package) $pathinfo(hostname) $pathinfo(file)] 912 915 913 916 return $localpath 914 917 } 915 918 ................................................................................ 950 953 951 954 return $filename 952 955 } 953 956 954 957 proc unlinkpath {path} { 955 958 array set pathattrs [exists $path] 956 959 957 - if {![info exists pathattrs(packaged)]} { 958 - return -code error "invalid type" 960 + if {$pathattrs(path_type) != "files"} { 961 + return -code error "invalid path type: can only delete type \"files\" this is type \"$pathattrs(path_type)\"" 959 962 } 960 963 961 964 set localpath $pathattrs(localpath) 962 965 963 966 if {$localpath == ""} { 964 967 return -code error "Asked to delete, but no home directory." 965 968 }