From patchwork Mon Jun 15 08:26:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stijn Devriendt X-Patchwork-Id: 1309325 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::63a; helo=mail-ej1-x63a.google.com; envelope-from=swupdate+bncbclnzfwotyirbxxbtt3qkgqeqqowtji@googlegroups.com; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20161025 header.b=Qntg+Pie; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=alfZW9Sk; dkim-atps=neutral Received: from mail-ej1-x63a.google.com (mail-ej1-x63a.google.com [IPv6:2a00:1450:4864:20::63a]) (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 ozlabs.org (Postfix) with ESMTPS id 49lkw23dv0z9sT6 for ; Mon, 15 Jun 2020 18:27:14 +1000 (AEST) Received: by mail-ej1-x63a.google.com with SMTP id d14sf7502187ejt.14 for ; Mon, 15 Jun 2020 01:27:14 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1592209631; cv=pass; d=google.com; s=arc-20160816; b=h9/FTmIgqkKFF8hIeNmWfadpka7p/NjjaZYP5NYFt2kQWhRaJc9kxYFt/8lwJpAHZm c47AY4eIbBoQZay8Rxo/S1moN6zvbw3F13MQyVJU9Ne69fxYU7lpTotZbRlrOjxDg6IJ qfVNFbNUAQ6HNUmGXiUnDSFlxvJVaHGFtAZxLh7eop0MOQm39RGjg5kp14cjsxgY8uyA HXvKB3E6tidFZQ0g7YHSaOIfGaRaud3Nh4tNEWug1u4XBRHPlgZweSg98kcPOuimbhDE yZMN0kTxWuOYJxnvWvJsmFU+fxcotIZk2D31CbQZR9AF3v9GjEpV2ZZFaH9oc0gNQ9Gw ZLYw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:mime-version:sender:dkim-signature :dkim-signature; bh=kTPOl+NlSnBuRRbnEeV30YhLrxOAK5y+niyYs57Njzs=; b=v8+1+1Mq24TCwYJ0s2IlqHqkIyBjpIFICSwr+g7rs40SK8a+ODhwCSgNNPHhYRVQ2t bs4ehaFBx1cJQtPeMthnRh8VOKWSp8maYsxOM1jgIht+PK3icd5i1hr5zV1Rb130dIxq YZDI1HfQZawi1vxQ+/1F/crv+Mq2UBcxFKN1a2fTlrWQUV1RErnlfH4ePQsuF1Zkcgjx frrW5h0QcgUijrrSdtFc2I+3Oy4zib4Y5+A4TQYswiVnDRCeDAkCxrdiO1/0xY9ysDXN 1TVSWfpmzBZWADBptCirT1gK2vOPuOKlKTx9U20t4WDdXeVYdP0P6i8CWWc8IddxNcw9 pQWg== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=TXCfL5rW; spf=pass (google.com: domain of highguy@gmail.com designates 2a00:1450:4864:20::641 as permitted sender) smtp.mailfrom=highguy@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=kTPOl+NlSnBuRRbnEeV30YhLrxOAK5y+niyYs57Njzs=; b=Qntg+PieOuPR4qQbcgxrs5FhJC4xsq2zIdNpJCQ2R25YtkIFxObOggfiy9iOSZH+Z6 R5ttEjXx30we2XSc+JWz1Oujr/EqdD0JmUuidBpqr4bcTewL9QReKYxhTCoZ216d+NUs erofvJ/iFpEnC8KS8RzzwhvrykAgCP8vOQXFXwY+uj2bgry4Vu+J1GAL/41cYt9XR0kL qU4lgtk9cNjuTxKH+Ji8BMKeSLP3cFfDp+TlUyy8dEHYGEM+RIJCQhXiNd0vAqEz3WB3 UVN2kUN2B6a0kaIjOO/oQ+zscqDqMuHTghlxzzK5il7BRDsAURh7hYmi6lG/+H7Lo/3Q 83Wg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=kTPOl+NlSnBuRRbnEeV30YhLrxOAK5y+niyYs57Njzs=; b=alfZW9SkhD9OAuqSrQzAl1ykuKVO86ROwWEUk8Qwy57GS2JqtrCE9Hl6KoUGiHGEMY GS9DXVs/LEw9ut/rl5VnmksQH/BHcQC4dTW5gklsjfvLxveysT8kMzcUjj1BCV3/Mrcv 8bZy8e9xhEqAQvdrTmyTx9IjXpPArouXNvNk4NgEPtNV/uOcWRWHVZc/XTTi0kS6D40H ICQttVvwrhMgfqQQZls5CKkv1RHHos+yniA39XUuIlEqVIs2JsMN3ohR0J2PduQn7Gt6 NpBxZmNctRlMa7QH17w5DsStpxzsRYnfAv7J1XFl0V/EtBjW3oP3J76Rc2BbGqeGbsw6 8esw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:mime-version:from:to:cc:subject:date :message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=kTPOl+NlSnBuRRbnEeV30YhLrxOAK5y+niyYs57Njzs=; b=N5l9JxAOU753rtUgSoukUQz5JclrCokmJ3itBaw9izH4lZAnLjGUdjKL+QLtypojyf j5zenSGAKn0UJ4eFZP/WxleGAYI+r2BfT0j+VqaV/t8WFKZ2Nkpeun2QZTnQCyhtKeXC rgwfTM8uOnXEjsDT6IWnCx+qomnNVraf+kpchlLr1K67yGAGm5NBhHMdSXvPEmc2iuo8 vTMgsH+Cdzpt9nFRt4twfrULXWgeQAL5xXvvZRsl2+PqZ+KqINh2Sti9ISso3A+nfu+W tTm4AfuEdZ61E0kJjJvtq1c5NUpGXEA8ONaot/i53CSUbOMmD3nTWFsPRykuM/f6uUZa rnGQ== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOAM533eZNpyCETOPSkDXfEde/kXUTn1nqN8o3Tb79aahElk17Nm14sO VHLagbL9Gl2dZz4QHmWbJds= X-Google-Smtp-Source: ABdhPJwFpywztTbPRYufx0KaVjz5jyRinDkmhG2JZjjbG8S9LMGZgiIadKTbxTWddQ35LDvNORELGA== X-Received: by 2002:a17:906:2655:: with SMTP id i21mr12529921ejc.18.1592209631262; Mon, 15 Jun 2020 01:27:11 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: swupdate@googlegroups.com Received: by 2002:a17:906:1d52:: with SMTP id o18ls5854634ejh.6.gmail; Mon, 15 Jun 2020 01:27:10 -0700 (PDT) X-Received: by 2002:a17:906:d963:: with SMTP id rp3mr12498852ejb.326.1592209630570; Mon, 15 Jun 2020 01:27:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592209630; cv=none; d=google.com; s=arc-20160816; b=vV4NMvFrCuzYmI3aFLhVn8XkMUOZckSbSiUG2vL3D1F8yBftSRh3rYaHc+AQ0UmkPB x9m1Y0jXcb0vOTBnHA0yZaBzFngbPLluwKWgjKmq/44+kWIVvuDcwguZtfxwHnMPO8GP 2jIMomJaxJ8CUY4SnGyh+6GkFsVS2Y0jhD89IWCA1imL+ksOjM0Bn7boHlAX/EMjkIDL uYs3luzhqUAKqmqI9npnxZL/7OkbE+cT0M8FhxNGqLS7DxyAPMoXRVvBd8sRAGu4tcll J15rg7tLsFCTLZ4w5rPPhWuWPeuwi2s/Uz23XuT+2wm6VfcwYkmJvtOtNND5sgGhNfHM EjwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=B7Wz+1l527YhhaIFYnwm3WIkhqGmfparQ9X++pWfBsM=; b=sR8glCyFBemVKfh1Tm4ndDvBpfdA/Ub+MgoH5NEUSYdyEC4VsZSU+w3ptKCC64OkQ+ PO4AxvQObGurJurH2Iy8+ojj1kkB/2ARqRrWKodhvzsbT+vktW/OI1kcUMXeaOPjTifo cW+Iy1kgzuzSD5w29JB6KXs5+oWKxcBtJSHAX7i9r2attQwMMtMydMv9Cv1lUcUt6QVn hi3vCh/lMvqnxaY7hfaVe8j5N+cRatN2FVMklaA56/PzaRVfVANPcEtGLSAFkcivd5N6 APwZxqyO0QRDCCf9ARn16047zTMkg/0f0lNZaHBF+spT03zCU1BfFlYKSAqWymjlg6Rb qYaQ== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=TXCfL5rW; spf=pass (google.com: domain of highguy@gmail.com designates 2a00:1450:4864:20::641 as permitted sender) smtp.mailfrom=highguy@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-ej1-x641.google.com (mail-ej1-x641.google.com. [2a00:1450:4864:20::641]) by gmr-mx.google.com with ESMTPS id l10si763843edf.4.2020.06.15.01.27.10 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 15 Jun 2020 01:27:10 -0700 (PDT) Received-SPF: pass (google.com: domain of highguy@gmail.com designates 2a00:1450:4864:20::641 as permitted sender) client-ip=2a00:1450:4864:20::641; Received: by mail-ej1-x641.google.com with SMTP id y13so16483536eju.2 for ; Mon, 15 Jun 2020 01:27:10 -0700 (PDT) X-Received: by 2002:a17:907:11c8:: with SMTP id va8mr26474374ejb.90.1592209630294; Mon, 15 Jun 2020 01:27:10 -0700 (PDT) Received: from sde1.telecom-it.be (ptr-dv4l9auv4w1m1i5kotr.18120a2.ip6.access.telenet.be. [2a02:1811:ce13:ba00:717d:f0a2:e207:f7af]) by smtp.googlemail.com with ESMTPSA id fi13sm8656314ejb.34.2020.06.15.01.27.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Jun 2020 01:27:09 -0700 (PDT) From: Stijn Devriendt To: HIGHGuY@gmail.com, sbabic@denx.de Cc: tomas@aparicio.me, swupdate@googlegroups.com, Stijn Devriendt Subject: [swupdate] [PATCH v3 4/7] Cleanup input string to be semantic-version compliant Date: Mon, 15 Jun 2020 10:26:59 +0200 Message-Id: <20200615082702.32693-5-sde@unmatched.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200612100354.3591-1-sde@unmatched.eu> References: <20200612100354.3591-1-sde@unmatched.eu> X-Original-Sender: HIGHGuY@gmail.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=TXCfL5rW; spf=pass (google.com: domain of highguy@gmail.com designates 2a00:1450:4864:20::641 as permitted sender) smtp.mailfrom=highguy@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , When the string is malformed, we'll treat it as 0.0.0 and emit a warning. This matches the approach from the previous code, to ignore incorrect version parts, ending up with a NUL-version. Signed-off-by: Stijn Devriendt --- core/artifacts_versions.c | 46 +++++++++++++++++++++++++++++++++++++++ core/swupdate.c | 2 ++ include/util.h | 1 + parser/parser.c | 3 +++ 4 files changed, 52 insertions(+) diff --git a/core/artifacts_versions.c b/core/artifacts_versions.c index 6fe5d60..ccc283e 100644 --- a/core/artifacts_versions.c +++ b/core/artifacts_versions.c @@ -25,6 +25,7 @@ #include "swupdate.h" #include "parselib.h" #include "swupdate_settings.h" +#include "semver.h" /* * Read versions of components from a file, if provided @@ -66,6 +67,9 @@ static int read_sw_version_file(struct swupdate_cfg *sw) } strlcpy(swcomp->name, name, sizeof(swcomp->name)); strlcpy(swcomp->version, version, sizeof(swcomp->version)); + + cleanup_version(swcomp->version); + LIST_INSERT_HEAD(&sw->installed_sw_list, swcomp, next); TRACE("Installed %s: Version %s", swcomp->name, @@ -118,6 +122,8 @@ static int versions_settings(void *setting, void *data) GET_FIELD_STRING(LIBCFG_PARSER, elem, "name", swcomp->name); GET_FIELD_STRING(LIBCFG_PARSER, elem, "version", swcomp->version); + cleanup_version(swcomp->version); + LIST_INSERT_HEAD(&sw->installed_sw_list, swcomp, next); TRACE("Installed %s: Version %s", swcomp->name, @@ -154,6 +160,46 @@ void get_sw_versions(char __attribute__ ((__unused__)) *cfgname, } #endif +static const char ACCEPTED_CHARS[] = "0123456789."; + +static bool is_oldstyle_version(const char* version_string) +{ + while (*version_string) + { + if (strchr(ACCEPTED_CHARS, *version_string) == NULL) + return false; + } + return true; +} + +void cleanup_version(char* str) +{ + semver_t version = {}; + int res = semver_clean(str); + + /* This is only expected for overly long version strings. + * Is SWUPDATE_GENERAL_STRING_SIZE > semver.c:MAX_SIZE + 1??? + */ + assert(res == 0); + if (res == -1) { + WARN("Version string too long. Using 0.0.0 instead!"); + str[0] = '\0'; + return; + } + + if (is_oldstyle_version(str)) + return; + + if (semver_parse(str, &version) == 0) { + semver_render(&version, str); + } else { + WARN("Unparseable version string. Using 0.0.0 instead!"); + str[0] = '\0'; + } + + semver_free(&version); +} + /* * convert a version string into a number * version string is in the format: diff --git a/core/swupdate.c b/core/swupdate.c index 74dfbbe..8e85127 100644 --- a/core/swupdate.c +++ b/core/swupdate.c @@ -792,11 +792,13 @@ int main(int argc, char **argv) swcfg.globals.no_downgrading = 1; strlcpy(swcfg.globals.minimum_version, optarg, sizeof(swcfg.globals.minimum_version)); + cleanup_version(swcfg.globals.minimum_version); break; case 'R': swcfg.globals.no_reinstalling = 1; strlcpy(swcfg.globals.current_version, optarg, sizeof(swcfg.globals.current_version)); + cleanup_version(swcfg.globals.current_version); break; case 'M': swcfg.globals.no_transaction_marker = 1; diff --git a/include/util.h b/include/util.h index 55fe70f..6a027c6 100644 --- a/include/util.h +++ b/include/util.h @@ -216,6 +216,7 @@ size_t snescape(char *dst, size_t n, const char *src); void freeargs (char **argv); int get_hw_revision(struct hw_type *hw); void get_sw_versions(char *cfgfname, struct swupdate_cfg *sw); +void cleanup_version(char* str); __u64 version_to_number(const char *version_string); int hwid_match(const char* rev, const char* hwrev); int check_hw_compatibility(struct swupdate_cfg *cfg); diff --git a/parser/parser.c b/parser/parser.c index 31efe46..981d40d 100644 --- a/parser/parser.c +++ b/parser/parser.c @@ -273,6 +273,9 @@ static int parse_common_attributes(parsertype p, void *elem, struct img_type *im GET_FIELD_STRING(p, elem, "name", image->id.name); GET_FIELD_STRING(p, elem, "version", image->id.version); + + cleanup_version(image->id.version); + GET_FIELD_STRING(p, elem, "filename", image->fname); GET_FIELD_STRING(p, elem, "path", image->path); GET_FIELD_STRING(p, elem, "volume", image->volname);