From patchwork Fri Jan 22 11:20:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 25112 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:ab61:0:0:0:0:0 with SMTP id u88csp1083072ybi; Fri, 22 Jan 2021 03:21:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJzHcVd6CpDZu4IweigvYpHIKPsBWOJdamakkNeOKQG4J0JdV5sCu2Q+WpIW4N0zCsfEwy7n X-Received: by 2002:a17:907:e9e:: with SMTP id ho30mr2716601ejc.529.1611314489228; Fri, 22 Jan 2021 03:21:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611314489; cv=none; d=google.com; s=arc-20160816; b=E3MyXmOnUyz2zBBuUHAka9XofESkun0v4Ae7f60gIEetr/4BtCE5eGuXx/DezyEGBO t1wBXSiwcy7erLcRS81hy1z4tu2nzVS9sbXex1cTNlE5mrBsgdkjCta+KvK6W1yB1VYI P1UTkC0klz8FD8QZ1aHjKOKK4bqic2QORCzObiIiw7I5NBI0l+ds90rqMaRahB3nGgrS y/1O+5HnFeZdqeXW925MvocoWkRPliz9bapCWthFfE+Ugdch+6kv+tw/Ccl5zy94tADu FCr6n/0Pg/0Demo5STy1HH0LzxZfdc0WXWWGASpWI0cBqNFxP/4hQnVZ2ZCN2hj42qY9 LsYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=hLv2hw8f4OqCc+jG4cw5eSGJW2XizP70JCqurlxtJgs=; b=wKZ335PjAuSjFC7L8Cr5bQBNZSDOG55StuTMgQqKuJ7FreMkdJckPnbO/kUzIef6aV YDI/OFvpUL1Vx/pLDe7a/Y/8HMQqaYiV38So8szwWgDMDOyQPwMXF9LaQyRkPGn0MXZo nxBWBkTWFYmHrUUUXErJXWFwNMoPL2m3s1UruiqwS0lxO/k1pqOeCqzO2buhAtNKE6H+ DNVoLMQJ6SO2N5KrwUj7B0W1hv3JSr3gL5E5B+k21Mc/pB0+UpYl58/K8iocrx40hxnM DCN00sGt35Lq6QaqksaM92cmkYCZfDQzbPoxHLHGIUPU/HpcXQtHX7LToT4LDHUv+tvo 6LtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=LP2TWUtZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e6si2463472edz.361.2021.01.22.03.21.28; Fri, 22 Jan 2021 03:21:29 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=LP2TWUtZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9899968A466; Fri, 22 Jan 2021 13:21:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C7A4268A329 for ; Fri, 22 Jan 2021 13:21:03 +0200 (EET) Received: by mail-lj1-f181.google.com with SMTP id e7so6067724ljg.10 for ; Fri, 22 Jan 2021 03:21:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=0tqesKxf9Q+k2/HqKtigHhunyL1BUuz0/niwUhS0CRo=; b=LP2TWUtZSNEzxVruncY8pgsceJaSjemb1930Jeo4CpfMVu8hkZHFh7S66BE/xxPZS6 id8Z2ij09ptdvOAly8RHMCX4XQzWaif2nv05zzs+FwMxAFSwYDR3GT4NghRVpPy5hI4a I443J435IJiIpranalKCfNS6xPiG0RsMIyzrrwNeaHCn6FZ/uVqt3WVw5PI0NwBIojeh VOHUEFkAjTEtcSbA3yfsHuM/DyF8fL+O1WDZmlY0KQHgXTwtci9vTQMzLvviA8cZQF7v sB2WqJV2qjkBa3knvjyLMY7wVniEsyBvFnGDwJOPOH5tWJGxQdyStzNmOKOw8J1YCwlB PhoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0tqesKxf9Q+k2/HqKtigHhunyL1BUuz0/niwUhS0CRo=; b=GrwIPi0mCaHns5PYNuMsKktod1DSN2C6WYHhl2OaHP+Bv5n4higRKHujRSHwraR5jk Zlpq21rFD6+M3/gGQ5r5I794ogcsEL33lwWlvwjbMSh+wHU3C+HNKxvxQYjKeTXM2SH2 vg3bpmU5x0n6WtnW/vKK4HBg7+a/a+ZXjm4S+T/nAiPoM5NG/Fl7bHU16K8WS0/yRzBq xwoti1IhUuTuAN1xIRYtQoBCu9GJOR951JXtt3bpPfkvUHUVdmZHNX5gP0bQjNZywBWN 7n5yk4OUx0jIeRfY8JCl78J8AogAqEwG7ZTJjeoQwNaJZglo5IvdIUfG/ldKrLNw3TG3 Zu2g== X-Gm-Message-State: AOAM531UP0bLBotCBefgMbN3gUr/hqL+BF4eA+5mCY7rwiB5ScKseLgM gIAw7L/yrO//FS4QTAtwzwzpsgGMkQ4= X-Received: by 2002:a2e:9bce:: with SMTP id w14mr2136257ljj.120.1611314463263; Fri, 22 Jan 2021 03:21:03 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v24sm919451ljc.56.2021.01.22.03.21.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jan 2021 03:21:02 -0800 (PST) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 22 Jan 2021 13:20:56 +0200 Message-Id: <20210122112058.49068-3-jeebjp@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210122112058.49068-1-jeebjp@gmail.com> References: <20210122103725.24370-1-jeebjp@gmail.com> <20210122112058.49068-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 2/4] avutil/{avstring, bprint}: add XML attribute value escape modes X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 3wDi6y48NLWm Content-Length: 6177 From: Jan Ekström Signed-off-by: Jan Ekström --- libavutil/avstring.h | 10 ++++++---- libavutil/bprint.c | 26 ++++++++++++++++++++++++++ tools/ffescape.c | 10 ++++++---- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/libavutil/avstring.h b/libavutil/avstring.h index 189b4726a5..c83aa9cf57 100644 --- a/libavutil/avstring.h +++ b/libavutil/avstring.h @@ -321,10 +321,12 @@ int av_match_name(const char *name, const char *names); char *av_append_path_component(const char *path, const char *component); enum AVEscapeMode { - AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. - AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. - AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. - AV_ESCAPE_MODE_XML_CHAR_DATA, ///< Use XML non-markup character data escaping. + AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode. + AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping. + AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping. + AV_ESCAPE_MODE_XML_CHAR_DATA, ///< Use XML non-markup character data escaping. + AV_ESCAPE_MODE_XML_ATT_VALUE_SINGLE_QUOTED, ///< Use XML single quoted attribute value escaping. + AV_ESCAPE_MODE_XML_ATT_VALUE_DOUBLE_QUOTED, ///< Use XML double quoted attribute value escaping. }; /** diff --git a/libavutil/bprint.c b/libavutil/bprint.c index 7cdbb75095..c42ccdeee5 100644 --- a/libavutil/bprint.c +++ b/libavutil/bprint.c @@ -298,6 +298,32 @@ void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_cha } break; + case AV_ESCAPE_MODE_XML_ATT_VALUE_SINGLE_QUOTED: + /* escape XML single quoted attribute values as per 2.3 */ + /* "'" ([^<&'] | Reference)* "'" */ + for (; *src; src++) { + switch (*src) { + case '&' : av_bprintf(dstbuf, "%s", "&"); break; + case '<' : av_bprintf(dstbuf, "%s", "<"); break; + case '\'': av_bprintf(dstbuf, "%s", "'"); break; + default: av_bprint_chars(dstbuf, *src, 1); + } + } + break; + + case AV_ESCAPE_MODE_XML_ATT_VALUE_DOUBLE_QUOTED: + /* escape XML double quoted attribute values as per 2.3 */ + /* '"' ([^<&"] | Reference)* '"' */ + for (; *src; src++) { + switch (*src) { + case '&' : av_bprintf(dstbuf, "%s", "&"); break; + case '<' : av_bprintf(dstbuf, "%s", "<"); break; + case '"' : av_bprintf(dstbuf, "%s", """); break; + default: av_bprint_chars(dstbuf, *src, 1); + } + } + break; + /* case AV_ESCAPE_MODE_BACKSLASH or unknown mode */ default: /* \-escape characters */ diff --git a/tools/ffescape.c b/tools/ffescape.c index e18f1edaf9..c827e0b301 100644 --- a/tools/ffescape.c +++ b/tools/ffescape.c @@ -101,10 +101,12 @@ int main(int argc, char **argv) break; } case 'm': - if (!strcmp(optarg, "auto")) escape_mode = AV_ESCAPE_MODE_AUTO; - else if (!strcmp(optarg, "backslash")) escape_mode = AV_ESCAPE_MODE_BACKSLASH; - else if (!strcmp(optarg, "quote")) escape_mode = AV_ESCAPE_MODE_QUOTE; - else if (!strcmp(optarg, "xml_char_data")) escape_mode = AV_ESCAPE_MODE_XML_CHAR_DATA; + if (!strcmp(optarg, "auto")) escape_mode = AV_ESCAPE_MODE_AUTO; + else if (!strcmp(optarg, "backslash")) escape_mode = AV_ESCAPE_MODE_BACKSLASH; + else if (!strcmp(optarg, "quote")) escape_mode = AV_ESCAPE_MODE_QUOTE; + else if (!strcmp(optarg, "xml_char_data")) escape_mode = AV_ESCAPE_MODE_XML_CHAR_DATA; + else if (!strcmp(optarg, "xml_att_value_single_quoted")) escape_mode = AV_ESCAPE_MODE_XML_ATT_VALUE_SINGLE_QUOTED; + else if (!strcmp(optarg, "xml_att_value_double_quoted")) escape_mode = AV_ESCAPE_MODE_XML_ATT_VALUE_DOUBLE_QUOTED; else { av_log(NULL, AV_LOG_ERROR, "Invalid value '%s' for option -m, "