From: Jean-Pierre A. <jp...@us...> - 2009-03-27 08:36:21
|
Update of /cvsroot/ntfs-3g/ntfs-3g/libntfs-3g In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv892/ntfs-3g/libntfs-3g Modified Files: Tag: PERMISSION_HANDLING_BRANCH volume.c security.c Log Message: Fed the free spaces in context for calls from security API Index: security.c =================================================================== RCS file: /cvsroot/ntfs-3g/ntfs-3g/libntfs-3g/security.c,v retrieving revision 1.2.2.111 retrieving revision 1.2.2.112 diff -u -d -r1.2.2.111 -r1.2.2.112 --- security.c 23 Mar 2009 16:09:24 -0000 1.2.2.111 +++ security.c 27 Mar 2009 08:36:07 -0000 1.2.2.112 @@ -4733,7 +4733,8 @@ if (vol) { scapi = (struct SECURITY_API*) ntfs_malloc(sizeof(struct SECURITY_API)); - if (scapi) { + if (!ntfs_volume_get_free_space(vol) + && scapi) { scapi->magic = MAGIC_API; scapi->seccache = (struct PERMISSIONS_CACHE*)NULL; scx = &scapi->security; @@ -4745,8 +4746,14 @@ /* accept no mapping and no $Secure */ ntfs_build_mapping(scx,(const char*)NULL); ntfs_open_secure(vol); - } else - errno = ENOMEM; + } else { + if (scapi) + free(scapi); + else + errno = ENOMEM; + mnt = ntfs_umount(vol,FALSE); + scapi = (struct SECURITY_API*)NULL; + } } } else if (getuid()) Index: volume.c =================================================================== RCS file: /cvsroot/ntfs-3g/ntfs-3g/libntfs-3g/volume.c,v retrieving revision 1.17.2.13 retrieving revision 1.17.2.14 diff -u -d -r1.17.2.13 -r1.17.2.14 --- volume.c 12 Feb 2009 20:32:21 -0000 1.17.2.13 +++ volume.c 27 Mar 2009 08:36:07 -0000 1.17.2.14 @@ -1564,3 +1564,30 @@ return 0; } +/* + * Feed the counts of free clusters and free mft records + */ + +int ntfs_volume_get_free_space(ntfs_volume *vol) +{ + ntfs_attr *na; + int ret; + + ret = -1; /* default return */ + vol->free_clusters = ntfs_attr_get_free_bits(vol->lcnbmp_na); + if (vol->free_clusters < 0) { + ntfs_log_perror("Failed to read NTFS $Bitmap"); + } else { + na = vol->mftbmp_na; + vol->free_mft_records = ntfs_attr_get_free_bits(na); + + if (vol->free_mft_records >= 0) + vol->free_mft_records += (na->allocated_size - na->data_size) << 3; + + if (vol->free_mft_records < 0) + ntfs_log_perror("Failed to calculate free MFT records"); + else + ret = 0; + } + return (ret); +} |