]> granicus.if.org Git - libevent/commitdiff
make it so that evbuffer_add_file where we read the complete contents of the file...
authorNiels Provos <provos@gmail.com>
Thu, 29 Jan 2009 03:22:47 +0000 (03:22 +0000)
committerNiels Provos <provos@gmail.com>
Thu, 29 Jan 2009 03:22:47 +0000 (03:22 +0000)
svn:r1069

buffer.c

index a6de9518fcfb001f963681f025698513f31a2f98..04b88a8f3a570d96da0e71c071f29f7da88b4a28 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -1496,21 +1496,33 @@ evbuffer_add_file(struct evbuffer *outbuf, int fd,
 #endif
        {
                /* the default implementation */
+               struct evbuffer *tmp = evbuffer_new();
                ssize_t read;
 
-               if (lseek(fd, offset, SEEK_SET) == -1)
+               if (tmp == NULL)
+                       return (-1);
+
+               if (lseek(fd, offset, SEEK_SET) == -1) {
+                       evbuffer_free(tmp);
                        return (-1);
+               }
 
+               /* we add everything to a temporary buffer, so that we
+                * can abort without side effects if the read fails.
+                */
                while (length) {
-                       read = evbuffer_read(outbuf, fd, length);
+                       read = evbuffer_read(tmp, fd, length);
                        if (read == -1) {
-                               /* TODO(niels): deal with rewinding */
+                               evbuffer_free(tmp);
                                return (-1);
                        }
 
                        length -= read;
                }
 
+               evbuffer_add_buffer(outbuf, tmp);
+               evbuffer_free(tmp);
+
                close(fd);
        }