On Wed, Nov 22, 2006 at 02:32:28AM +0100, Enrico Forestieri wrote:
> On Tue, Nov 21, 2006 at 07:21:13PM +0100, Andre Poenitz wrote:
> > On Fri, Nov 17, 2006 at 07:27:43PM -0000, [EMAIL PROTECTED] wrote:
> > > +protected:
> > > + iter_type
> > > + do_get(iter_type iit, iter_type eit, std::ios_base & b,
> > > +         std::ios_base::iostate & err, long & v) const
> > > + {
> > > +         std::string s;
> > > +         s.resize(64);
> > > +         for (int i = 0; iit != eit && isNumpunct(*iit); ++i, ++iit)
> > > +                 s[i] = static_cast<char>(*iit);
> > > +         string_num_get_facet f;
> > > +         f.get(s.begin(), s.end(), b, err, v);
> > 
> > Doesn't that mean you access uninitialized memory at the end of s?
> 
> You mean when/if I read more than 64 wide chars, right?

Then, and also when there are less than 64 characters.

Then s.end() will point at s.begin() + 64 and f.get will access the
range from the real end up to 64 as far as I can tell.

> What about the attached patch?
> 
> -- 
> Enrico

> Index: src/support/docstring.C
> ===================================================================
> --- src/support/docstring.C   (revision 16007)
> +++ src/support/docstring.C   (working copy)
> @@ -464,10 +464,17 @@ protected:
>       do_get(iter_type iit, iter_type eit, std::ios_base & b,
>               std::ios_base::iostate & err, long & v) const
>       {
> +             int const leap = 64;
> +             int size = leap;
>               std::string s;
> -             s.resize(64);
> -             for (int i = 0; iit != eit && isNumpunct(*iit); ++i, ++iit)
> +             s.resize(size);
> +             for (int i = 0; iit != eit && isNumpunct(*iit); ++i, ++iit) {
> +                     if (i >= size) {
> +                             size += leap;
> +                             s.resize(size);
> +                     }
>                       s[i] = static_cast<char>(*iit);
> +             }
>               string_num_get_facet f;
>               f.get(s.begin(), s.end(), b, err, v);

What about 'reserve' and  s += static_cast<...>

This happens to correct the other issue as well.

Andre'

Reply via email to