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

Reply via email to