0c2ab9
diff -Nupr a/squashfs-tools/action.c b/squashfs-tools/action.c
0c2ab9
--- a/squashfs-tools/action.c	2014-05-09 23:54:13.000000000 -0500
0c2ab9
+++ b/squashfs-tools/action.c	2019-04-18 10:59:53.140496887 -0500
0c2ab9
@@ -1094,8 +1094,14 @@ static int parse_sym_mode_args(struct ac
0c2ab9
 	for (i = 0; i < args; i++) {
0c2ab9
 		struct mode_data *entry = parse_sym_mode_arg(argv[i]);
0c2ab9
 
0c2ab9
-		if (entry == NULL)
0c2ab9
+		if (entry == NULL) {
0c2ab9
+			while (head) {
0c2ab9
+				cur = head;
0c2ab9
+				head = head->next;
0c2ab9
+				free(cur);
0c2ab9
+			}
0c2ab9
 			return 0;
0c2ab9
+		}
0c2ab9
 
0c2ab9
 		if (cur) {
0c2ab9
 			cur->next = entry;
0c2ab9
diff -Nupr a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c
0c2ab9
--- a/squashfs-tools/mksquashfs.c	2019-04-18 10:51:05.975460126 -0500
0c2ab9
+++ b/squashfs-tools/mksquashfs.c	2019-04-18 11:04:16.860682497 -0500
0c2ab9
@@ -3537,11 +3537,11 @@ void dir_scan2(struct dir_info *dir, str
0c2ab9
 			char *subpath = strdup(subpathname(dir_ent));
0c2ab9
 			struct dir_info *sub_dir = scan1_opendir("", subpath,
0c2ab9
 						dir->depth + 1);
0c2ab9
+			free(subpath);
0c2ab9
 			if(sub_dir == NULL) {
0c2ab9
 				ERROR_START("Could not create pseudo directory "
0c2ab9
 					"\"%s\"", pseudo_ent->pathname);
0c2ab9
 				ERROR_EXIT(", skipping...\n");
0c2ab9
-				free(subpath);
0c2ab9
 				pseudo_ino --;
0c2ab9
 				continue;
0c2ab9
 			}
0c2ab9
diff -Nupr a/squashfs-tools/read_fs.c b/squashfs-tools/read_fs.c
0c2ab9
--- a/squashfs-tools/read_fs.c	2014-05-09 23:54:13.000000000 -0500
0c2ab9
+++ b/squashfs-tools/read_fs.c	2019-04-18 11:06:32.499233451 -0500
0c2ab9
@@ -974,7 +974,8 @@ long long read_filesystem(char *root_nam
0c2ab9
 
0c2ab9
 error:
0c2ab9
 	free(id_table);
0c2ab9
-	free(inode_table);
0c2ab9
+	if (inode_table)
0c2ab9
+		free(inode_table);
0c2ab9
 	free(directory_table);
0c2ab9
 	return 0;
0c2ab9
 }
0c2ab9
diff -Nupr a/squashfs-tools/unsquash-4.c b/squashfs-tools/unsquash-4.c
0c2ab9
--- a/squashfs-tools/unsquash-4.c	2019-04-18 10:51:05.972460124 -0500
0c2ab9
+++ b/squashfs-tools/unsquash-4.c	2019-04-18 11:32:54.600160166 -0500
0c2ab9
@@ -50,9 +50,11 @@ int read_fragment_table_4(long long *dir
0c2ab9
 			"fragment table index\n");
0c2ab9
 
0c2ab9
 	fragment_table = malloc(bytes);
0c2ab9
-	if(fragment_table == NULL)
0c2ab9
+	if(fragment_table == NULL) {
0c2ab9
+		free(fragment_table_index);
0c2ab9
 		EXIT_UNSQUASH("read_fragment_table: failed to allocate "
0c2ab9
 			"fragment table\n");
0c2ab9
+	}
0c2ab9
 
0c2ab9
 	res = read_fs_bytes(fd, sBlk.s.fragment_table_start,
0c2ab9
 		SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk.s.fragments),
0c2ab9
@@ -60,7 +62,7 @@ int read_fragment_table_4(long long *dir
0c2ab9
 	if(res == FALSE) {
0c2ab9
 		ERROR("read_fragment_table: failed to read fragment table "
0c2ab9
 			"index\n");
0c2ab9
-		return FALSE;
0c2ab9
+		goto out;
0c2ab9
 	}
0c2ab9
 	SQUASHFS_INSWAP_FRAGMENT_INDEXES(fragment_table_index, indexes);
0c2ab9
 
0c2ab9
@@ -75,7 +77,8 @@ int read_fragment_table_4(long long *dir
0c2ab9
 		if(length == FALSE) {
0c2ab9
 			ERROR("read_fragment_table: failed to read fragment "
0c2ab9
 				"table index\n");
0c2ab9
-			return FALSE;
0c2ab9
+			res = FALSE;
0c2ab9
+			goto out;
0c2ab9
 		}
0c2ab9
 	}
0c2ab9
 
0c2ab9
@@ -83,7 +86,10 @@ int read_fragment_table_4(long long *dir
0c2ab9
 		SQUASHFS_INSWAP_FRAGMENT_ENTRY(&fragment_table[i]);
0c2ab9
 
0c2ab9
 	*directory_table_end = fragment_table_index[0];
0c2ab9
-	return TRUE;
0c2ab9
+	res = TRUE;
0c2ab9
+out:
0c2ab9
+	free(fragment_table_index);
0c2ab9
+	return res;
0c2ab9
 }
0c2ab9
 
0c2ab9