nsxiv51854c6
Fixed leakage of pipe descriptors in case of failing fork
+10 −8
1 file changed
- M main.c +10 −8
| @@ -262,20 +262,22 @@ void open_info(void) | |||
| 262 | 262 | ||
| 263 | 263 | if (pipe(pfd) < 0) | |
| 264 | 264 | return; | |
| 265 | − | pid = fork(); | |
| 266 | − | if (pid > 0) { | |
| 267 | − | close(pfd[1]); | |
| 268 | − | fcntl(pfd[0], F_SETFL, O_NONBLOCK); | |
| 269 | − | info.fd = pfd[0]; | |
| 270 | − | info.i = info.lastsep = 0; | |
| 271 | − | info.open = true; | |
| 272 | − | } else if (pid == 0) { | |
| 265 | + | if ((pid = fork()) == 0) { | |
| 273 | 266 | close(pfd[0]); | |
| 274 | 267 | dup2(pfd[1], 1); | |
| 275 | 268 | execl(info.cmd, info.cmd, files[fileidx].name, NULL); | |
| 276 | 269 | warn("could not exec: %s", info.cmd); | |
| 277 | 270 | exit(EXIT_FAILURE); | |
| 278 | 271 | } | |
| 272 | + | close(pfd[1]); | |
| 273 | + | if (pid < 0) { | |
| 274 | + | close(pfd[0]); | |
| 275 | + | } else { | |
| 276 | + | fcntl(pfd[0], F_SETFL, O_NONBLOCK); | |
| 277 | + | info.fd = pfd[0]; | |
| 278 | + | info.i = info.lastsep = 0; | |
| 279 | + | info.open = true; | |
| 280 | + | } | |
| 279 | 281 | } | |
| 280 | 282 | ||
| 281 | 283 | void read_info(void) | |