From patchwork Fri Aug 2 11:31:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uwe Schuster X-Patchwork-Id: 1141105 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=googlegroups.com (client-ip=2607:f8b0:4864:20::b3f; helo=mail-yb1-xb3f.google.com; envelope-from=swupdate+bncbcvk3t7xzipbbev6sdvakgqeh5fykly@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.b="DyQhrCt3"; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZNxptvH+"; dkim-atps=neutral Received: from mail-yb1-xb3f.google.com (mail-yb1-xb3f.google.com [IPv6:2607:f8b0:4864:20::b3f]) (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 460Q3W3FwTz9s7T for ; Fri, 2 Aug 2019 21:31:33 +1000 (AEST) Received: by mail-yb1-xb3f.google.com with SMTP id c142sf11596340ybf.1 for ; Fri, 02 Aug 2019 04:31:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:date:from:to:message-id:subject:mime-version :x-original-sender:precedence:mailing-list:list-id:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=RsDSH0pMgg9M1VgAmpDXg9JeoSv0ixujFjFnvHzAfQs=; b=DyQhrCt3lEyPqATfSijfI+/6/IUlVXSWDX0iVo1N5Vme+YXV+eYRU1Hauh5sYZi+gA 5bdRq6sub1uVZW/JHz6ggNXEI5Xxk33Wk4eLH+FaV0dtvqf++v5zlotwYHccutk5jViQ 7Xx9K5zr23oA27nZCbECNgF6A92xP1PUY3T0ibVNXfve2AQBqNR93AyFL+ymXEraJnib T0obcFENx6kvhewmgS05OolMD2KE+IN0hLUzPeAi2rgUb3oDeiOkG5edxGrOcnUkUW85 XQqpr+bCjek4MaXEWlGltoLTDCTrPOKPh02cx4pIiw1nTybO79WE4j7XUlYksMcY8A3U Gsog== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:message-id:subject:mime-version:x-original-sender :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=RsDSH0pMgg9M1VgAmpDXg9JeoSv0ixujFjFnvHzAfQs=; b=ZNxptvH+3uibf3RPg00oUyexemPm7/L7Es9WC9MIqQ6EtABFvv15kihGHDNMVbr5jf ljYFwtfWIVii9kx0Cm+oTK7KQO64kpFxePTF7HKOzsbk8KM60671jx90OI38qR9ojHZ8 aCiYUY6KsHRHk2KAfkvOBFUlkt6fiMogkf9QQ3v1UsgbqUN43ZoyceazWFMY/Y1X/Th9 AtmPTPMGYQ74EmsY2nF/h6Gzz0xsEMZ2tRtkr61Oi1H/grpwxIcMrk+OyAX6Xr8AMjAa kRZyjTDGj/mdgB9043oSrYzWePMmJp78ttstTEEQD7OIzr72zXm1XUz7Ht5YIyfnrEwb uaHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:date:from:to:message-id:subject :mime-version:x-original-sender:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=RsDSH0pMgg9M1VgAmpDXg9JeoSv0ixujFjFnvHzAfQs=; b=rRWyBLPM/C7OZeJpRa6QFcBEsFMSWqapFXYsSvrM3Ltp43egGIePfMMBkd0cvUkG4B 5ujX6Ku7NtelaxPZgxrNegM8GNSCAX72CdxVOQsG3iPTumxkGGC3ZOxEdxc2nlqb0jOn GSHS3vjAeiHs9izTOaG9/J5r0e6glkzJEb5XWMVEWCuaiYevwNCO1Y27ladeZfOEh6xp yePkcyVX4GLtAn89b2marX7OubeFKkfDk79EEV9JdPpFQg93n0aYU/g7557adzzQg7uj lIhm89+Vi7yD974ZAqQI+M484ZXzLIHo9ybyRtr0JKWhHNJtHevvxaZplBJG6/xk0Giz gqYA== Sender: swupdate@googlegroups.com X-Gm-Message-State: APjAAAVXy4D8BPr97vEI/w49ZKXvWdorXOWRRrthmNUGzR8ZWXDFOrkD 9DN/H4cMzmkGsD7SryU6bF8= X-Google-Smtp-Source: APXvYqzV5XLaV/pSTcCVdQ9H+8CQEoyv8RaghWxWds5ZrRtIQ66Ks2bayjxntIPq3hFvLk6wNu+Mvw== X-Received: by 2002:a25:5b06:: with SMTP id p6mr79437072ybb.432.1564745490759; Fri, 02 Aug 2019 04:31:30 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a25:e64f:: with SMTP id d76ls126074ybh.8.gmail; Fri, 02 Aug 2019 04:31:30 -0700 (PDT) X-Received: by 2002:a25:59d6:: with SMTP id n205mr82974078ybb.276.1564745490099; Fri, 02 Aug 2019 04:31:30 -0700 (PDT) Date: Fri, 2 Aug 2019 04:31:29 -0700 (PDT) From: Uwe Schuster To: swupdate Message-Id: Subject: [swupdate] [libubootenv] [PATCH] uboot_env: fix checking of i and m type variable attributes MIME-Version: 1.0 X-Original-Sender: uwe.schuster68@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: , This patch fixes format checking for variables with i and m type attributes reported by me in https://groups.google.com/d/msg/swupdate/ShdD10dl7Pc/ULUYSpFDCAAJ . I copied the code which does the same task from original u-boot sources so there might be a license issue with that (LGPL-GPL). I'm not a license expert so feel free to fix that. --- src/uboot_env.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) { struct var_entry *entry; @@ -1115,13 +1187,18 @@ static bool libuboot_validate_flags(struct var_entry *entry, const char *value) } break; case TYPE_ATTR_BOOL: - ok_access = (value[0] == '1' || value[0] == 'y' || value[0] == 't' || + ok_type = (value[0] == '1' || value[0] == 'y' || value[0] == 't' || value[0] == 'Y' || value[0] == 'T' || value[0] == '0' || value[0] == 'n' || value[0] == 'f' || value[0] == 'N' || value[0] == 'F') && (strlen(value) != 1); break; case TYPE_ATTR_IP: + if ( 0 != eth_validate_ipaddr_str(value) ) + ok_type = false; + break; case TYPE_ATTR_MAC: + if ( 0 != eth_validate_ethaddr_str(value) ) + ok_type = false; break; } return ok_type; diff --git a/src/uboot_env.c b/src/uboot_env.c index 91f94e7..09d210d 100644 --- a/src/uboot_env.c +++ b/src/uboot_env.c @@ -113,6 +113,78 @@ static char access_tostring(access_attribute a) return 'a'; } + +static inline int is_hex_prefix(const char *value) +{ + return value[0] == '0' && (value[1] == 'x' || value[1] == 'X'); +} + +static void skip_num(int hex, const char *value, const char **end, + int max_digits) +{ + int i; + + if (hex && is_hex_prefix(value)) + value += 2; + + for (i = max_digits; i != 0; i--) { + if (hex && !isxdigit(*value)) + break; + if (!hex && !isdigit(*value)) + break; + value++; + } + if (end != NULL) + *end = value; +} + +static int eth_validate_ethaddr_str(const char *addr) +{ + const char *end; + const char *cur; + int i; + + cur = addr; + for (i = 0; i < 6; i++) { + skip_num(1, cur, &end, 2); + if (cur == end) + return -1; + if (cur + 2 == end && is_hex_prefix(cur)) + return -1; + if (i != 5 && *end != ':') + return -1; + if (i == 5 && *end != '\0') + return -1; + cur = end + 1; + } + + return 0; +} + +static int eth_validate_ipaddr_str(const char *addr) +{ + const char *end; + const char *cur; + int i; + + /* To not confuse things, checking is done the same as in u-boot sources, + despite the fact that e.g. 192.1 is also a valid IP address */ + + cur = addr; + for (i = 0; i < 4; i++) { + skip_num(0, cur, &end, 3); + if (cur == end) + return -1; + if (i != 3 && *end != '.') + return -1; + if (i == 3 && *end != '\0') + return -1; + cur = end + 1; + } + + return 0; +} + static struct var_entry *__libuboot_get_env(struct vars *envs, const char *varname)