[PATCH] Fix the FreeBSD build
Jeremy Allison
jra at samba.org
Wed Jun 7 20:07:39 UTC 2017
On Thu, Jun 08, 2017 at 07:47:49AM +1200, Andrew Bartlett wrote:
> On Wed, 2017-06-07 at 10:17 -0700, Jeremy Allison wrote:
> > On Wed, Jun 07, 2017 at 10:09:50PM +1200, Andrew Bartlett via samba-technical wrote:
> > > }
> > > +#elif (!defined(STRERROR_R_XSI_NOT_GNU))
> > > +#undef strerror_r
> > > +int rep_strerror_r(int errnum, char *buf, size_t buflen)
> > > +{
> > > + char *s = strerror_r(errnum, buf, buflen);
> > > + if (s == NULL) {
> > > + /* Shouldn't happen, should always get a string */
> > > + return EINVAL;
> > > + } else if (s != buf) {
> > > + strlcpy(buf, s, buflen);
> > > + if (strlen(s) > buflen - 1) {
> > > + return ERANGE;
> > > + }
> >
> > Minor nit - the ERANGE check should be *before*
> > the strlcpy, that way we don't touch *buf if we're
> > returning an error.
>
> It was deliberate, but I've not checked the actual behaviour of the
> official call and the manpage is unclear which has precedence.
Yeah I'm pretty sure that behavior (writing into *buf on ERANGE)
is wrong though. "Thou shalt never mess with args on error" is
pretty baked into POSIX :-).
> Could you do that, as sadly this is becoming a massive time sink at
> this point, and Volker's 'just give up and go back to strerror()' patch
> is already in?
>
> The untested idea was that it would always write something, as error
> checking by callers of strerror_r seems unlikely, and not initialising
> the buffer seems even less expected.
I'll take a look.
More information about the samba-technical
mailing list