Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Mar 2017 00:38:24 -0700
From:      Cy Schubert <Cy.Schubert@komquats.com>
To:        Ian Lepore <ian@freebsd.org>, Roman Divacky <rdivacky@freebsd.org>, Warner Losh <imp@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r315773 - head/sbin/devd
Message-ID:  <201703240738.v2O7cOhb003757@slippy.cwsent.com>
In-Reply-To: Message from Cy Schubert <Cy.Schubert@komquats.com> of "Thu, 23 Mar 2017 20:40:14 -0700." <201703240340.v2O3eEKh002609@slippy.cwsent.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message <201703240340.v2O3eEKh002609@slippy.cwsent.com>, Cy Schubert 
writes:
> In message <1490297671.58015.102.camel@freebsd.org>, Ian Lepore writes:
> > On Thu, 2017-03-23 at 19:58 +0100, Roman Divacky wrote:
> > > On Thu, Mar 23, 2017 at 02:36:51AM +0000, Warner Losh wrote:
> > > > 
> > > > Author: imp
> > > > Date: Thu Mar 23 02:36:51 2017
> > > > New Revision: 315773
> > > > URL: https://svnweb.freebsd.org/changeset/base/315773
> > > > 
> > > > Log:
> > > >   Implement quote escaping. String values may now contain " if you
> > > >   it is preceded by \.
> > > >   
> > > >   foo="I \"like\" C++"
> > > >   
> > > >   gives the value 'I "like" C++' to the variable 'foo'. If a
> > > > character
> > > >   other than " follows the \, both the \ and that character are
> > > > passed
> > > >   through.
> > > >   
> > > >   Differential Revision: https://reviews.freebsd.org/D6286
> > > >   Sponsored by: Netflix
> > > > 
> > > > Modified:
> > > >   head/sbin/devd/devd.cc
> > > >   head/sbin/devd/devd.hh
> > > > 
> > > > Modified: head/sbin/devd/devd.cc
> > > > ===================================================================
> > > > ===========
> > > > --- head/sbin/devd/devd.cc	Thu Mar 23 02:33:27 2017	(
> > > > r315772)
> > > > +++ head/sbin/devd/devd.cc	Thu Mar 23 02:36:51 2017	(
> > > > r315773)
> > > > @@ -411,6 +411,32 @@ var_list::is_set(const string &var) cons
> > > >  	return (_vars.find(var) != _vars.end());
> > > >  }
> > > >  
> > > > +/** fix_value
> > > > + *
> > > > + * Removes quoted characters that have made it this far. \" are
> > > > + * converted to ". For all other characters, both \ and following
> > > > + * character. So the string 'fre\:\"' is translated to 'fred\:"'.
> > > > + */
> > > > +const std::string &
> > > > +var_list::fix_value(const std::string &val) const
> > > > +{
> > > > +	char *tmp, *dst;
> > > > +	const char *src;
> > > > +	std::string *rv;
> > > > +
> > > > +	dst = tmp = new char[val.length()];
> > > > +	src = val.c_str();
> > > > +	while (*src) {
> > > > +		if (*src == '\\' && src[1] == '"')
> > > > +			src++;
> > > > +		else
> > > > +			*dst++ = *src++;
> > > > +	}
> > > > +	rv = new string(tmp);
> > > > +	delete tmp;
> > > > +	return *rv;
> > > > +}
> > > Can the temporary char[] be stack allocated? Also, when returning a
> > > reference to
> > > a heap allocated string who is responsible for freeing it? Perhaps
> > > you can just
> > > return std::string and let the compiler optimize it?
> > > 
> > > Roman
> > > 
> > 
> > Returning a reference to a new'd string is not good.
> > 
> > IMO, the implementation of the function should take into account the
> > idea that embedded escaped quotes are rare.  The function should be
> > optimized for readability and the common case of simply copying the
> > string unmodified, something like:
> > 
> > 
> > std::string
> > var_list::fix_value(const std::string &val) const
> > {
> > 	std::string rv(val);
> > 	std::string::size_type pos(0);
> > 
> > 	while ((pos = rv.find("\\\"", pos)) != rv.npos) {
> > 		rv.erase(pos, 1);
> > 	}
> > 	return (rv);
> > }
> 
> This revision caused devd a little gas. It failed to start moused for usb 
> attached mice (ums0 & ums1) to my latpop and nut failed to recognize my USB 
> connected UPS on a server.  downstairs due to a permission issue which nut 
> provides a devd.conf file with:
> 
> 	chgrp uucp /dev/$cdev; chmod g+rw /dev/$cdev

Hi Ian,

Your example above fixes the problem.


-- 
Cheers,
Cy Schubert <Cy.Schubert@cschubert.com>
FreeBSD UNIX:  <cy@FreeBSD.org>   Web:  http://www.FreeBSD.org

	The need of the many outweighs the greed of the few.





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703240738.v2O7cOhb003757>