diff options
author | Timm Friebe <thekid@php.net> | 2010-06-16 09:49:25 +0000 |
---|---|---|
committer | Timm Friebe <thekid@php.net> | 2010-06-16 09:49:25 +0000 |
commit | ec54570362d936b6151d052da687ea90ef05cb2d (patch) | |
tree | 33cfff61c8596e96674e75a9e8d972252fece3fb | |
parent | 3896e7403d146d8f00fafe257fe045d4b27a8d6d (diff) | |
download | php-git-ec54570362d936b6151d052da687ea90ef05cb2d.tar.gz |
- MFT: Fixed segmentation fault when reading rows
# Problem surfaces when using FreeTDS, ASE 12.5 and reading text fields
# with NULL values. This is essentially a workaround for a bug in Free-
# TDS which is not setting the NULL indicators correctly, but provides
# a protection against possible segfaults if any other driver ever does
# this again:-)
-rw-r--r-- | ext/sybase_ct/php_sybase_ct.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/ext/sybase_ct/php_sybase_ct.c b/ext/sybase_ct/php_sybase_ct.c index afc2537914..3b11af25f9 100644 --- a/ext/sybase_ct/php_sybase_ct.c +++ b/ext/sybase_ct/php_sybase_ct.c @@ -1248,8 +1248,17 @@ static int php_sybase_fetch_result_row (sybase_result *result, int numrows) } default: { - /* This indicates anything else, return it as string */ - ZVAL_STRINGL(&result->data[i][j], result->tmp_buffer[j], result->lengths[j]- 1, 1); + /* This indicates anything else, return it as string + * FreeTDS doesn't correctly set result->indicators[j] correctly + * for NULL fields in some version in conjunction with ASE 12.5 + * but instead sets result->lengths[j] to 0, which would lead to + * a negative memory allocation (and thus a segfault). + */ + if (result->lengths[j] < 1) { + ZVAL_NULL(&result->data[i][j]); + } else { + ZVAL_STRINGL(&result->data[i][j], result->tmp_buffer[j], result->lengths[j]- 1, 1); + } break; } } |