summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/zlib/zlib.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index bc1b47c221..ce1139dc5d 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -3393,7 +3393,14 @@ static VALUE
rb_gzfile_total_out(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
- return rb_uint2inum(gz->z.stream.total_out - ZSTREAM_BUF_FILLED(&gz->z));
+ uLong total_out = gz->z.stream.total_out;
+ long buf_filled = ZSTREAM_BUF_FILLED(&gz->z);
+
+ if (total_out >= (uLong)buf_filled) {
+ return rb_uint2inum(total_out - buf_filled);
+ } else {
+ return LONG2FIX(-(buf_filled - total_out));
+ }
}
/*