[OpenWrt-Devel,procd] system: refuse sysupgrade with backup if it's unsupported
diff mbox series

Message ID 20190911083441.19892-1-zajec5@gmail.com
State Accepted
Delegated to: Rafał Miłecki
Headers show
Series
  • [OpenWrt-Devel,procd] system: refuse sysupgrade with backup if it's unsupported
Related show

Commit Message

Rafał Miłecki Sept. 11, 2019, 8:34 a.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

Don't allow it if validation methods marked firmware as not supporting a
backup.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 system.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/system.c b/system.c
index 98fcb66..2a5d5bc 100644
--- a/system.c
+++ b/system.c
@@ -515,15 +515,17 @@  static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj,
 	enum {
 		VALIDATION_VALID,
 		VALIDATION_FORCEABLE,
+		VALIDATION_ALLOW_BACKUP,
 		__VALIDATION_MAX
 	};
 	static const struct blobmsg_policy validation_policy[__VALIDATION_MAX] = {
 		[VALIDATION_VALID] = { .name = "valid", .type = BLOBMSG_TYPE_BOOL },
 		[VALIDATION_FORCEABLE] = { .name = "forceable", .type = BLOBMSG_TYPE_BOOL },
+		[VALIDATION_ALLOW_BACKUP] = { .name = "allow_backup", .type = BLOBMSG_TYPE_BOOL },
 	};
 	struct blob_attr *validation[__VALIDATION_MAX];
 	struct blob_attr *tb[__SYSUPGRADE_MAX];
-	bool valid, forceable;
+	bool valid, forceable, allow_backup;
 
 	if (!msg)
 		return UBUS_STATUS_INVALID_ARGUMENT;
@@ -539,6 +541,7 @@  static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj,
 
 	valid = validation[VALIDATION_VALID] && blobmsg_get_bool(validation[VALIDATION_VALID]);
 	forceable = validation[VALIDATION_FORCEABLE] && blobmsg_get_bool(validation[VALIDATION_FORCEABLE]);
+	allow_backup = validation[VALIDATION_ALLOW_BACKUP] && blobmsg_get_bool(validation[VALIDATION_ALLOW_BACKUP]);
 
 	if (!valid) {
 		if (!forceable) {
@@ -548,6 +551,9 @@  static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj,
 			fprintf(stderr, "Firmware image is invalid\n");
 			return UBUS_STATUS_NOT_SUPPORTED;
 		}
+	} else if (!allow_backup && tb[SYSUPGRADE_BACKUP]) {
+		fprintf(stderr, "Firmware image doesn't allow preserving a backup\n");
+		return UBUS_STATUS_NOT_SUPPORTED;
 	}
 
 	sysupgrade_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]),