Merge lp:~cmiller/ubuntu/trusty/icewm/translations-cause-crash-lp447883 into lp:ubuntu/trusty/icewm
- Trusty (14.04)
- translations-cause-crash-lp447883
- Merge into trusty
Proposed by
Chad Miller
Status: | Work in progress |
---|---|
Proposed branch: | lp:~cmiller/ubuntu/trusty/icewm/translations-cause-crash-lp447883 |
Merge into: | lp:ubuntu/trusty/icewm |
Diff against target: |
400 lines (+285/-39) 4 files modified
.pc/applied-patches (+1/-0) debian/patches/series (+1/-0) debian/patches/tooltip-crash.patch (+189/-0) src/acpustatus.cc (+94/-39) |
To merge this branch: | bzr merge lp:~cmiller/ubuntu/trusty/icewm/translations-cause-crash-lp447883 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Dmitry Shachnev | Needs Fixing | ||
Ubuntu branches | Pending | ||
Review via email: mp+192245@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Unmerged revisions
- 19. By Chad Miller
-
Allocate memory that's needed to fill system status info, instead of fragile filing of static allocation.
In particular, some sprintf()s were kind of dumb when the format strings were retrieved from gettext translations. (LP: #447883)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file '.pc/applied-patches' | |||
2 | --- .pc/applied-patches 2013-06-29 17:59:17 +0000 | |||
3 | +++ .pc/applied-patches 2013-10-22 21:19:12 +0000 | |||
4 | @@ -14,3 +14,4 @@ | |||
5 | 14 | ftbfs-gcc-4.7.diff | 14 | ftbfs-gcc-4.7.diff |
6 | 15 | icon_property_fix | 15 | icon_property_fix |
7 | 16 | safe_get_argument | 16 | safe_get_argument |
8 | 17 | tooltip-crash.patch | ||
9 | 17 | 18 | ||
10 | === modified file 'debian/patches/series' | |||
11 | --- debian/patches/series 2013-06-29 17:59:17 +0000 | |||
12 | +++ debian/patches/series 2013-10-22 21:19:12 +0000 | |||
13 | @@ -15,3 +15,4 @@ | |||
14 | 15 | ftbfs-gcc-4.7.diff | 15 | ftbfs-gcc-4.7.diff |
15 | 16 | icon_property_fix | 16 | icon_property_fix |
16 | 17 | safe_get_argument | 17 | safe_get_argument |
17 | 18 | tooltip-crash.patch | ||
18 | 18 | 19 | ||
19 | === added file 'debian/patches/tooltip-crash.patch' | |||
20 | --- debian/patches/tooltip-crash.patch 1970-01-01 00:00:00 +0000 | |||
21 | +++ debian/patches/tooltip-crash.patch 2013-10-22 21:19:12 +0000 | |||
22 | @@ -0,0 +1,189 @@ | |||
23 | 1 | Index: icewm/src/acpustatus.cc | ||
24 | 2 | =================================================================== | ||
25 | 3 | --- icewm.orig/src/acpustatus.cc 2013-10-22 16:48:27.202406021 -0400 | ||
26 | 4 | +++ icewm/src/acpustatus.cc 2013-10-22 16:56:24.396772296 -0400 | ||
27 | 5 | @@ -213,38 +213,79 @@ | ||
28 | 6 | |||
29 | 7 | void CPUStatus::updateToolTip() { | ||
30 | 8 | #ifdef linux | ||
31 | 9 | - char load[31], ram[31] = "", swap[31] = "", acpitemp[61] = "", cpufreq[31] = ""; | ||
32 | 10 | + const char LOAD_FORMAT[] = "CPU Load: %3.2f %3.2f %3.2f, %d"; | ||
33 | 11 | + const float FLOAT_65K = 65536.0; | ||
34 | 12 | + const float FLOAT_1M = 1048576.0f; | ||
35 | 13 | + char *load = NULL, *ram = NULL, *swap = NULL, *cpufreq = NULL; | ||
36 | 14 | + char acpitemp[61]; | ||
37 | 15 | struct sysinfo sys; | ||
38 | 16 | double l1, l5, l15; | ||
39 | 17 | + int size; | ||
40 | 18 | |||
41 | 19 | sysinfo(&sys); | ||
42 | 20 | - l1 = (float)sys.loads[0] / 65536.0; | ||
43 | 21 | - l5 = (float)sys.loads[1] / 65536.0; | ||
44 | 22 | - l15 = (float)sys.loads[2] / 65536.0; | ||
45 | 23 | + l1 = (float)sys.loads[0] / FLOAT_65K; | ||
46 | 24 | + l5 = (float)sys.loads[1] / FLOAT_65K; | ||
47 | 25 | + l15 = (float)sys.loads[2] / FLOAT_65K; | ||
48 | 26 | + | ||
49 | 27 | + size = snprintf(NULL, 0, _(LOAD_FORMAT), l1, l5, l15, sys.procs); | ||
50 | 28 | + if (size > 0) | ||
51 | 29 | + load = new char[size + 1]; | ||
52 | 30 | + if (load) | ||
53 | 31 | + sprintf(load, _(LOAD_FORMAT), l1, l5, l15, sys.procs); | ||
54 | 32 | |||
55 | 33 | - sprintf(load, _("CPU Load: %3.2f %3.2f %3.2f, %d"), l1, l5, l15, sys.procs); | ||
56 | 34 | if (ShowRamUsage) { | ||
57 | 35 | - float tr =(float)sys.totalram * (float)sys.mem_unit / 1048576.0f; | ||
58 | 36 | - float fr =(float)sys.freeram * (float)sys.mem_unit / 1048576.0f; | ||
59 | 37 | - sprintf(ram, _("\nRam: %5.2f/%.2fM"), tr, fr); | ||
60 | 38 | + const char RAM_FORMAT[] = "\nRam: %5.2f/%.2fM"; | ||
61 | 39 | + float tr =(float)sys.totalram * (float)sys.mem_unit / FLOAT_1M; | ||
62 | 40 | + float fr =(float)sys.freeram * (float)sys.mem_unit / FLOAT_1M; | ||
63 | 41 | + size = snprintf(NULL, 0, _(RAM_FORMAT), tr, fr); | ||
64 | 42 | + if (size > 0) | ||
65 | 43 | + ram = new char[size + 1]; | ||
66 | 44 | + if (ram) | ||
67 | 45 | + sprintf(ram, _(RAM_FORMAT), tr, fr); | ||
68 | 46 | } | ||
69 | 47 | if (ShowSwapUsage) { | ||
70 | 48 | - float ts =(float)sys.totalswap * (float)sys.mem_unit / 1048576.0f; | ||
71 | 49 | - float fs =(float)sys.freeswap * (float)sys.mem_unit / 1048576.0f; | ||
72 | 50 | - sprintf(swap, _("\nSwap: %.2f/%.2fM"), ts, fs); | ||
73 | 51 | + const char SWAP_FORMAT[] = "\nSwap: %.2f/%.2fM"; | ||
74 | 52 | + float ts =(float)sys.totalswap * (float)sys.mem_unit / FLOAT_1M; | ||
75 | 53 | + float fs =(float)sys.freeswap * (float)sys.mem_unit / FLOAT_1M; | ||
76 | 54 | + size = snprintf(NULL, 0, _(SWAP_FORMAT), ts, fs); | ||
77 | 55 | + if (size > 0) | ||
78 | 56 | + swap = new char[size + 1]; | ||
79 | 57 | + if (swap) | ||
80 | 58 | + sprintf(swap, _(SWAP_FORMAT), ts, fs); | ||
81 | 59 | } | ||
82 | 60 | if (ShowAcpiTemp) { | ||
83 | 61 | - int headlen; | ||
84 | 62 | - sprintf(acpitemp, _("\nACPI Temp:")); | ||
85 | 63 | - headlen = strlen(acpitemp); | ||
86 | 64 | - getAcpiTemp(acpitemp + headlen, (sizeof(acpitemp) - headlen) / sizeof(char)); | ||
87 | 65 | + size = snprintf(acpitemp, sizeof(acpitemp), _("\nACPI Temp:")); | ||
88 | 66 | + if (size < 0) { | ||
89 | 67 | + acpitemp[0] = '\0'; | ||
90 | 68 | + } else if (static_cast<size_t>(size) >= sizeof(acpitemp)) { | ||
91 | 69 | + acpitemp[sizeof(acpitemp) - 1] = '\0'; | ||
92 | 70 | + } else { | ||
93 | 71 | + int headlen = strlen(acpitemp); | ||
94 | 72 | + getAcpiTemp(acpitemp + headlen, (sizeof(acpitemp) - headlen) / sizeof(char)); | ||
95 | 73 | + } | ||
96 | 74 | } | ||
97 | 75 | if (ShowCpuFreq) { | ||
98 | 76 | - sprintf(cpufreq, _("\nCPU Freq: %.3fGHz"), getCpuFreq(0) / 1e6); | ||
99 | 77 | - } | ||
100 | 78 | - char *loadmsg = cstrJoin(load, ram, swap, acpitemp, cpufreq, NULL); | ||
101 | 79 | + const char CPUFREQ_FORMAT[] = "\nCPU Freq: %.3fGHz"; | ||
102 | 80 | + float freq = getCpuFreq(0) / 1e6; | ||
103 | 81 | + size = snprintf(NULL, 0, _(CPUFREQ_FORMAT), freq); | ||
104 | 82 | + if (size > 0) | ||
105 | 83 | + cpufreq = new char[size + 1]; | ||
106 | 84 | + if (cpufreq) | ||
107 | 85 | + sprintf(cpufreq, _(CPUFREQ_FORMAT), freq); | ||
108 | 86 | + } | ||
109 | 87 | + char *loadmsg = cstrJoin(load ? load : "", | ||
110 | 88 | + ram ? ram : "", | ||
111 | 89 | + swap ? swap : "", | ||
112 | 90 | + acpitemp, | ||
113 | 91 | + cpufreq ? cpufreq : "", NULL); | ||
114 | 92 | |||
115 | 93 | setToolTip(ustring(loadmsg)); | ||
116 | 94 | + delete [] loadmsg; | ||
117 | 95 | + | ||
118 | 96 | + delete [] load; | ||
119 | 97 | + delete [] ram; | ||
120 | 98 | + delete [] swap; | ||
121 | 99 | + delete [] cpufreq; | ||
122 | 100 | #elif defined HAVE_GETLOADAVG2 | ||
123 | 101 | char load[31]; // enough for "CPU Load: 999.99 999.99 999.99\0" | ||
124 | 102 | double loadavg[3]; | ||
125 | 103 | @@ -282,7 +323,7 @@ | ||
126 | 104 | |||
127 | 105 | int CPUStatus::getAcpiTemp(char *tempbuf, int buflen) { | ||
128 | 106 | int retbuflen = 0; | ||
129 | 107 | - char namebuf[64]; | ||
130 | 108 | + char namebuf[PATH_MAX]; | ||
131 | 109 | char buf[64]; | ||
132 | 110 | |||
133 | 111 | memset(tempbuf, 0, buflen); | ||
134 | 112 | @@ -291,25 +332,28 @@ | ||
135 | 113 | struct dirent *de; | ||
136 | 114 | |||
137 | 115 | while ((de = readdir(dir)) != NULL) { | ||
138 | 116 | - int fd, seglen; | ||
139 | 117 | + int fd; | ||
140 | 118 | |||
141 | 119 | if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) | ||
142 | 120 | continue; | ||
143 | 121 | |||
144 | 122 | sprintf(namebuf, "/proc/acpi/thermal_zone/%s/temperature", de->d_name); | ||
145 | 123 | fd = open(namebuf, O_RDONLY); | ||
146 | 124 | - if (fd != -1) { | ||
147 | 125 | + if (fd >= 0) { | ||
148 | 126 | int len = read(fd, buf, sizeof(buf) - 1); | ||
149 | 127 | - buf[len - 1] = '\0'; | ||
150 | 128 | - seglen = strlen(buf + len - 7); | ||
151 | 129 | - if (retbuflen + seglen >= buflen) { | ||
152 | 130 | - retbuflen = -retbuflen; | ||
153 | 131 | - close(fd); | ||
154 | 132 | - closedir(dir); | ||
155 | 133 | - break; | ||
156 | 134 | + if (len >= 7) { | ||
157 | 135 | + int seglen; | ||
158 | 136 | + buf[len - 1] = '\0'; | ||
159 | 137 | + seglen = strlen(buf + len - 7); | ||
160 | 138 | + if (retbuflen + seglen >= buflen) { | ||
161 | 139 | + retbuflen = -retbuflen; | ||
162 | 140 | + close(fd); | ||
163 | 141 | + closedir(dir); | ||
164 | 142 | + break; | ||
165 | 143 | + } | ||
166 | 144 | + retbuflen += seglen; | ||
167 | 145 | + strncat(tempbuf, buf + len - 7, seglen); | ||
168 | 146 | } | ||
169 | 147 | - retbuflen += seglen; | ||
170 | 148 | - strncat(tempbuf, buf + len - 7, seglen); | ||
171 | 149 | close(fd); | ||
172 | 150 | } | ||
173 | 151 | } | ||
174 | 152 | @@ -319,17 +363,28 @@ | ||
175 | 153 | } | ||
176 | 154 | |||
177 | 155 | float CPUStatus::getCpuFreq(unsigned int cpu) { | ||
178 | 156 | - char buf[16], namebuf[64]; | ||
179 | 157 | - int fd; | ||
180 | 158 | + const char CPUFREQ_PATH_FORMAT[] = | ||
181 | 159 | + "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq"; | ||
182 | 160 | + char *namebuf = NULL; | ||
183 | 161 | + int namebuf_size; | ||
184 | 162 | float cpufreq = 0; | ||
185 | 163 | |||
186 | 164 | - sprintf(namebuf, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu); | ||
187 | 165 | - fd = open(namebuf, O_RDONLY); | ||
188 | 166 | - if (fd != -1) { | ||
189 | 167 | - int len = read(fd, buf, sizeof(buf) - 1); | ||
190 | 168 | - buf[len-1] = '\0'; | ||
191 | 169 | - sscanf(buf, "%f", &cpufreq); | ||
192 | 170 | - close(fd); | ||
193 | 171 | + namebuf_size = snprintf(NULL, 0, CPUFREQ_PATH_FORMAT, cpu); | ||
194 | 172 | + if (namebuf_size > 0) | ||
195 | 173 | + namebuf = new char[namebuf_size + 1]; | ||
196 | 174 | + if (namebuf) { | ||
197 | 175 | + sprintf(namebuf, CPUFREQ_PATH_FORMAT, cpu); | ||
198 | 176 | + int fd = open(namebuf, O_RDONLY); | ||
199 | 177 | + if (fd >= 0) { | ||
200 | 178 | + char buf[16]; | ||
201 | 179 | + int len = read(fd, buf, sizeof(buf) - 1); | ||
202 | 180 | + if (len > 0) { | ||
203 | 181 | + buf[len-1] = '\0'; | ||
204 | 182 | + sscanf(buf, "%f", &cpufreq); | ||
205 | 183 | + } | ||
206 | 184 | + close(fd); | ||
207 | 185 | + } | ||
208 | 186 | + delete [] namebuf; | ||
209 | 187 | } | ||
210 | 188 | return(cpufreq); | ||
211 | 189 | } | ||
212 | 0 | 190 | ||
213 | === modified file 'src/acpustatus.cc' | |||
214 | --- src/acpustatus.cc 2010-01-04 21:43:29 +0000 | |||
215 | +++ src/acpustatus.cc 2013-10-22 21:19:12 +0000 | |||
216 | @@ -213,38 +213,79 @@ | |||
217 | 213 | 213 | ||
218 | 214 | void CPUStatus::updateToolTip() { | 214 | void CPUStatus::updateToolTip() { |
219 | 215 | #ifdef linux | 215 | #ifdef linux |
221 | 216 | char load[31], ram[31] = "", swap[31] = "", acpitemp[61] = "", cpufreq[31] = ""; | 216 | const char LOAD_FORMAT[] = "CPU Load: %3.2f %3.2f %3.2f, %d"; |
222 | 217 | const float FLOAT_65K = 65536.0; | ||
223 | 218 | const float FLOAT_1M = 1048576.0f; | ||
224 | 219 | char *load = NULL, *ram = NULL, *swap = NULL, *cpufreq = NULL; | ||
225 | 220 | char acpitemp[61]; | ||
226 | 217 | struct sysinfo sys; | 221 | struct sysinfo sys; |
227 | 218 | double l1, l5, l15; | 222 | double l1, l5, l15; |
228 | 223 | int size; | ||
229 | 219 | 224 | ||
230 | 220 | sysinfo(&sys); | 225 | sysinfo(&sys); |
236 | 221 | l1 = (float)sys.loads[0] / 65536.0; | 226 | l1 = (float)sys.loads[0] / FLOAT_65K; |
237 | 222 | l5 = (float)sys.loads[1] / 65536.0; | 227 | l5 = (float)sys.loads[1] / FLOAT_65K; |
238 | 223 | l15 = (float)sys.loads[2] / 65536.0; | 228 | l15 = (float)sys.loads[2] / FLOAT_65K; |
239 | 224 | 229 | ||
240 | 225 | sprintf(load, _("CPU Load: %3.2f %3.2f %3.2f, %d"), l1, l5, l15, sys.procs); | 230 | size = snprintf(NULL, 0, _(LOAD_FORMAT), l1, l5, l15, sys.procs); |
241 | 231 | if (size > 0) | ||
242 | 232 | load = new char[size + 1]; | ||
243 | 233 | if (load) | ||
244 | 234 | sprintf(load, _(LOAD_FORMAT), l1, l5, l15, sys.procs); | ||
245 | 235 | |||
246 | 226 | if (ShowRamUsage) { | 236 | if (ShowRamUsage) { |
250 | 227 | float tr =(float)sys.totalram * (float)sys.mem_unit / 1048576.0f; | 237 | const char RAM_FORMAT[] = "\nRam: %5.2f/%.2fM"; |
251 | 228 | float fr =(float)sys.freeram * (float)sys.mem_unit / 1048576.0f; | 238 | float tr =(float)sys.totalram * (float)sys.mem_unit / FLOAT_1M; |
252 | 229 | sprintf(ram, _("\nRam: %5.2f/%.2fM"), tr, fr); | 239 | float fr =(float)sys.freeram * (float)sys.mem_unit / FLOAT_1M; |
253 | 240 | size = snprintf(NULL, 0, _(RAM_FORMAT), tr, fr); | ||
254 | 241 | if (size > 0) | ||
255 | 242 | ram = new char[size + 1]; | ||
256 | 243 | if (ram) | ||
257 | 244 | sprintf(ram, _(RAM_FORMAT), tr, fr); | ||
258 | 230 | } | 245 | } |
259 | 231 | if (ShowSwapUsage) { | 246 | if (ShowSwapUsage) { |
263 | 232 | float ts =(float)sys.totalswap * (float)sys.mem_unit / 1048576.0f; | 247 | const char SWAP_FORMAT[] = "\nSwap: %.2f/%.2fM"; |
264 | 233 | float fs =(float)sys.freeswap * (float)sys.mem_unit / 1048576.0f; | 248 | float ts =(float)sys.totalswap * (float)sys.mem_unit / FLOAT_1M; |
265 | 234 | sprintf(swap, _("\nSwap: %.2f/%.2fM"), ts, fs); | 249 | float fs =(float)sys.freeswap * (float)sys.mem_unit / FLOAT_1M; |
266 | 250 | size = snprintf(NULL, 0, _(SWAP_FORMAT), ts, fs); | ||
267 | 251 | if (size > 0) | ||
268 | 252 | swap = new char[size + 1]; | ||
269 | 253 | if (swap) | ||
270 | 254 | sprintf(swap, _(SWAP_FORMAT), ts, fs); | ||
271 | 235 | } | 255 | } |
272 | 236 | if (ShowAcpiTemp) { | 256 | if (ShowAcpiTemp) { |
277 | 237 | int headlen; | 257 | size = snprintf(acpitemp, sizeof(acpitemp), _("\nACPI Temp:")); |
278 | 238 | sprintf(acpitemp, _("\nACPI Temp:")); | 258 | if (size < 0) { |
279 | 239 | headlen = strlen(acpitemp); | 259 | acpitemp[0] = '\0'; |
280 | 240 | getAcpiTemp(acpitemp + headlen, (sizeof(acpitemp) - headlen) / sizeof(char)); | 260 | } else if (static_cast<size_t>(size) >= sizeof(acpitemp)) { |
281 | 261 | acpitemp[sizeof(acpitemp) - 1] = '\0'; | ||
282 | 262 | } else { | ||
283 | 263 | int headlen = strlen(acpitemp); | ||
284 | 264 | getAcpiTemp(acpitemp + headlen, (sizeof(acpitemp) - headlen) / sizeof(char)); | ||
285 | 265 | } | ||
286 | 241 | } | 266 | } |
287 | 242 | if (ShowCpuFreq) { | 267 | if (ShowCpuFreq) { |
289 | 243 | sprintf(cpufreq, _("\nCPU Freq: %.3fGHz"), getCpuFreq(0) / 1e6); | 268 | const char CPUFREQ_FORMAT[] = "\nCPU Freq: %.3fGHz"; |
290 | 269 | float freq = getCpuFreq(0) / 1e6; | ||
291 | 270 | size = snprintf(NULL, 0, _(CPUFREQ_FORMAT), freq); | ||
292 | 271 | if (size > 0) | ||
293 | 272 | cpufreq = new char[size + 1]; | ||
294 | 273 | if (cpufreq) | ||
295 | 274 | sprintf(cpufreq, _(CPUFREQ_FORMAT), freq); | ||
296 | 244 | } | 275 | } |
298 | 245 | char *loadmsg = cstrJoin(load, ram, swap, acpitemp, cpufreq, NULL); | 276 | char *loadmsg = cstrJoin(load ? load : "", |
299 | 277 | ram ? ram : "", | ||
300 | 278 | swap ? swap : "", | ||
301 | 279 | acpitemp, | ||
302 | 280 | cpufreq ? cpufreq : "", NULL); | ||
303 | 246 | 281 | ||
304 | 247 | setToolTip(ustring(loadmsg)); | 282 | setToolTip(ustring(loadmsg)); |
305 | 283 | delete [] loadmsg; | ||
306 | 284 | |||
307 | 285 | delete [] load; | ||
308 | 286 | delete [] ram; | ||
309 | 287 | delete [] swap; | ||
310 | 288 | delete [] cpufreq; | ||
311 | 248 | #elif defined HAVE_GETLOADAVG2 | 289 | #elif defined HAVE_GETLOADAVG2 |
312 | 249 | char load[31]; // enough for "CPU Load: 999.99 999.99 999.99\0" | 290 | char load[31]; // enough for "CPU Load: 999.99 999.99 999.99\0" |
313 | 250 | double loadavg[3]; | 291 | double loadavg[3]; |
314 | @@ -282,7 +323,7 @@ | |||
315 | 282 | 323 | ||
316 | 283 | int CPUStatus::getAcpiTemp(char *tempbuf, int buflen) { | 324 | int CPUStatus::getAcpiTemp(char *tempbuf, int buflen) { |
317 | 284 | int retbuflen = 0; | 325 | int retbuflen = 0; |
319 | 285 | char namebuf[64]; | 326 | char namebuf[PATH_MAX]; |
320 | 286 | char buf[64]; | 327 | char buf[64]; |
321 | 287 | 328 | ||
322 | 288 | memset(tempbuf, 0, buflen); | 329 | memset(tempbuf, 0, buflen); |
323 | @@ -291,25 +332,28 @@ | |||
324 | 291 | struct dirent *de; | 332 | struct dirent *de; |
325 | 292 | 333 | ||
326 | 293 | while ((de = readdir(dir)) != NULL) { | 334 | while ((de = readdir(dir)) != NULL) { |
328 | 294 | int fd, seglen; | 335 | int fd; |
329 | 295 | 336 | ||
330 | 296 | if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) | 337 | if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) |
331 | 297 | continue; | 338 | continue; |
332 | 298 | 339 | ||
333 | 299 | sprintf(namebuf, "/proc/acpi/thermal_zone/%s/temperature", de->d_name); | 340 | sprintf(namebuf, "/proc/acpi/thermal_zone/%s/temperature", de->d_name); |
334 | 300 | fd = open(namebuf, O_RDONLY); | 341 | fd = open(namebuf, O_RDONLY); |
336 | 301 | if (fd != -1) { | 342 | if (fd >= 0) { |
337 | 302 | int len = read(fd, buf, sizeof(buf) - 1); | 343 | int len = read(fd, buf, sizeof(buf) - 1); |
345 | 303 | buf[len - 1] = '\0'; | 344 | if (len >= 7) { |
346 | 304 | seglen = strlen(buf + len - 7); | 345 | int seglen; |
347 | 305 | if (retbuflen + seglen >= buflen) { | 346 | buf[len - 1] = '\0'; |
348 | 306 | retbuflen = -retbuflen; | 347 | seglen = strlen(buf + len - 7); |
349 | 307 | close(fd); | 348 | if (retbuflen + seglen >= buflen) { |
350 | 308 | closedir(dir); | 349 | retbuflen = -retbuflen; |
351 | 309 | break; | 350 | close(fd); |
352 | 351 | closedir(dir); | ||
353 | 352 | break; | ||
354 | 353 | } | ||
355 | 354 | retbuflen += seglen; | ||
356 | 355 | strncat(tempbuf, buf + len - 7, seglen); | ||
357 | 310 | } | 356 | } |
358 | 311 | retbuflen += seglen; | ||
359 | 312 | strncat(tempbuf, buf + len - 7, seglen); | ||
360 | 313 | close(fd); | 357 | close(fd); |
361 | 314 | } | 358 | } |
362 | 315 | } | 359 | } |
363 | @@ -319,17 +363,28 @@ | |||
364 | 319 | } | 363 | } |
365 | 320 | 364 | ||
366 | 321 | float CPUStatus::getCpuFreq(unsigned int cpu) { | 365 | float CPUStatus::getCpuFreq(unsigned int cpu) { |
369 | 322 | char buf[16], namebuf[64]; | 366 | const char CPUFREQ_PATH_FORMAT[] = |
370 | 323 | int fd; | 367 | "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq"; |
371 | 368 | char *namebuf = NULL; | ||
372 | 369 | int namebuf_size; | ||
373 | 324 | float cpufreq = 0; | 370 | float cpufreq = 0; |
374 | 325 | 371 | ||
382 | 326 | sprintf(namebuf, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu); | 372 | namebuf_size = snprintf(NULL, 0, CPUFREQ_PATH_FORMAT, cpu); |
383 | 327 | fd = open(namebuf, O_RDONLY); | 373 | if (namebuf_size > 0) |
384 | 328 | if (fd != -1) { | 374 | namebuf = new char[namebuf_size + 1]; |
385 | 329 | int len = read(fd, buf, sizeof(buf) - 1); | 375 | if (namebuf) { |
386 | 330 | buf[len-1] = '\0'; | 376 | sprintf(namebuf, CPUFREQ_PATH_FORMAT, cpu); |
387 | 331 | sscanf(buf, "%f", &cpufreq); | 377 | int fd = open(namebuf, O_RDONLY); |
388 | 332 | close(fd); | 378 | if (fd >= 0) { |
389 | 379 | char buf[16]; | ||
390 | 380 | int len = read(fd, buf, sizeof(buf) - 1); | ||
391 | 381 | if (len > 0) { | ||
392 | 382 | buf[len-1] = '\0'; | ||
393 | 383 | sscanf(buf, "%f", &cpufreq); | ||
394 | 384 | } | ||
395 | 385 | close(fd); | ||
396 | 386 | } | ||
397 | 387 | delete [] namebuf; | ||
398 | 333 | } | 388 | } |
399 | 334 | return(cpufreq); | 389 | return(cpufreq); |
400 | 335 | } | 390 | } |
Thanks for your work here.
- The patch contains come unrelated changes (like 65536.0 → FLOAT_65K change), please drop that and keep diff minimal;
- Please submit the patch upstream so that we don't have to carry a delta;
- Please add a proper changelog entry (with credits to original patch author).