Author: rhuijben Date: Sat Oct 31 22:51:40 2015 New Revision: 1711703 URL: http://svn.apache.org/viewvc?rev=1711703&view=rev Log: Avoid using data and *data when a read returns 0 bytes. Several buckets don't set data in this case.
* buckets/hpack_buckets.c (hpack_process): Be a bit more careful. * protocols/http2_stream.c (serf_http2__stream_processor): Don't use *data when len is 0. Most buckets don't set *data in this case on error paths. Solves segfault during testing. Modified: serf/trunk/buckets/hpack_buckets.c serf/trunk/protocols/http2_stream.c Modified: serf/trunk/buckets/hpack_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1711703&r1=1711702&r2=1711703&view=diff ============================================================================== --- serf/trunk/buckets/hpack_buckets.c (original) +++ serf/trunk/buckets/hpack_buckets.c Sat Oct 31 22:51:40 2015 @@ -1295,8 +1295,9 @@ hpack_process(serf_bucket_t *bucket) if (!SERF_BUCKET_READ_ERROR(status)) { - memcpy(&ctx->buffer[ctx->buffer_used], - data, len); + if (len > 0) + memcpy(&ctx->buffer[ctx->buffer_used], + data, len); ctx->buffer_used += len; } else @@ -1374,8 +1375,10 @@ hpack_process(serf_bucket_t *bucket) if (!SERF_BUCKET_READ_ERROR(status)) { - memcpy(&ctx->buffer[ctx->buffer_used], - data, len); + if (len > 0) + memcpy(&ctx->buffer[ctx->buffer_used], + data, len); + ctx->buffer_used += len; } else Modified: serf/trunk/protocols/http2_stream.c URL: http://svn.apache.org/viewvc/serf/trunk/protocols/http2_stream.c?rev=1711703&r1=1711702&r2=1711703&view=diff ============================================================================== --- serf/trunk/protocols/http2_stream.c (original) +++ serf/trunk/protocols/http2_stream.c Sat Oct 31 22:51:40 2015 @@ -251,22 +251,26 @@ serf_http2__stream_processor(void *baton if (!SERF_BUCKET_READ_ERROR(status)) { - char *printable = serf_bstrmemdup(bucket->allocator, data, len); - char *c; + if (len > 0) + { + char *printable = serf_bstrmemdup(bucket->allocator, data, len); + char *c; - for (c = printable; *c; c++) - { - if (((*c < ' ') || (*c > '\x7E')) && !strchr("\r\n", *c)) /* Poor mans isctrl*/ + for (c = printable; *c; c++) + { + /* Poor mans isctrl */ + if (((*c < ' ') || (*c > '\x7E')) && !strchr("\r\n", *c)) { *c = ' '; } - } + } #ifdef _DEBUG - fputs(printable, stdout); + fputs(printable, stdout); #endif - serf_bucket_mem_free(bucket->allocator, printable); + serf_bucket_mem_free(bucket->allocator, printable); + } } }