summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-04-02 14:06:28 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-04-02 14:06:28 +0200
commit7167ea5a5e86e25241e5579866b17d45671cf6f7 (patch)
treead85f7fe638b06afb89ed0b3f265b868dfc26c60 /src
parent2fbeaa3f46cfba6d9eb084229fffda33bbe02ddc (diff)
downloadabrt-7167ea5a5e86e25241e5579866b17d45671cf6f7.tar.gz
abrt-7167ea5a5e86e25241e5579866b17d45671cf6f7.tar.xz
abrt-7167ea5a5e86e25241e5579866b17d45671cf6f7.zip
hooklib: fix excessive rounding down in free space calculation (bz#575644)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src')
-rw-r--r--src/Hooks/hooklib.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/Hooks/hooklib.cpp b/src/Hooks/hooklib.cpp
index 06bde974..a722ef5f 100644
--- a/src/Hooks/hooklib.cpp
+++ b/src/Hooks/hooklib.cpp
@@ -83,12 +83,20 @@ void parse_conf(const char *additional_conf, unsigned *setting_MaxCrashReportsSi
void check_free_space(unsigned setting_MaxCrashReportsSize)
{
- /* Check that at least MaxCrashReportsSize/4 MBs are free. */
struct statvfs vfs;
- if (statvfs(DEBUG_DUMPS_DIR, &vfs) != 0
- || (vfs.f_bfree / (1024*1024 / 4)) * vfs.f_bsize < setting_MaxCrashReportsSize
- ) {
- error_msg_and_die("Low free disk space detected, aborting dump");
+ if (statvfs(DEBUG_DUMPS_DIR, &vfs) != 0)
+ {
+ perror_msg_and_die("statvfs('%s')", DEBUG_DUMPS_DIR);
+ }
+
+ /* Check that at least MaxCrashReportsSize/4 MBs are free */
+
+ /* fs_free_mb_x4 ~= vfs.f_bfree * vfs.f_bsize * 4, expressed in MBytes.
+ * Need to neither overflow nor round f_bfree down too much. */
+ unsigned long fs_free_mb_x4 = ((unsigned long long)vfs.f_bfree / (1024/4)) * vfs.f_bsize / 1024;
+ if (fs_free_mb_x4 < setting_MaxCrashReportsSize)
+ {
+ error_msg_and_die("aborting dump: only %luMiB is available on %s\n", fs_free_mb_x4 / 4, DEBUG_DUMPS_DIR);
}
}