Skip to content

Commit ad5ceb6

Browse files
committed
fix off-by-one errors in fsremap/src/arch/mem_linux.cc
1 parent c1bd8c5 commit ad5ceb6

File tree

1 file changed

+38
-24
lines changed

1 file changed

+38
-24
lines changed

fsremap/src/arch/mem_linux.cc

+38-24
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,31 @@
2929
#include "mem_linux.hh"
3030

3131
#if defined(FT_HAVE_ERRNO_H)
32-
# include <errno.h> // for errno
32+
#include <errno.h> // for errno
3333
#elif defined(FT_HAVE_CERRNO)
34-
# include <cerrno> // for errno
34+
#include <cerrno> // for errno
3535
#endif
3636
#if defined(FT_HAVE_STDIO_H)
37-
# include <stdio.h> // for FILE, fopen(), fclose()
37+
#include <stdio.h> // for FILE, fopen(), fclose()
3838
#elif defined(FT_HAVE_CSTDIO)
39-
# include <cstdio> // for FILE, fopen(), fclose()
39+
#include <cstdio> // for FILE, fopen(), fclose()
4040
#endif
4141
#if defined(FT_HAVE_STRING_H)
42-
# include <string.h> // for strcmp()
42+
#include <string.h> // for strcmp()
4343
#elif defined(FT_HAVE_CSTRING)
44-
# include <cstring> // for strcmp()
44+
#include <cstring> // for strcmp()
4545
#endif
4646

47-
4847
#include "../log.hh" // for ff_log()
4948

50-
5149
FT_ARCH_NAMESPACE_BEGIN
5250

5351
/**
5452
* return an approximation of free system memory in bytes,
5553
* or 0 if cannot be determined
5654
*/
5755
ft_uoff ff_arch_linux_mem_system_free() {
58-
FILE * f = fopen("/proc/meminfo", "r");
56+
FILE *f = fopen("/proc/meminfo", "r");
5957
if (f == NULL) {
6058
ff_log(FC_WARN, errno, "failed to open /proc/meminfo, maybe /proc is not mounted?");
6159
return 0;
@@ -67,7 +65,7 @@ ft_uoff ff_arch_linux_mem_system_free() {
6765
int err;
6866

6967
while (left != 0) {
70-
if ((err = fscanf(f, "%256s %" FT_ULL " %8s\n", label, & n_ull, unit)) <= 0) {
68+
if ((err = fscanf(f, "%255s %" FT_ULL " %7s\n", label, &n_ull, unit)) <= 0) {
7169
if (ferror(f))
7270
ff_log(FC_WARN, errno, "error reading /proc/meminfo");
7371
break;
@@ -81,25 +79,43 @@ ft_uoff ff_arch_linux_mem_system_free() {
8179
if (strcmp(label, "MemFree:") && strcmp(label, "Buffers:") && strcmp(label, "Cached:"))
8280
continue;
8381
switch (unit[0]) {
84-
case 'k': scale = 10; break; // 2^10 = 1k
85-
case 'M': scale = 20; break; // 2^20 = 1M
86-
case 'G': scale = 30; break; // 2^30 = 1G
87-
case 'T': scale = 40; break; // 2^40 = 1T
88-
case 'P': scale = 50; break; // 2^50 = 1P
89-
case 'E': scale = 60; break; // 2^60 = 1E
90-
case 'Z': scale = 70; break; // 2^70 = 1Z
91-
case 'Y': scale = 80; break; // 2^80 = 1Y
92-
default: scale = 0; break;
82+
case 'k':
83+
scale = 10;
84+
break; // 2^10 = 1k
85+
case 'M':
86+
scale = 20;
87+
break; // 2^20 = 1M
88+
case 'G':
89+
scale = 30;
90+
break; // 2^30 = 1G
91+
case 'T':
92+
scale = 40;
93+
break; // 2^40 = 1T
94+
case 'P':
95+
scale = 50;
96+
break; // 2^50 = 1P
97+
case 'E':
98+
scale = 60;
99+
break; // 2^60 = 1E
100+
case 'Z':
101+
scale = 70;
102+
break; // 2^70 = 1Z
103+
case 'Y':
104+
scale = 80;
105+
break; // 2^80 = 1Y
106+
default:
107+
scale = 0;
108+
break;
93109
}
94110
/* overflow? then approximate.. */
95-
if (scale >= 8*sizeof(ft_ull) || n_ull > (ft_ull)-1 >> scale)
111+
if (scale >= 8 * sizeof(ft_ull) || n_ull > (ft_ull)-1 >> scale)
96112
n_ull = (ft_ull)-1;
97113
else
98114
n_ull <<= scale;
99115

100-
n = (ft_uoff) n_ull;
116+
n = (ft_uoff)n_ull;
101117
/* overflow? then approximate.. */
102-
if ((ft_ull) n != n_ull || n > (ft_uoff)-1 - total) {
118+
if ((ft_ull)n != n_ull || n > (ft_uoff)-1 - total) {
103119
total = (ft_uoff)-1;
104120
break;
105121
}
@@ -113,6 +129,4 @@ ft_uoff ff_arch_linux_mem_system_free() {
113129

114130
FT_ARCH_NAMESPACE_END
115131

116-
117132
#endif /* __linux__ */
118-

0 commit comments

Comments
 (0)