From patchwork Sat Nov 27 15:31:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= X-Patchwork-Id: 1560768 X-Patchwork-Delegate: zajec5@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=VpuVx+dD; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=m+iYjwAt; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4J1bHR39wMz9sS8 for ; Sun, 28 Nov 2021 02:33:39 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=w1dF7PiVXc0RL3VIEHzoH/JdT8SqD3ce+7e2pM7UsIA=; b=VpuVx+dD6gilJ5 h07eI0XMdCPHxzUB8zoyMVsMwR52pQyctAGFm/7FcH37C65cGvanN9l+Fch9fOK5qr7xlmFOrgAIh X5K2+kyc4Q+rQVKoG7n8pbNRozH18I9cEsgokcOBmkJeHZOrHhWs7XxujEKJT5ZyiRRTEmq3G0nth 0N3nz6Fey2kRZbGbLKYa+XSMV2o2pn23C8uaiKrBfUOuQEEvvPowUaAQI/GilsLikel+Y200ZZ9Q3 l68bS2j2ZAAJ9t5a7BHkIYeB45nVJVPeACoFhM0KaxOT9iqT/XlVGkH1Gx2ru6FbbR4gQI3A2C04A /wDZ+JRxGgeuyLAjHVRQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mqzfW-00Dufa-VZ; Sat, 27 Nov 2021 15:31:15 +0000 Received: from mail-lf1-x132.google.com ([2a00:1450:4864:20::132]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mqzfT-00DueG-5b for openwrt-devel@lists.openwrt.org; Sat, 27 Nov 2021 15:31:12 +0000 Received: by mail-lf1-x132.google.com with SMTP id r26so31846748lfn.8 for ; Sat, 27 Nov 2021 07:31:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bQeFrgvQWT8TmRTfK1JDY2wiBvH4viKf/bOOcamF9mc=; b=m+iYjwAt8p+Bp4ESUifaR5ToNHPsw+1hHtr0D3pw9fCmR76EFdQ1+XBdGC5ilcalGn +/fYvCRSxLhnZlAyIBwl/Ze+831EKMnnO+zr7Wkr6bgO6Jr/mAL2gpyY9rk+4TqKpYhq pR25++BAkibruCWQXzls5C36vheI1/5kAk10LLszJovKO8SKti5JDXkGMXwB0KMNRdhv /wPBm18ljocO3vFUzIIhxoWmMR/f8dcySUsjviwY6AGdAllxuSIdwYtR4kah4JvDfpxT W7sacrpHt0LWaZzlVZmwK2V6Vn3xG5VJbBC8VHRzloRID4MM/hTG8ImCDXqPRiNLXtv3 4Lgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bQeFrgvQWT8TmRTfK1JDY2wiBvH4viKf/bOOcamF9mc=; b=4waG1AIpLL6JV1F5glOePkn9jrZsghZ9ERZIzSVa4W3CemY89o/Eus8uDaVSCII4Dp R8tv8q4nUNuMcjU2DCnJ5W1Rk9+OKYXHoelLmHJ5SkOTkSW/EcEw5ztroFmfYIE3TpG+ rnERP6rRetuE9kbpmUoai3CR/A7VoGJ7M2NUCOaGzqKuu6+T3Vv8ZuHCzNZH83HZPKDO PW4nIXX9n+kXNE/UJWWAiip+M/eMtSKw5i2Q26Xpo3+3rRj7O58fZ0tpzlJ6DZ1iFEBL IWR9pX8QP9Z/EAt35YiwQrvEL9pOAgRM9ajsAfHAQMXv71WFnXwAnlzswtTI4SbRJFds 3QEw== X-Gm-Message-State: AOAM531uW7+AvbkifVlmwGX0hs1/uG4kaLnhtI/VFhUE3AaEl+RwtKJ+ kikdYYlByBAHtCt37Ge9XuNbtg3c9lk= X-Google-Smtp-Source: ABdhPJyCWIsinAbIj8RXfqmA09P9uJrQqP8/WR8MTU/qNVmuF5+aIjsqEZXT6tlra3UIPBvvIe+jLw== X-Received: by 2002:a05:6512:34cc:: with SMTP id w12mr36238173lfr.134.1638027068446; Sat, 27 Nov 2021 07:31:08 -0800 (PST) Received: from localhost.lan (ip-194-187-74-233.konfederacka.maverick.com.pl. [194.187.74.233]) by smtp.gmail.com with ESMTPSA id c6sm766777lfc.37.2021.11.27.07.31.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Nov 2021 07:31:08 -0800 (PST) From: =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= To: openwrt-devel@lists.openwrt.org Cc: =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= Subject: [PATCH firmware-utils 1/3] otrx: extract shared code opening & parsing TRX format Date: Sat, 27 Nov 2021 16:31:02 +0100 Message-Id: <20211127153104.2615-1-zajec5@gmail.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211127_073111_253210_5B8DDFA7 X-CRM114-Status: GOOD ( 17.13 ) X-Spam-Score: 0.1 (/) X-Spam-Report: =?unknown-8bit?q?Spam_detection_software=2C_running_on_the_sy?= =?unknown-8bit?q?stem_=22bombadil=2Einfradead=2Eorg=22=2C?= =?unknown-8bit?q?_has_NOT_identified_this_incoming_email_as_spam=2E__The_ori?= =?unknown-8bit?q?ginal?= =?unknown-8bit?q?_message_has_been_attached_to_this_so_you_can_view_it_or_la?= =?unknown-8bit?q?bel?= =?unknown-8bit?q?_similar_future_email=2E__If_you_have_any_questions=2C_see?= =?unknown-8bit?q?_the_administrator_of_that_system_for_details=2E?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_Content_preview=3A__From=3A_Rafa=C5=82_Mi=C5=82ecki_This_a?= =?unknown-8bit?q?voids_some_code_duplication=2E_Signed-off-by=3A?= =?unknown-8bit?q?_Rafa=C5=82_Mi=C5=82ecki_---_src/otrx=2Ec_=7C_145_+++++++++?= =?unknown-8bit?q?+++++++++++++++++++_1_file?= =?unknown-8bit?q?_changed=2C_77_insertions=28+=29=2C_68_deletions=28-=29_?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_Content_analysis_details=3A___=280=2E1_points=2C_5=2E0_req?= =?unknown-8bit?q?uired=29?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_pts_rule_name______________description?= =?unknown-8bit?q?_----_----------------------_------------------------------?= =?unknown-8bit?q?--------------------?= =?unknown-8bit?q?_-0=2E0_RCVD=5FIN=5FDNSWL=5FNONE_____RBL=3A_Sender_listed_a?= =?unknown-8bit?q?t_https=3A//www=2Ednswl=2Eorg/=2C?= =?unknown-8bit?q?_no_trust?= =?unknown-8bit?b?IFsyYTAwOjE0NTA6NDg2NDoyMDowOjA6MDoxMzIgbGlzdGVkIGluXQ==?= =?unknown-8bit?b?IFtsaXN0LmRuc3dsLm9yZ10=?= =?unknown-8bit?q?_-0=2E0_SPF=5FPASS_______________SPF=3A_sender_matches_SPF_?= =?unknown-8bit?q?record?= =?unknown-8bit?q?_0=2E0_SPF=5FHELO=5FNONE__________SPF=3A_HELO_does_not_publ?= =?unknown-8bit?q?ish_an_SPF_Record?= =?unknown-8bit?q?_0=2E0_FREEMAIL=5FFROM__________Sender_email_is_commonly_ab?= =?unknown-8bit?q?used_enduser_mail?= =?unknown-8bit?q?_provider?= =?unknown-8bit?q?_=5Bzajec5=5Bat=5Dgmail=2Ecom=5D?= =?unknown-8bit?q?_0=2E2_FREEMAIL=5FENVFROM=5FEND=5FDIGIT_Envelope-from_freem?= =?unknown-8bit?q?ail_username_ends?= =?unknown-8bit?q?_in_digit?= =?unknown-8bit?q?_=5Bzajec5=5Bat=5Dgmail=2Ecom=5D?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID=5FAU__________Message_has_a_valid_DKIM?= =?unknown-8bit?q?_or_DK_signature_from?= =?unknown-8bit?q?_author=27s_domain?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID_____________Message_has_at_least_one_v?= =?unknown-8bit?q?alid_DKIM_or_DK_signature?= =?unknown-8bit?q?_0=2E1_DKIM=5FSIGNED____________Message_has_a_DKIM_or_DK_si?= =?unknown-8bit?q?gnature=2C_not_necessarily?= =?unknown-8bit?q?_valid?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID=5FEF__________Message_has_a_valid_DKIM?= =?unknown-8bit?q?_or_DK_signature_from?= =?unknown-8bit?q?_envelope-from_domain?= X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org From: Rafał Miłecki This avoids some code duplication. Signed-off-by: Rafał Miłecki --- src/otrx.c | 145 ++++++++++++++++++++++++++++------------------------- 1 file changed, 77 insertions(+), 68 deletions(-) diff --git a/src/otrx.c b/src/otrx.c index af6e905..7f661ca 100644 --- a/src/otrx.c +++ b/src/otrx.c @@ -42,6 +42,11 @@ struct trx_header { uint32_t offset[3]; }; +struct otrx_ctx { + FILE *fp; + struct trx_header hdr; +}; + char *trx_path; size_t trx_offset = 0; char *partition[TRX_MAX_PARTS] = {}; @@ -169,6 +174,54 @@ static void otrx_close(FILE *fp) { fclose(fp); } +static int otrx_open_parse(const char *pathname, const char *mode, + struct otrx_ctx *otrx) +{ + size_t length; + size_t bytes; + int err; + + otrx->fp = otrx_open(pathname, mode); + if (!otrx->fp) { + fprintf(stderr, "Couldn't open %s\n", pathname); + err = -EACCES; + goto err_out; + } + + if (trx_offset && otrx_skip(otrx->fp, trx_offset)) { + fprintf(stderr, "Couldn't skip first %zd B\n", trx_offset); + err = -EIO; + goto err_close; + } + + bytes = fread(&otrx->hdr, 1, sizeof(otrx->hdr), otrx->fp); + if (bytes != sizeof(otrx->hdr)) { + fprintf(stderr, "Couldn't read %s header\n", pathname); + err = -EIO; + goto err_close; + } + + if (le32_to_cpu(otrx->hdr.magic) != TRX_MAGIC) { + fprintf(stderr, "Invalid TRX magic: 0x%08x\n", le32_to_cpu(otrx->hdr.magic)); + err = -EINVAL; + goto err_close; + } + + length = le32_to_cpu(otrx->hdr.length); + if (length < sizeof(otrx->hdr)) { + fprintf(stderr, "Length read from TRX too low (%zu B)\n", length); + err = -EINVAL; + goto err_close; + } + + return 0; + +err_close: + otrx_close(otrx->fp); +err_out: + return err; +} + /************************************************** * Check **************************************************/ @@ -186,8 +239,7 @@ static void otrx_check_parse_options(int argc, char **argv) { } static int otrx_check(int argc, char **argv) { - FILE *trx; - struct trx_header hdr; + struct otrx_ctx otrx = { }; size_t bytes, length; uint8_t buf[1024]; uint32_t crc32; @@ -203,43 +255,17 @@ static int otrx_check(int argc, char **argv) { optind = 3; otrx_check_parse_options(argc, argv); - trx = otrx_open(trx_path, "r"); - if (!trx) { - fprintf(stderr, "Couldn't open %s\n", trx_path); + err = otrx_open_parse(trx_path, "r", &otrx); + if (err) { + fprintf(stderr, "Couldn't open & parse %s: %d\n", trx_path, err); err = -EACCES; goto out; } - if (trx_offset && otrx_skip(trx, trx_offset)) { - fprintf(stderr, "Couldn't skip first %zd B\n", trx_offset); - err = -EIO; - goto err_close; - } - - bytes = fread(&hdr, 1, sizeof(hdr), trx); - if (bytes != sizeof(hdr)) { - fprintf(stderr, "Couldn't read %s header\n", trx_path); - err = -EIO; - goto err_close; - } - - if (le32_to_cpu(hdr.magic) != TRX_MAGIC) { - fprintf(stderr, "Invalid TRX magic: 0x%08x\n", le32_to_cpu(hdr.magic)); - err = -EINVAL; - goto err_close; - } - - length = le32_to_cpu(hdr.length); - if (length < sizeof(hdr)) { - fprintf(stderr, "Length read from TRX too low (%zu B)\n", length); - err = -EINVAL; - goto err_close; - } - crc32 = 0xffffffff; - crc32 = otrx_crc32(crc32, (uint8_t *)&hdr + TRX_FLAGS_OFFSET, sizeof(hdr) - TRX_FLAGS_OFFSET); - length -= sizeof(hdr); - while ((bytes = fread(buf, 1, otrx_min(sizeof(buf), length), trx)) > 0) { + crc32 = otrx_crc32(crc32, (uint8_t *)&otrx.hdr + TRX_FLAGS_OFFSET, sizeof(otrx.hdr) - TRX_FLAGS_OFFSET); + length = le32_to_cpu(otrx.hdr.length) - sizeof(otrx.hdr); + while ((bytes = fread(buf, 1, otrx_min(sizeof(buf), length), otrx.fp)) > 0) { crc32 = otrx_crc32(crc32, buf, bytes); length -= bytes; } @@ -250,16 +276,16 @@ static int otrx_check(int argc, char **argv) { goto err_close; } - if (crc32 != le32_to_cpu(hdr.crc32)) { - fprintf(stderr, "Invalid data crc32: 0x%08x instead of 0x%08x\n", crc32, le32_to_cpu(hdr.crc32)); + if (crc32 != le32_to_cpu(otrx.hdr.crc32)) { + fprintf(stderr, "Invalid data crc32: 0x%08x instead of 0x%08x\n", crc32, le32_to_cpu(otrx.hdr.crc32)); err = -EINVAL; goto err_close; } - printf("Found a valid TRX version %d\n", le32_to_cpu(hdr.version)); + printf("Found a valid TRX version %d\n", le32_to_cpu(otrx.hdr.version)); err_close: - otrx_close(trx); + otrx_close(otrx.fp); out: return err; } @@ -541,41 +567,25 @@ out: } static int otrx_extract(int argc, char **argv) { - FILE *trx; - struct trx_header hdr; - size_t bytes; + struct otrx_ctx otrx = { }; int i; int err = 0; if (argc < 3) { fprintf(stderr, "No TRX file passed\n"); err = -EINVAL; - goto out; + goto err_out; } trx_path = argv[2]; optind = 3; otrx_extract_parse_options(argc, argv); - trx = fopen(trx_path, "r"); - if (!trx) { - fprintf(stderr, "Couldn't open %s\n", trx_path); + err = otrx_open_parse(trx_path, "r", &otrx); + if (err) { + fprintf(stderr, "Couldn't open & parse %s: %d\n", trx_path, err); err = -EACCES; - goto out; - } - - fseek(trx, trx_offset, SEEK_SET); - bytes = fread(&hdr, 1, sizeof(hdr), trx); - if (bytes != sizeof(hdr)) { - fprintf(stderr, "Couldn't read %s header\n", trx_path); - err = -EIO; - goto err_close; - } - - if (le32_to_cpu(hdr.magic) != TRX_MAGIC) { - fprintf(stderr, "Invalid TRX magic: 0x%08x\n", le32_to_cpu(hdr.magic)); - err = -EINVAL; - goto err_close; + goto err_out; } for (i = 0; i < TRX_MAX_PARTS; i++) { @@ -583,22 +593,21 @@ static int otrx_extract(int argc, char **argv) { if (!partition[i]) continue; - if (!hdr.offset[i]) { + if (!otrx.hdr.offset[i]) { printf("TRX doesn't contain partition %d, can't extract %s\n", i + 1, partition[i]); continue; } - if (i + 1 >= TRX_MAX_PARTS || !hdr.offset[i + 1]) - length = le32_to_cpu(hdr.length) - le32_to_cpu(hdr.offset[i]); + if (i + 1 >= TRX_MAX_PARTS || !otrx.hdr.offset[i + 1]) + length = le32_to_cpu(otrx.hdr.length) - le32_to_cpu(otrx.hdr.offset[i]); else - length = le32_to_cpu(hdr.offset[i + 1]) - le32_to_cpu(hdr.offset[i]); + length = le32_to_cpu(otrx.hdr.offset[i + 1]) - le32_to_cpu(otrx.hdr.offset[i]); - otrx_extract_copy(trx, trx_offset + le32_to_cpu(hdr.offset[i]), length, partition[i]); + otrx_extract_copy(otrx.fp, trx_offset + le32_to_cpu(otrx.hdr.offset[i]), length, partition[i]); } -err_close: - fclose(trx); -out: + otrx_close(otrx.fp); +err_out: return err; }