Thanks, now I understood. :)

anyway I see a problem. For example on x86_64 double is not always able to
keep a long number without precision lost.
May be you should receive arguments as zvals and use old or new code
depending on input types.

BTW: I'm not sure if rand() should be fixed at all.
According to http://php.net/manual/en/function.rand.php it should accept
integers and return integer.

Thanks. Dmitry.

On Fri, Mar 22, 2013 at 12:08 PM, Anatol Belski <a...@php.net> wrote:

> Dmitry,
>
> first of all thanks for taking a look :)
>
> The issue in a few words
> - mt_rand reads arguments as long
> - user pass a float from the userspace
> - zend_parse_parameters with 'l' casts to long
>
> Here's the essential snippet
> echo mt_rand(0,pow(10,12));
> PHP Warning:  mt_rand(): max(-727379968) is smaller than min(0)
>
> So reading as long would probably not work, in the first place because the
> input data exceeding LONG_MAX will be corrupted by the conversion. So what
> I did
> - read input as max precision possible, no corruption
> - calculate as well with double
> - return the old way int if it's in LONG_MAX range, otherwise return float
>
> Is there a solution I don't see (or do I get your suggestion wrong)? It's
> just essential to get the input as precise as it can be across PHP.
>
> Besides that what could be impacts changing input arg types in this
> concrete case? User probably wouldn't realize that at all.
>
> Thanks
>
> Anatol
>
> On Fri, March 22, 2013 07:40, Dmitry Stogov wrote:
> > Hi Anatol,
> >
> >
> > To be honest, I didn't understand all the details of the patch :)
> >
> >
> > However, I see a problem:
> > You changed the prototype of user level rand() function to receive double
> > arguments instead of long. I think it's disallowed, but you may get
> > arguments as longs and then convert them to double. Will it work?
> >
> >
> > Thanks. Dmitry.
> >
> >
> > On Thu, Mar 21, 2013 at 9:26 PM, Dmitry Stogov <dmi...@zend.com> wrote:
> >
> >
> >> I'll able to look only tomorrow morning.
> >>
> >>
> >> Thanks. Dmitry.
> >>
> >>
> >>
> >> On Thu, Mar 21, 2013 at 8:46 PM, Anatol Belski <a...@php.net> wrote:
> >>
> >>
> >>> Hi Dmitry,
> >>>
> >>>
> >>> I developed a patch for this one
> >>> https://bugs.php.net/bug.php?id=64450 .
> >>> It's regarding to the long overflow in mt_rand(). The main idea is to
> >>> work with the args as double internally and then return php float if
> >>> it exceeds the LONG_MAX. I strived to let the old behavior to be
> >>> unchanged, all the older tests pass. Please take a look.
> >>>
> >>> Regards
> >>>
> >>>
> >>> Anatol
> >>>
> >>>
> >>
> >>
> >
>
>

Reply via email to