From: Matthew DeVore Date: Mon, 20 May 2019 18:28:41 GMT Subject: Re: [RFC PATCH 3/3] list-objects-filter: implement composite filters Message-ID: In-Reply-To: <1E174CAA-BD57-400B-A83B-4AABFAFBC04B@comcast.net> > On 2019/05/17, at 6:17, Matthew DeVore wrote: > > We do have to require the combine operator (& or +) and % be encoded. For other operators, there are three options: > > ... > 3. Require encoding of a couple of "reserved" characters that don't appear in filters now, and don't typically appear in UNIX path names. This would allow for expansion later. For instance, "~&%*+|(){}!\" plus the ASCII range [0, 0x20] and single and double quotes - do not allow encoding of anything else. > > 4. Same requirements as 3, but permit encoding of other arbitrary characters. I tried implementing the reserved characters idea, and considering that it was a small amount of code, I think it's worth it: +static const char *RESERVED_NON_WS = "\"\\'[]{}!@#$^~*+"; + +static int has_reserved_character( + struct strbuf *sub_spec, struct strbuf *errbuf) +{ + const char *c = sub_spec->buf; + while (*c) { + if (*c <= ' ' || *strchr(RESERVED_NON_WS, *c)) + goto found_reserved; + c++; + } + + return 0; + +found_reserved: + if (errbuf) + strbuf_addf(errbuf, "must escape char in sub-spec: %c", *c); + return 1; +} +