Re: Bug in digest_md5_parse_challenge

"Paul Lesniewski" <[email protected]>
Newsgroups gmane.mail.squirrelmail.devel
Message-ID <[email protected]>
On Sat, Aug 16, 2008 at 8:38 PM, Paul Lesniewski <[email protected]> wrote:
> On Sat, Aug 16, 2008 at 8:00 PM, Pablo Álvarez de Sotomayor Posadillo
> <[email protected]> wrote:
>>
>>    Paul> If base64_decode() returns FALSE, then !== should catch it.
>>    Paul> Can you explain why !== does not work?
>>
>> Well, you are right, that solve the bug, but it still remain another
>> bug, and I discovered it now, when I've check why with the !=
>> condition turn off the warnings and with !== still remain. The new bug
>> is produced because the while loops once more than the neccesary, that
>> is, in each while loop the function substract one part of the
>> $challenge string, so when the string is empty it shows a message
>> warning about that (the exact message is " Uninitialized string
>> offset: 0"). The program pass the !== condition if the variables are
>> not equals or not of the same type, so, in the case described, a
>> boolean type is diferent from a string type, passing the condition. In
>> the other hand, with the != condition your are doing an underlying
>> cast and the while stops at the correct loop. Remember that an empty
>> string ("") is considered as FALSE in a cast conversion. So, finally,
>> or you put one != condition or you put two !== condition (one with the
>> boolean comparision and another one with the string comparision), but
>> in the first case it's recommended a comment explaining that
>> comparision.
>
> The reason I chose !== was because with stable code, we need to treat
> the rest of the code as a black box and touch as little as we can with
> any changes, and the !== means it will only test for a single
> condition (the one initially identified, where base64_decode() returns
> specifically FALSE), whereas != can catch any other value that can be
> evaluated as FALSE such as 0, "", array(), and "0".  It is not good to
> make assumptions about the meaning of those other possible values.
>
> So, if we continue on that track, we'd have to add another
> type-specific check, but I'm now going to step away from the black box
> approach and look inside the loop, where we can see that it is clear
> that any of the other types that can be cast as boolean FALSE are not
> expected therein.  Therefore, the better solution is (and please, if
> you don't mind, test this and let us know if it works OK):
>
>    while (!empty($challenge)) {

Additionally, if base64_decode() returns FALSE, we need to add one
more line ABOVE the while statement so that the return value is
initialized (otherwise, it should generate a PHP notice):

$parsed = array();

Cheers,

 Paul

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
-----
squirrelmail-devel mailing list
Posting guidelines: http://squirrelmail.org/postingguidelines
List address: [email protected]
List archives: http://news.gmane.org/gmane.mail.squirrelmail.devel
List info (subscribe/unsubscribe/change options): https://lists.sourceforge.net/lists/listinfo/squirrelmail-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.