PHP Sadness

(<5.3) Segfault when calling an undefined method on PDOStatement

Until PHP 5.3, calling an undefined method on a PDOStatement object causes a segfault:

php -n -r 'dl("pdo.so"); $stmt = new PDOStatement(); $stmt->someMethodWhichDoesNotExist();'
Segmentation fault

The actual line of code is in php/ext/pdo/pdo_stmt.c, line 2788:

static union _zend_function *dbstmt_method_get(
#if PHP_API_VERSION >= 20041225
    zval **object_pp,
#else
    zval *object,
#endif
    char *method_name, int method_len TSRMLS_DC)
{
    zend_function *fbc = NULL;
    char *lc_method_name;
#if PHP_API_VERSION >= 20041225
    zval *object = *object_pp;
#endif

    lc_method_name = emalloc(method_len + 1);
    zend_str_tolower_copy(lc_method_name, method_name, method_len);

    if (zend_hash_find(&Z_OBJCE_P(object)->function_table, lc_method_name,
            method_len+1, (void**)&fbc) == FAILURE) {
        pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(object TSRMLS_CC);
        /* not a pre-defined method, nor a user-defined method; check
         * the driver specific methods */
/// v HERE v ///
        if (!stmt->dbh->cls_methods[PDO_DBH_DRIVER_METHOD_KIND_STMT]) {
            if (!pdo_hash_methods(stmt->dbh,
                PDO_DBH_DRIVER_METHOD_KIND_STMT TSRMLS_CC)
                || !stmt->dbh->cls_methods[PDO_DBH_DRIVER_METHOD_KIND_STMT]) {
/// ^ HERE ^ ///
                goto out;
            }
        }

        if (zend_hash_find(stmt->dbh->cls_methods[PDO_DBH_DRIVER_METHOD_KIND_STMT],
                lc_method_name, method_len+1, (void**)&fbc) == FAILURE) {
            fbc = NULL;
            goto out;
        }
        /* got it */
    }

out:
    efree(lc_method_name);
    return fbc;
}