diff --git a/debian/changelog b/debian/changelog
index 0253e5a..b24309e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+libsysactivity (0.5.4-6) unstable; urgency=low
+
+  * Fix a number of resource leaks reported by cppcheck.
+
+ -- Niels Thykier <niels@thykier.net>  Tue, 28 Sep 2010 20:48:01 +0200
+
 libsysactivity (0.5.4-5) unstable; urgency=low
 
   * Added patch to fix the issue with calculating memory on kFreeBSD
diff --git a/debian/patches/cppcheck-leaks.patch b/debian/patches/cppcheck-leaks.patch
new file mode 100644
index 0000000..3f48abb
--- /dev/null
+++ b/debian/patches/cppcheck-leaks.patch
@@ -0,0 +1,74 @@
+Description: Fixes a number of leaks reported by cppcheck.
+Applied-Upstream: yes
+
+diff --git a/src/FreeBSD/data_storage.c b/src/FreeBSD/data_storage.c
+index 032be06..971a361 100644
+--- a/src/FreeBSD/data_storage.c
++++ b/src/FreeBSD/data_storage.c
+@@ -130,9 +130,12 @@ static int read_devs(int* number_devs, struct devstat** devs) {
+ 
+ 	len = (*number_devs * sizeof(struct devstat)) + sizeof(long);
+ 	if (len > buffer_size) {
+-		buffer = realloc(buffer, len);
+-		if (buffer == NULL)
+-			return ENOMEM;
++		void *tmpbuffer = realloc(buffer, len);
++		if (tmpbuffer == NULL){
++                        free(buffer);
++                        return ENOMEM;
++                }
++                buffer = tmpbuffer;
+ 		buffer_size = len;
+ 	}
+ 
+diff --git a/src/FreeBSD/process.c b/src/FreeBSD/process.c
+index 47d7121..a25ea79 100644
+--- a/src/FreeBSD/process.c
++++ b/src/FreeBSD/process.c
+@@ -131,9 +131,12 @@ static int refresh_processes(size_t* len) {
+ 		return ENOSYS;
+ 
+ 	if (*len > processes_size) {
+-		processes = realloc(processes, *len);
+-		if (processes == NULL)
++		struct kinfo_proc* tmpprocesses = realloc(processes, *len);
++		if (tmpprocesses == NULL){
++			free(processes);
+ 			return ENOMEM;
++                }
++                processes = tmpprocesses;
+ 		processes_size = *len;
+ 	}
+ 	if (sysctl(mib, 3, processes, len, NULL, 0) == -1)
+diff --git a/src/Linux/data_storage.c b/src/Linux/data_storage.c
+index 98373fd..59f26a7 100644
+--- a/src/Linux/data_storage.c
++++ b/src/Linux/data_storage.c
+@@ -135,8 +135,10 @@ static int read_stat_file(struct sa_data_storage* dst, char* dev_name, size_t na
+ 	file_stat = fopen(line_buffer, "r");
+ 	if (file_stat == NULL)
+ 		return EIO;
+-	if (fgets(line_buffer, sizeof line_buffer, file_stat) == NULL)
++	if (fgets(line_buffer, sizeof line_buffer, file_stat) == NULL){
++ 		fclose(file_stat);
+ 		return EIO;
++        }
+ 
+ 	char* pos = line_buffer;
+ 	errno = 0;
+diff --git a/src/Linux/process.c b/src/Linux/process.c
+index 1a1bd4a..30bb902 100644
+--- a/src/Linux/process.c
++++ b/src/Linux/process.c
+@@ -134,8 +134,10 @@ static int read_stats(struct sa_process* dst, pid_t pid) {
+ 	FILE* file = fopen(path, "r");
+ 	if (file == NULL)
+ 		return ESRCH;
+-	if (fgets(line_buffer, sizeof line_buffer, file) == NULL)
++	if (fgets(line_buffer, sizeof line_buffer, file) == NULL){
++                fclose(file);
+ 		return EIO;
++        }
+ 
+ 	dst->pid = pid;
+ 	char* pos = skip_values(line_buffer, 2);
diff --git a/debian/patches/series b/debian/patches/series
index eb0dccd..011c821 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@ mem-swap-issue.patch
 freebsd-memory-int-overflow.patch
 freebsd-memory-64bit.patch
 disable-cpu-idle-test.patch
+cppcheck-leaks.patch
diff --git a/src/FreeBSD/data_storage.c b/src/FreeBSD/data_storage.c
index 032be06..971a361 100644
--- a/src/FreeBSD/data_storage.c
+++ b/src/FreeBSD/data_storage.c
@@ -130,9 +130,12 @@ static int read_devs(int* number_devs, struct devstat** devs) {
 
 	len = (*number_devs * sizeof(struct devstat)) + sizeof(long);
 	if (len > buffer_size) {
-		buffer = realloc(buffer, len);
-		if (buffer == NULL)
-			return ENOMEM;
+		void *tmpbuffer = realloc(buffer, len);
+		if (tmpbuffer == NULL){
+                        free(buffer);
+                        return ENOMEM;
+                }
+                buffer = tmpbuffer;
 		buffer_size = len;
 	}
 
diff --git a/src/FreeBSD/process.c b/src/FreeBSD/process.c
index 47d7121..a25ea79 100644
--- a/src/FreeBSD/process.c
+++ b/src/FreeBSD/process.c
@@ -131,9 +131,12 @@ static int refresh_processes(size_t* len) {
 		return ENOSYS;
 
 	if (*len > processes_size) {
-		processes = realloc(processes, *len);
-		if (processes == NULL)
+		struct kinfo_proc* tmpprocesses = realloc(processes, *len);
+		if (tmpprocesses == NULL){
+			free(processes);
 			return ENOMEM;
+                }
+                processes = tmpprocesses;
 		processes_size = *len;
 	}
 	if (sysctl(mib, 3, processes, len, NULL, 0) == -1)
diff --git a/src/Linux/data_storage.c b/src/Linux/data_storage.c
index 98373fd..59f26a7 100644
--- a/src/Linux/data_storage.c
+++ b/src/Linux/data_storage.c
@@ -135,8 +135,10 @@ static int read_stat_file(struct sa_data_storage* dst, char* dev_name, size_t na
 	file_stat = fopen(line_buffer, "r");
 	if (file_stat == NULL)
 		return EIO;
-	if (fgets(line_buffer, sizeof line_buffer, file_stat) == NULL)
+	if (fgets(line_buffer, sizeof line_buffer, file_stat) == NULL){
+ 		fclose(file_stat);
 		return EIO;
+        }
 
 	char* pos = line_buffer;
 	errno = 0;
diff --git a/src/Linux/process.c b/src/Linux/process.c
index 1a1bd4a..30bb902 100644
--- a/src/Linux/process.c
+++ b/src/Linux/process.c
@@ -134,8 +134,10 @@ static int read_stats(struct sa_process* dst, pid_t pid) {
 	FILE* file = fopen(path, "r");
 	if (file == NULL)
 		return ESRCH;
-	if (fgets(line_buffer, sizeof line_buffer, file) == NULL)
+	if (fgets(line_buffer, sizeof line_buffer, file) == NULL){
+                fclose(file);
 		return EIO;
+        }
 
 	dst->pid = pid;
 	char* pos = skip_values(line_buffer, 2);
