Kaydet (Commit) dcdc8df2 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

osl_getVolumeInformation: only stat if necessary

...in the hope that that makes cid#706206 (TOCTOU) go away

Change-Id: I4bc7b44e0268cf5d46aaf55fb4073dcdf67b324c
üst bf95b785
...@@ -211,76 +211,98 @@ oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeI ...@@ -211,76 +211,98 @@ oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeI
static oslFileError osl_psz_getVolumeInformation ( static oslFileError osl_psz_getVolumeInformation (
const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask) const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask)
{ {
__OSL_STATFS_STRUCT sfs;
if (!pInfo) if (!pInfo)
return osl_File_E_INVAL; return osl_File_E_INVAL;
__OSL_STATFS_INIT(sfs);
pInfo->uValidFields = 0; pInfo->uValidFields = 0;
pInfo->uAttributes = 0; pInfo->uAttributes = 0;
pInfo->uTotalSpace = 0;
pInfo->uFreeSpace = 0;
pInfo->uUsedSpace = 0;
if ((__OSL_STATFS(pszDirectory, &sfs)) < 0) if ((uFieldMask
{ & (osl_VolumeInfo_Mask_Attributes | osl_VolumeInfo_Mask_TotalSpace
oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno); | osl_VolumeInfo_Mask_UsedSpace | osl_VolumeInfo_Mask_FreeSpace
return (result); | osl_VolumeInfo_Mask_FileSystemName
} | osl_VolumeInfo_Mask_FileSystemCaseHandling))
!= 0)
/* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */
if (uFieldMask & osl_VolumeInfo_Mask_Attributes)
{ {
if (__OSL_STATFS_ISREMOTE(sfs)) __OSL_STATFS_STRUCT sfs;
pInfo->uAttributes |= osl_Volume_Attribute_Remote; __OSL_STATFS_INIT(sfs);
if ((__OSL_STATFS(pszDirectory, &sfs)) < 0)
{
oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno);
return (result);
}
pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes; /* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */
} if (uFieldMask & osl_VolumeInfo_Mask_Attributes)
{
if (__OSL_STATFS_ISREMOTE(sfs))
pInfo->uAttributes |= osl_Volume_Attribute_Remote;
if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling) pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
{ }
if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs))
pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive;
if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs)) if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling)
pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved; {
if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs))
pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive;
pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes; if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs))
} pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
pInfo->uTotalSpace = 0; pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
pInfo->uFreeSpace = 0; }
pInfo->uUsedSpace = 0;
#if defined(__OSL_STATFS_BLKSIZ) #if defined(__OSL_STATFS_BLKSIZ)
if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) || if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) ||
(uFieldMask & osl_VolumeInfo_Mask_UsedSpace)) (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
{ {
pInfo->uTotalSpace = __OSL_STATFS_BLKSIZ(sfs); pInfo->uTotalSpace = __OSL_STATFS_BLKSIZ(sfs);
pInfo->uTotalSpace *= (sal_uInt64)(sfs.f_blocks); pInfo->uTotalSpace *= (sal_uInt64)(sfs.f_blocks);
pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace; pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace;
} }
if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) || if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) ||
(uFieldMask & osl_VolumeInfo_Mask_UsedSpace)) (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
{ {
pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs); pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs);
if (getuid() == 0) if (getuid() == 0)
pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree); pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree);
else else
pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail); pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail);
pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace; pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace;
} }
if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) &&
(pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace ))
{
pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace;
pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace;
}
#endif /* __OSL_STATFS_BLKSIZ */ #endif /* __OSL_STATFS_BLKSIZ */
if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) && #if defined(__OSL_STATFS_TYPENAME)
(pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace ))
{ if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName)
pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace; {
pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace; rtl_string2UString(
&(pInfo->ustrFileSystemName),
__OSL_STATFS_TYPENAME(sfs),
rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)),
osl_getThreadTextEncoding(),
OUSTRING_TO_OSTRING_CVTFLAGS);
OSL_ASSERT(pInfo->ustrFileSystemName != 0);
pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
}
#endif /* __OSL_STATFS_TYPENAME */
} }
pInfo->uMaxNameLength = 0; pInfo->uMaxNameLength = 0;
...@@ -305,23 +327,6 @@ static oslFileError osl_psz_getVolumeInformation ( ...@@ -305,23 +327,6 @@ static oslFileError osl_psz_getVolumeInformation (
} }
} }
#if defined(__OSL_STATFS_TYPENAME)
if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName)
{
rtl_string2UString(
&(pInfo->ustrFileSystemName),
__OSL_STATFS_TYPENAME(sfs),
rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)),
osl_getThreadTextEncoding(),
OUSTRING_TO_OSTRING_CVTFLAGS);
OSL_ASSERT(pInfo->ustrFileSystemName != 0);
pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
}
#endif /* __OSL_STATFS_TYPENAME */
return osl_File_E_None; return osl_File_E_None;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment