Blame SOURCES/fapolicyd-do-manage-files.patch

b63e47
From 95ec2f9577abe98a73d8dcb9112043aa743fa7ad Mon Sep 17 00:00:00 2001
b63e47
From: Zoltan Fridrich <zfridric@redhat.com>
b63e47
Date: Fri, 19 Nov 2021 18:15:33 +0100
b63e47
Subject: [PATCH] cli do_manage_file function refactoring and fix
b63e47
b63e47
---
b63e47
 src/cli/fapolicyd-cli.c | 159 ++++++++++++++++++++++------------------
b63e47
 1 file changed, 89 insertions(+), 70 deletions(-)
b63e47
b63e47
diff --git a/src/cli/fapolicyd-cli.c b/src/cli/fapolicyd-cli.c
b63e47
index ee5d5bd..30b92be 100644
b63e47
--- a/src/cli/fapolicyd-cli.c
b63e47
+++ b/src/cli/fapolicyd-cli.c
b63e47
@@ -207,87 +207,106 @@ static int do_dump_db(void)
b63e47
 	return rc;
b63e47
 }
b63e47
 
b63e47
-
b63e47
-/*
b63e47
- * This function always requires at least one option, the command. We can
b63e47
- * guarantee that argv[2] is the command because getopt_long would have
b63e47
- * printed an error otherwise. argv[3] would be an optional parameter based
b63e47
- * on which command is being run. If argv[4] == "--trust-file" then argv[5]
b63e47
- * specifies a trust file to operate on.
b63e47
- *
b63e47
- * The function returns 0 on success and 1 on failure
b63e47
- */
b63e47
-static int do_manage_files(int argc, char * const argv[])
b63e47
+static int do_file_add(int argc, char * const argv[])
b63e47
 {
b63e47
-	int rc = 0;
b63e47
+	char full_path[PATH_MAX] = { 0 };
b63e47
 
b63e47
-	if (argc > 0) {
b63e47
-		if ( (strcmp("add", argv[0]) != 0)
b63e47
-			 && (strcmp("delete", argv[0]) != 0)
b63e47
-			 && (strcmp("update", argv[0]) != 0) ) {
b63e47
-			fprintf(stderr, "%s is not valid option, choose from add|delete|update\n", argv[0]);
b63e47
-			goto args_err;
b63e47
-		}
b63e47
+	if (argc == 1) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		return file_append(full_path, NULL);
b63e47
 	}
b63e47
+	if (argc == 3) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		if (strcmp("--trust-file", argv[1]))
b63e47
+			return 2;
b63e47
+		return file_append(full_path, argv[2]);
b63e47
+	}
b63e47
+	return 2;
b63e47
+}
b63e47
 
b63e47
-	if (argc < 2)
b63e47
-		goto args_err;
b63e47
-
b63e47
-	char full_path[PATH_MAX] = {0};
b63e47
+static int do_file_delete(int argc, char * const argv[])
b63e47
+{
b63e47
+	char full_path[PATH_MAX] = { 0 };
b63e47
 
b63e47
-	if (realpath(argv[1], full_path) == NULL) {
b63e47
-		fprintf(stderr, "Cannot get realpath from: %s\n", argv[1]);
b63e47
-		perror("realpath");
b63e47
-		goto args_err;
b63e47
+	if (argc == 1) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		return file_delete(full_path, NULL);
b63e47
 	}
b63e47
+	if (argc == 3) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		if (strcmp("--trust-file", argv[1]))
b63e47
+			return 2;
b63e47
+		return file_delete(full_path, argv[2]);
b63e47
+	}
b63e47
+	return 2;
b63e47
+}
b63e47
 
b63e47
-	if (strcmp("add", argv[0]) == 0) {
b63e47
-		switch (argc) {
b63e47
-		case 2:
b63e47
-			rc = file_append(full_path, NULL);
b63e47
-			break;
b63e47
-		case 4:
b63e47
-			if (strcmp("--trust-file", argv[2]))
b63e47
-				goto args_err;
b63e47
-			rc = file_append(full_path, argv[3]);
b63e47
-			break;
b63e47
-		default:
b63e47
-			goto args_err;
b63e47
-		}
b63e47
-	} else if (strcmp("delete", argv[0]) == 0) {
b63e47
-		switch (argc) {
b63e47
-		case 2:
b63e47
-			rc = file_delete(full_path, NULL);
b63e47
-			break;
b63e47
-		case 4:
b63e47
-			if (strcmp("--trust-file", argv[2]))
b63e47
-				goto args_err;
b63e47
-			rc = file_delete(full_path, argv[3]);
b63e47
-			break;
b63e47
-		default:
b63e47
-			goto args_err;
b63e47
-		}
b63e47
-	} else if (strcmp("update", argv[0]) == 0) {
b63e47
-		switch (argc) {
b63e47
-		case 2:
b63e47
-			rc = file_update(full_path, NULL);
b63e47
-			break;
b63e47
-		case 4:
b63e47
-			if (strcmp("--trust-file", argv[2]))
b63e47
-				goto args_err;
b63e47
-			rc = file_update(full_path, argv[3]);
b63e47
-			break;
b63e47
-		default:
b63e47
-			goto args_err;
b63e47
-		}
b63e47
+static int do_file_update(int argc, char * const argv[])
b63e47
+{
b63e47
+	char full_path[PATH_MAX] = { 0 };
b63e47
+
b63e47
+	if (argc == 0)
b63e47
+		return file_update("/", NULL);
b63e47
+	if (argc == 1) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		return file_update(full_path, NULL);
b63e47
+	}
b63e47
+	if (argc == 2) {
b63e47
+		if (strcmp("--trust-file", argv[0]))
b63e47
+			return 2;
b63e47
+		return file_update("/", argv[1]);
b63e47
+	}
b63e47
+	if (argc == 3) {
b63e47
+		if (!realpath(argv[0], full_path))
b63e47
+			return 3;
b63e47
+		if (strcmp("--trust-file", argv[1]))
b63e47
+			return 2;
b63e47
+		return file_update(full_path, argv[2]);
b63e47
 	}
b63e47
+	return 2;
b63e47
+}
b63e47
 
b63e47
-	return rc ? 1 : 0;
b63e47
+static int do_manage_files(int argc, char * const argv[])
b63e47
+{
b63e47
+	int rc = 0;
b63e47
 
b63e47
-args_err:
b63e47
-	fprintf(stderr, "Wrong number of arguments\n\n");
b63e47
-	fprintf(stderr, "%s", usage);
b63e47
+	if (argc < 1 || argc > 4) {
b63e47
+		fprintf(stderr, "Wrong number of arguments\n");
b63e47
+		fprintf(stderr, "\n%s", usage);
b63e47
+		return 1;
b63e47
+	}
b63e47
+
b63e47
+	if (!strcmp("add", argv[0]))
b63e47
+		rc = do_file_add(argc - 1, argv + 1);
b63e47
+	else if (!strcmp("delete", argv[0]))
b63e47
+		rc = do_file_delete(argc - 1, argv + 1);
b63e47
+	else if (!strcmp("update", argv[0]))
b63e47
+		rc = do_file_update(argc - 1, argv + 1);
b63e47
+	else {
b63e47
+		fprintf(stderr, "%s is not a valid option, choose one of add|delete|update\n", argv[0]);
b63e47
+		fprintf(stderr, "\n%s", usage);
b63e47
+		return 1;
b63e47
+	}
b63e47
 
b63e47
+	switch (rc) {
b63e47
+	case 0: // no error
b63e47
+		return 0;
b63e47
+	case 2: // args error
b63e47
+		fprintf(stderr, "Wrong number of arguments\n");
b63e47
+		fprintf(stderr, "\n%s", usage);
b63e47
+		break;
b63e47
+	case 3: // realpath error
b63e47
+		fprintf(stderr, "Can't obtain realpath from: %s\n", argv[1]);
b63e47
+		fprintf(stderr, "\n%s", usage);
b63e47
+		break;
b63e47
+	default: // file function errors
b63e47
+		break;
b63e47
+	}
b63e47
 	return 1;
b63e47
 }
b63e47