[lttng-dev] [PATCH lttng-tools 1/2] Fix: lttng-crash: fd leak

Jonathan Rajotte jonathan.rajotte-julien at efficios.com
Thu Sep 3 17:52:06 EDT 2015


At the same time make sure to have on one exit-point.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
---
 src/bin/lttng-crash/lttng-crash.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/bin/lttng-crash/lttng-crash.c b/src/bin/lttng-crash/lttng-crash.c
index 4f1efe9..8e57034 100644
--- a/src/bin/lttng-crash/lttng-crash.c
+++ b/src/bin/lttng-crash/lttng-crash.c
@@ -103,7 +103,7 @@ enum rb_modes {
 
 struct crash_abi_unknown {
 	uint8_t magic[RB_CRASH_DUMP_ABI_MAGIC_LEN];
-	uint64_t mmap_length;	/* Overall lenght of crash record */
+	uint64_t mmap_length;	/* Overall length of crash record */
 	uint16_t endian;	/*
 				 * { 0x12, 0x34 }: big endian
 				 * { 0x34, 0x12 }: little endian
@@ -326,26 +326,30 @@ int copy_file(const char *file_dest, const char *file_src)
 	int fd_src, fd_dest;
 	ssize_t readlen, writelen;
 	char buf[COPY_BUFLEN];
+	int ret;
 
 	DBG("Copy metadata file '%s' into '%s'", file_src, file_dest);
 
 	fd_src = open(file_src, O_RDONLY);
 	if (fd_src < 0) {
 		PERROR("Error opening %s for reading", file_src);
-		return fd_src;
+		ret = fd_src;
+		goto error;
 	}
 	fd_dest = open(file_dest, O_RDWR | O_CREAT | O_EXCL,
 			S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
 	if (fd_dest < 0) {
 		PERROR("Error opening %s for writing", file_dest);
-		return fd_dest;
+		ret = fd_dest;
+		goto error;
 	}
 
 	for (;;) {
 		readlen = lttng_read(fd_src, buf, COPY_BUFLEN);
 		if (readlen < 0) {
 			PERROR("Error reading input file");
-			return -1;
+			ret = -1;
+			goto error;
 		}
 		if (!readlen) {
 			break;
@@ -353,10 +357,26 @@ int copy_file(const char *file_dest, const char *file_src)
 		writelen = lttng_write(fd_dest, buf, readlen);
 		if (writelen < readlen) {
 			PERROR("Error writing to output file");
-			return -1;
+			ret = -1;
+			goto error;
 		}
 	}
+
+	ret = close(fd_src);
+	if (ret < 0) {
+		PERROR("Error closing %s", file_src);
+		goto error;
+	}
+
+	ret = close(fd_dest);
+	if (ret < 0) {
+		PERROR("Error closing %s", file_dest);
+		goto error;
+	}
+
 	return 0;
+error:
+	return ret;
 }
 
 static
-- 
2.1.4




More information about the lttng-dev mailing list