What's the point of "force" if it doesn't force? Are we going to add a second -F to "really force" ? Or is it going to be "oh, -F failed for some lame reason, so I'll use mtd write, and still complain anyway"
Cheers, Karl P Rafał Miłecki <[email protected]> wrote: > From: Rafał Miłecki <[email protected]> > > This uses recently added "validate_firmware_image" to validate > passed firmware. If it happens to be invalid and marked as > impossible to force then sysupgrade simply exits with an error. > > This change is needed to avoid bricking devices with some > totally broken images. > > Signed-off-by: Rafał Miłecki <[email protected]> > --- > This patch depends on the: > [PATCH procd] system: add "validate_firmware_image" ubus method > --- > system.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/system.c b/system.c > index 35d5a23..7f49758 100644 > --- a/system.c > +++ b/system.c > @@ -507,7 +507,18 @@ static int sysupgrade(struct ubus_context *ctx, struct > ubus_object *obj, > struct ubus_request_data *req, const char *method, > struct blob_attr *msg) > { > + enum { > + VALIDATION_VALID, > + VALIDATION_FORCEABLE, > + __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 }, > + }; > + struct blob_attr *validation[__VALIDATION_MAX]; > struct blob_attr *tb[__SYSUPGRADE_MAX]; > + bool valid, forceable; > > if (!msg) > return UBUS_STATUS_INVALID_ARGUMENT; > @@ -516,6 +527,19 @@ static int sysupgrade(struct ubus_context *ctx, struct > ubus_object *obj, > if (!tb[SYSUPGRADE_PATH] || !tb[SYSUPGRADE_PREFIX]) > return UBUS_STATUS_INVALID_ARGUMENT; > > + if > (validate_firmware_image_call(blobmsg_get_string(tb[SYSUPGRADE_PATH]))) > + return UBUS_STATUS_UNKNOWN_ERROR; > + > + blobmsg_parse(validation_policy, __VALIDATION_MAX, validation, > blob_data(b.head), blob_len(b.head)); > + > + valid = validation[VALIDATION_VALID] && > blobmsg_get_bool(validation[VALIDATION_VALID]); > + forceable = validation[VALIDATION_FORCEABLE] && > blobmsg_get_bool(validation[VALIDATION_FORCEABLE]); > + > + if (!valid && !forceable) { > + fprintf(stderr, "Firmware image is broken and cannot be > installed\n"); > + return UBUS_STATUS_UNKNOWN_ERROR; > + } > + > sysupgrade_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), > blobmsg_get_string(tb[SYSUPGRADE_PATH]), > tb[SYSUPGRADE_COMMAND] ? > blobmsg_get_string(tb[SYSUPGRADE_COMMAND]) : NULL, > -- > 2.21.0 > > > _______________________________________________ > openwrt-devel mailing list > [email protected] > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
OpenPGP-digital-signature.html
Description: OpenPGP Digital Signature
_______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
