Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18f371d8 authored by Tao Bao's avatar Tao Bao
Browse files

updater: Check the return value from ApplyImagePatch / ApplyBSDiffPatch

Return NULL to abort the update process. Note that returning ""
won't stop the script.

Change-Id: Ifd108c1356f7c92a905c8776247a8842c6445319
parent 71c45429
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1107,6 +1107,7 @@ main(int argc, char **argv) {
        }
        if (status != INSTALL_SUCCESS) {
            ui->Print("Installation aborted.\n");
            ui->Print("OTA failed! Please power off the device to keep it in this state and file a bug report!\n");

            // If this is an eng or userdebug build, then automatically
            // turn the text display on if the script fails so the error
+28 −14
Original line number Diff line number Diff line
@@ -687,19 +687,26 @@ Value* BlockImageUpdateFn(const char* name, State* state, int argc, Expr* argv[]
            rss.p_remain = (tgt->pos[1] - tgt->pos[0]) * BLOCKSIZE;
            check_lseek(fd, (off64_t)tgt->pos[0] * BLOCKSIZE, SEEK_SET);

            int ret;
            if (style[0] == 'i') {      // imgdiff
                ApplyImagePatch(buffer, src_blocks * BLOCKSIZE,
                ret = ApplyImagePatch(buffer, src_blocks * BLOCKSIZE,
                                      &patch_value,
                                      &RangeSinkWrite, &rss, NULL, NULL);
            } else {
                ApplyBSDiffPatch(buffer, src_blocks * BLOCKSIZE,
                ret = ApplyBSDiffPatch(buffer, src_blocks * BLOCKSIZE,
                                       &patch_value, 0,
                                       &RangeSinkWrite, &rss, NULL);
            }

            if (ret != 0) {
                ErrorAbort(state, "patch failed\n");
                goto done;
            }

            // We expect the output of the patcher to fill the tgt ranges exactly.
            if (rss.p_block != tgt->count || rss.p_remain != 0) {
                fprintf(stderr, "range sink underrun?\n");
                ErrorAbort(state, "range sink underrun?\n");
                goto done;
            }

            blocks_so_far += tgt->size;
@@ -723,7 +730,8 @@ Value* BlockImageUpdateFn(const char* name, State* state, int argc, Expr* argv[]
                    range[1] = (tgt->pos[i*2+1] - tgt->pos[i*2]) * (uint64_t)BLOCKSIZE;

                    if (ioctl(fd, BLKDISCARD, &range) < 0) {
                        printf("    blkdiscard failed: %s\n", strerror(errno));
                        ErrorAbort(state, "    blkdiscard failed: %s\n", strerror(errno));
                        goto done;
                    }
                }

@@ -732,8 +740,8 @@ Value* BlockImageUpdateFn(const char* name, State* state, int argc, Expr* argv[]
                printf("  ignoring erase (not block device)\n");
            }
        } else {
            fprintf(stderr, "unknown transfer style \"%s\"\n", style);
            exit(1);
            ErrorAbort(state, "unknown transfer style \"%s\"\n", style);
            goto done;
        }
    }

@@ -750,7 +758,13 @@ Value* BlockImageUpdateFn(const char* name, State* state, int argc, Expr* argv[]
    FreeValue(transfer_list_value);
    FreeValue(new_data_fn);
    FreeValue(patch_data_fn);
    return StringValue(success ? strdup("t") : strdup(""));
    if (success) {
        return StringValue(strdup("t"));
    } else {
        // NULL will be passed to its caller at Evaluate() and abort the OTA
        // process.
        return NULL;
    }
}

Value* RangeSha1Fn(const char* name, State* state, int argc, Expr* argv[]) {
@@ -797,7 +811,7 @@ Value* RangeSha1Fn(const char* name, State* state, int argc, Expr* argv[]) {
    FreeValue(blockdev_filename);
    FreeValue(ranges);
    if (digest == NULL) {
        return StringValue(strdup(""));
        return NULL;
    } else {
        return StringValue(PrintSha1(digest));
    }