Frank Kromann has investigated these issues and has made fixes in the
CVS version of ext/mssql.

Michael

--- Michael Sisolak <[EMAIL PROTECTED]> wrote:
> Testing my existing SQL Server based sites with 4.3.0RC2 resulted in
> many memory access violations and crashes.  I believe that I have
> tracked these down to two different changes made to the MSSQL
> extension
> since 4.2.3:
> 
> 1) In version 1.82 of php_mssql.c there were 6 mallocs that were
> changed from "emalloc(res_length + 1);" to "emalloc(res_length);".  I
> believe, however, that the code that uses those memory blocks in at
> least four of the cases required that extra space.  This is the code
> as
> it is now for two of the changes in 4.3.0RC2:
> 
>       res_buf = (unsigned char *) emalloc(res_length);
>       bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset));
>       memcpy(res_buf, bin, res_length);
>       res_buf[res_length] = '\0';
> 
> It's the setting of res_buf[res_length] illegal, as that would be
> beyond the bounds of emalloc(res_length)?  Also this code (appearing
> in
> two of the changes):
> 
>       res_length = 19;
>       res_buf = (unsigned char *) emalloc(res_length);
>       sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" ,  . . .
> 
> Since the length of the character string is going to be 19
> characters,
> isn't the sprintf going to write an ASCIIZ ending beyond the size of
> res_buf?
> 
> Does the way emalloc() works take care of these problems?  Adding the
> "+ 1" back to these four emalloc() calls stopped one set of crashes.
> 
> 2) In version 1.83 of php_mssql.c the mssql_query() function was
> altered from:
> 
>       if ((num_fields = dbnumcols(mssql_ptr->link)) <= 0) {
>               RETURN_TRUE;
>       }
> 
> to:
> 
>       if ((num_fields = dbnumcols(mssql_ptr->link)) <= 0 &&
> !dbdataready(mssql_ptr->link)) {
>               RETURN_TRUE;
>       }
> 
> The CVS comment indicates that this change was for "fixing the
> mssql_query to handle multiple results correct if the first result
> does
> not return any data."  If I now call mssql_query() with a query that
> doesn't return any values (like a SQL-T EXEC call), however, PHP will
> crash (removing the new dbdataready() check eliminates the crash).
> 
> Michael Sisolak
> [EMAIL PROTECTED]
> 
> __________________________________________________
> Do you Yahoo!?
> Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
> http://mailplus.yahoo.com
> 


__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to