Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-6-1]: src/external/bsd/libevent/dist Apply patch (requested by sp...



details:   https://anonhg.NetBSD.org/src/rev/6c886023ce38
branches:  netbsd-6-1
changeset: 776044:6c886023ce38
user:      snj <snj%NetBSD.org@localhost>
date:      Wed Feb 04 04:41:13 2015 +0000

description:
Apply patch (requested by spz in ticket 1243):
Fix CVE-2014-6272.

diffstat:

 external/bsd/libevent/dist/buffer.c |  35 ++++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 9 deletions(-)

diffs (85 lines):

diff -r 338f3daadd95 -r 6c886023ce38 external/bsd/libevent/dist/buffer.c
--- a/external/bsd/libevent/dist/buffer.c       Fri Jan 16 15:42:33 2015 +0000
+++ b/external/bsd/libevent/dist/buffer.c       Wed Feb 04 04:41:13 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: buffer.c,v 1.1.1.1 2009/11/02 10:00:52 plunky Exp $    */
+/*     $NetBSD: buffer.c,v 1.1.1.1.20.1 2015/02/04 04:41:13 snj Exp $  */
 /*
  * Copyright (c) 2002, 2003 Niels Provos <provos%citi.umich.edu@localhost>
  * All rights reserved.
@@ -144,7 +144,8 @@
        va_list aq;
 
        /* make sure that at least some space is available */
-       evbuffer_expand(buf, 64);
+       if (evbuffer_expand(buf, 64) < 0)
+               return (-1);
        for (;;) {
                size_t used = buf->misalign + buf->off;
                buffer = (char *)buf->buffer + buf->off;
@@ -260,31 +261,47 @@
        buf->misalign = 0;
 }
 
+#ifndef SIZE_MAX
+#define SIZE_MAX ((size_t)-1)
+#endif
+
 /* Expands the available space in the event buffer to at least datlen */
 
 int
 evbuffer_expand(struct evbuffer *buf, size_t datlen)
 {
-       size_t need = buf->misalign + buf->off + datlen;
+       size_t used = buf->misalign + buf->off;
+
+       assert(buf->totallen >= used);
 
        /* If we can fit all the data, then we don't have to do anything */
-       if (buf->totallen >= need)
+       if (buf->totallen - used >= datlen)
                return (0);
+       /* If we would need to overflow to fit this much data, we can't
+        * do anything. */
+       if (datlen > SIZE_MAX - buf->off)
+               return (-1);
 
        /*
         * If the misalignment fulfills our data needs, we just force an
         * alignment to happen.  Afterwards, we have enough space.
         */
-       if (buf->misalign >= datlen) {
+       if (buf->totallen - buf->off >= datlen) {
                evbuffer_align(buf);
        } else {
                void *newbuf;
                size_t length = buf->totallen;
+               size_t need = buf->off + datlen;
 
                if (length < 256)
                        length = 256;
-               while (length < need)
-                       length <<= 1;
+               if (need < SIZE_MAX / 2) {
+                       while (length < need) {
+                               length <<= 1;
+                       }
+               } else {
+                       length = need;
+               }
 
                if (buf->orig_buffer != buf->buffer)
                        evbuffer_align(buf);
@@ -301,10 +318,10 @@
 int
 evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen)
 {
-       size_t need = buf->misalign + buf->off + datlen;
+       size_t used = buf->misalign + buf->off;
        size_t oldoff = buf->off;
 
-       if (buf->totallen < need) {
+       if (buf->totallen - used < datlen) {
                if (evbuffer_expand(buf, datlen) == -1)
                        return (-1);
        }



Home | Main Index | Thread Index | Old Index