Zeev Suraski <[EMAIL PROTECTED]> writes:

> There's a big difference between an undefined behavior which may
> result in a crash, and an organized shutdown.  The former is
> dangerous, the latter is not.

[Sorry poor English follows]

I agree, but *who* is in charge to decide *what* an organized shutdown is?

When emalloc fails to allocate ZEND INTERNAL MEMORY the current
behaviour is correct, but what if the author of an EXTENSION has a
different idea?

I faced this problem using odbc with Solid.  SQLColAttributes can
return very big number (2147483647) when you ask for
SQL_COLUMN_DISPLAY_SIZE of a LONG VARCHAR and obviously my computer
does not have enough virtual memory.

The patch below try to fix the problem, can some odbc guru confirm if
my solution is right?

The patch still contains the emalloc check, feel free to remove it :-)

> There are some parts of code that don't rely on this, from the times
> when it wasn't true, but it doesn't cause any problem, so there's no
> reason to change it urgently.

Ok, I hope my current patch can live longer :-)

> Zeev

Ciao
-- 
Walter Franzini, e-mail: [EMAIL PROTECTED]
SysNet, Via Digione 8, 27100 Pavia - Italy

diff -ur php-4.0.6.ORIG/ext/odbc/php_odbc.c php-4.0.6/ext/odbc/php_odbc.c
--- php-4.0.6.ORIG/ext/odbc/php_odbc.c  Tue Jun 19 19:55:00 2001
+++ php-4.0.6/ext/odbc/php_odbc.c       Thu Aug  2 09:13:00 2001
@@ -565,6 +565,7 @@
 {
        RETCODE rc;
     int i;
+       long _size=0;
     SWORD       colnamelen; /* Not used */
        SDWORD      displaysize;
        ODBCLS_FETCH();
@@ -610,11 +611,18 @@
                                break;
 #endif /* HAVE_ADABAS */
                        default:
+                _size = result->longreadlen;
                                rc = SQLColAttributes(result->stmt, (UWORD)(i+1), 
SQL_COLUMN_DISPLAY_SIZE,
                                                                        NULL, 0, NULL, 
&displaysize);
-                               result->values[i].value = (char *)emalloc(displaysize 
+ 1);
-                               rc = SQLBindCol(result->stmt, (UWORD)(i+1), 
SQL_C_CHAR, result->values[i].value,
-                                                       displaysize + 1, 
&result->values[i].vallen);
+                _size = (_size <= displaysize ? _size : displaysize);
+                result->values[i].value = (char *)emalloc(_size + 1);
+                if (result->values[i].value) {
+                    rc = SQLBindCol(result->stmt, (UWORD)(i+1), SQL_C_CHAR, 
+                                    result->values[i].value, _size + 1,
+                                    &result->values[i].vallen);
+                } else {
+                    return 0;
+                }
                                break;
                }
     }
Only in php-4.0.6/ext/odbc: php_odbc.c~
Only in php-4.0.6.ORIG/: mod_build


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to