summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-25 10:33:07 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-25 10:38:42 -0500
commite985665d2d226cb42b52bfcad6fd5b1586ad57d7 (patch)
treee1dbc3753679aa9f677c4e7d49b7bd942e000e48
parent314b4b0a68d9ab35de981923a088fc8c8820caa5 (diff)
Add _cleanup_pclose_ and fix mismatching pipe close opened by popen()
Based-on-patch-by: Thomas Jarosch <thomas.jarosch@intra2net.com> cppcheck reported: [src/bootchart/svg.c:791]: (error) Mismatching allocation and deallocation: f
-rw-r--r--Makefile.am3
-rw-r--r--src/bootchart/svg.c6
-rw-r--r--src/shared/macro.h1
-rw-r--r--src/shared/util.c5
-rw-r--r--src/shared/util.h1
5 files changed, 13 insertions, 3 deletions
diff --git a/Makefile.am b/Makefile.am
index be3fa71409..f362b53728 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3084,6 +3084,9 @@ systemd_bootchart_SOURCES = \
src/bootchart/log.c \
src/bootchart/svg.c
+systemd_bootchart_LDADD = \
+ libsystemd-shared.la
+
MANPAGES += \
man/systemd-bootchart.1 \
man/bootchart.conf.5
diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
index 156918a94b..b9636e20a3 100644
--- a/src/bootchart/svg.c
+++ b/src/bootchart/svg.c
@@ -22,6 +22,8 @@
#include <sys/utsname.h>
#include "bootchart.h"
+#include "util.h"
+#include "macro.h"
#define time_to_graph(t) ((t) * scale_x)
@@ -702,7 +704,7 @@ static int ps_filter(struct ps_struct *ps)
static void svg_do_initcall(int count_only)
{
- FILE *f;
+ FILE _cleanup_pclose_ *f = NULL;
double t;
char func[256];
int ret;
@@ -787,8 +789,6 @@ static void svg_do_initcall(int count_only)
kcount++;
}
-
- fclose(f);
}
diff --git a/src/shared/macro.h b/src/shared/macro.h
index 29d91392f8..b307dedaa8 100644
--- a/src/shared/macro.h
+++ b/src/shared/macro.h
@@ -196,6 +196,7 @@ static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
#define _cleanup_free_ __attribute__((cleanup(freep)))
#define _cleanup_fclose_ __attribute__((cleanup(fclosep)))
+#define _cleanup_pclose_ __attribute__((cleanup(pclosep)))
#define _cleanup_close_ __attribute__((cleanup(closep)))
#define _cleanup_closedir_ __attribute__((cleanup(closedirp)))
#define _cleanup_umask_ __attribute__((cleanup(umaskp)))
diff --git a/src/shared/util.c b/src/shared/util.c
index 490399c910..969ef2bb90 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -5553,6 +5553,11 @@ void fclosep(FILE **f) {
fclose(*f);
}
+void pclosep(FILE **f) {
+ if (*f)
+ pclose(*f);
+}
+
void closep(int *fd) {
if (*fd >= 0)
close_nointr_nofail(*fd);
diff --git a/src/shared/util.h b/src/shared/util.h
index 202e15d481..223617c3ff 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -522,6 +522,7 @@ int get_home_dir(char **ret);
void freep(void *p);
void fclosep(FILE **f);
+void pclosep(FILE **f);
void closep(int *fd);
void closedirp(DIR **d);
void umaskp(mode_t *u);