Re: A few questions about a package update / policy questions / GCC 9 error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2020-06-10 at 14:16 -0400, Simo Sorce wrote:
> On Wed, 2020-06-10 at 20:01 +0200, Dan Čermák wrote:
> > "Nathanael D. Noblet" <nathanael@xxxxxxx> writes:
> > 
> > > Hello,
> > > 
> > >   I maintain beanstalkd which is a message server of sorts. It recently
> > > released a new version however some changes I'm not 100% sure about.
> > > 
> > >   When compiling I got the following GCC error.
> > > 
> > > usr/include/bits/string_fortified.h:106:10: error: '__builtin_strncpy'
> > > specified bound 201 equals destination size [-Werror=stringop-
> > > truncation]
> > >   106 |   return __builtin___strncpy_chk (__dest, __src, __len, __bos
> > > (__dest));
> > >       |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > ~~~~~~~~
> > > 
> > > Results via google says that strncpy needs to have the third argument
> > > less than the 2nd, so I've got this patch, similar to others:
> > > 
> > > --- beanstalkd-1.12/tube.c.org  2020-06-10 09:37:35.129224346 -0600
> > > +++ beanstalkd-1.12/tube.c      2020-06-10 09:37:42.761138035 -0600
> > > @@ -12,7 +12,7 @@
> > >      if (!t)
> > >          return NULL;
> > > 
> > > -    strncpy(t->name, name, MAX_TUBE_NAME_LEN);
> > > +    strncpy(t->name, name, MAX_TUBE_NAME_LEN-1);
> > >      if (t->name[MAX_TUBE_NAME_LEN - 1] != '\0') {
> > >          t->name[MAX_TUBE_NAME_LEN - 1] = '\0';
> > >          twarnx("truncating tube name");
> > > 
> > > You'll notice it was already checking the len-1 for null. Can anyone
> > > verify that my change won't cause some un-intended bug I don't
> > > understand?
> > 
> > If I understand it correctly, then you are now invoking undefined
> > behavior: you copy at most MAX_TUBE_NAME_LEN-1 bytes to t->name and then
> > check whether the following byte (that was never written to) is not
> > equal to 0. I have not checked the code of beanstalkd, but the contents
> > of t->name[MAX_TUBE_NAME_LEN - 1] will be zero if it was allocated via
> > calloc() at best or random at worst. Irrespectively of that, the check
> > now no longer does what it *should*: null terminate the string if it is
> > not null terminated. It will now randomly null terminate it or not at
> > all.
> 
> strncpy() is a truly awful API unfortunately, the change is
> meaningless, but it is not random as Dan says.
> 
> The original form is more correct though, because now you can get
> spurious warnings that the string have been truncated when that is not
> true. (If t->name is not zeroized you will get the spurious warning for
> any string shorter than MAX_TUBE_NAME_LEN, which is the opposite of
> what the warning says.
> 
> The third argument to strncpy can be as long as the size of the buffer
> you are writing into, the additional check you have there insures that
> the string is terminated (even if that requires truncation).
> 
> So I would say you should drop your change and stop believing in random
> google results :)

Sorry, hit send prematurely.

If you really want to avoid the warning instead of ignoring it, you
should change the code this way:

strncpy(t->name, name, MAX_TUBE_NAME_LEN-1);
if (t->name[MAX_TUBE_NAME_LEN - 2] != '\0') {
    t->name[MAX_TUBE_NAME_LEN - 1] = '\0';
    twarnx("truncating tube name");
}

NOTE: the -2 in the condition, this is needed because memory locations
start counting from 0, so if you write N-1 bytes the Nth-1 byte is at
the N-2 position when you start counting from 0.
And that is the last position your strncpy wrote to, and if that is not
0 then potentially string truncation occurred.

You still want to zero the last available byte in that case and not the
N-1 available byte, so you set N-1 to 0, not N-2.

N-1 is the Nth byte when you start counting from 0 and N is the size of
the array.

HTH,
Simo.

> > > Finally, they also now support socket activation. Which means I was
> > > looking at .service file which I had setup to use a sysconfig
> > > environment file. When I looked at it, I realized that the default was
> > > to listen to 0.0.0.0 which means someone could install and if not
> > > really careful / pre config or what not have a service listening where
> > > they maybe don't want to. I was thinking of changing this to 127.0.0.1
> > > with a note about how it should be modified. However I figure if I do
> > > that, anyone with this installed and unmodified who gets the update
> > > will suddenly have their service stop listening to the outside world.
> > > What should be done then? 
> > > 
> > > My thought is I leave it as 0.0.0.0 for all released versions (but what
> > > about epel7) and then in rawhide change to 127.0.0.1. I just don't like
> > > leaving the package like that for epel as well.
> > > 
> > > Any ideas/direction would be appreciated.
> > > 
> > > Sincerely,
> > > -- 
> > > Nathanael
> > > 
> > > _______________________________________________
> > > devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
> > > To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
> > > Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> > > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> > > List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx
> > 
> > _______________________________________________
> > devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
> > To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
> > Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> > List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx

-- 
Simo Sorce
RHEL Crypto Team
Red Hat, Inc



_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux