]> granicus.if.org Git - libevent/commitdiff
buffer: fix CreateFileMapping() leak from evbuffer_add_file()
authorAzat Khuzhin <azat@libevent.org>
Sun, 1 Aug 2021 08:53:17 +0000 (11:53 +0300)
committerAzat Khuzhin <azat@libevent.org>
Sun, 1 Aug 2021 09:05:43 +0000 (12:05 +0300)
evbuffer_file_segment_materialize() is called twice from
evbuffer_add_file(), and so win32 mapping will leak.

Fixes: #1186
buffer.c

index f74bbfaace0b19cf2c8fc052c11433820b52e241..822d97a5a93cd65733a8761082a8aaa62fc75be2 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -3054,7 +3054,7 @@ evbuffer_file_segment_materialize(struct evbuffer_file_segment *seg)
        const ev_off_t length = seg->length;
        const ev_off_t offset = seg->file_offset;
 
-       if (seg->contents)
+       if (seg->contents || seg->is_mapping)
                return 0; /* already materialized */
 
 #if defined(EVENT__HAVE_MMAP)
@@ -3213,12 +3213,10 @@ evbuffer_add_file_segment(struct evbuffer *buf,
        if (buf->flags & EVBUFFER_FLAG_DRAINS_TO_FD) {
                can_use_sendfile = 1;
        } else {
-               if (!seg->contents) {
-                       if (evbuffer_file_segment_materialize(seg)<0) {
-                               EVLOCK_UNLOCK(seg->lock, 0);
-                               EVBUFFER_UNLOCK(buf);
-                               return -1;
-                       }
+               if (evbuffer_file_segment_materialize(seg)<0) {
+                       EVLOCK_UNLOCK(seg->lock, 0);
+                       EVBUFFER_UNLOCK(buf);
+                       return -1;
                }
        }
        EVLOCK_UNLOCK(seg->lock, 0);