Hi, I'm currently working on base64 filter, and then I'm stuck with odd behaviour of stream_filter_write op. When I try to write some larger chunk to the next output filter than the length of buffer passed to my function, stream segfaults sometimes or goes into infinite loops on other attempts in the next call of the write op. Is this just my fault that I should always limit chunk length within the range of the given length? Or possible stream bugs?
Please try the attached patch and run the following script to reproduce the problem. <?php stream_filter_append(STDOUT, "string.segfaulting"); fwrite(STDOUT, "test"); ?> Thanks, Moriyoshi
Index: ext/standard/filters.c =================================================================== RCS file: /repository/php4/ext/standard/filters.c,v retrieving revision 1.3 diff -u -r1.3 filters.c --- ext/standard/filters.c 1 Jan 2003 12:36:06 -0000 1.3 +++ ext/standard/filters.c 4 Jan 2003 15:35:02 -0000 @@ -93,11 +93,64 @@ }; /* }}} */ +/* {{{ segfaulting stream filter implementation */ +static size_t strfilter_segfaulting_write(php_stream *stream, php_stream_filter +*thisfilter, + const char *buf, size_t count TSRMLS_DC) +{ + char *output; + size_t nbytes_wrote; + size_t output_len = count + 8; + output = emalloc(output_len); + memset(output, '+', output_len); + + nbytes_wrote = php_stream_filter_write_next(stream, thisfilter, output, +output_len); + efree(output); + + return nbytes_wrote; +} + +static size_t strfilter_segfaulting_read(php_stream *stream, php_stream_filter +*thisfilter, + char *buf, size_t count TSRMLS_DC) +{ + return php_stream_filter_read_next(stream, thisfilter, buf, count); +} + +static int strfilter_segfaulting_flush(php_stream *stream, php_stream_filter +*thisfilter, int closing TSRMLS_DC) +{ + return php_stream_filter_flush_next(stream, thisfilter, closing); +} + +static int strfilter_segfaulting_eof(php_stream *stream, php_stream_filter +*thisfilter TSRMLS_DC) +{ + return php_stream_filter_eof_next(stream, thisfilter); +} + +static php_stream_filter_ops strfilter_segfaulting_ops = { + strfilter_segfaulting_write, + strfilter_segfaulting_read, + strfilter_segfaulting_flush, + strfilter_segfaulting_eof, + NULL, + "string.segfaulting" +}; + +static php_stream_filter *strfilter_segfaulting_create(const char *filtername, const +char *filterparams, + int filterparamslen, int persistent TSRMLS_DC) +{ + return php_stream_filter_alloc(&strfilter_segfaulting_ops, NULL, persistent); +} + +static php_stream_filter_factory strfilter_segfaulting_factory = { + strfilter_segfaulting_create +}; +/* }}} */ + static const struct { php_stream_filter_ops *ops; php_stream_filter_factory *factory; } standard_filters[] = { { &strfilter_rot13_ops, &strfilter_rot13_factory }, + { &strfilter_segfaulting_ops, &strfilter_segfaulting_factory }, /* additional filters to go here */ { NULL, NULL } };
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php