Index: post.c =================================================================== --- post.c (revision 3830) +++ post.c (working copy) @@ -99,6 +99,7 @@ ret_t ret; post->type = (len > POST_SIZE_TO_DISK) ? post_in_tmp_file : post_in_memory; + post->type = post_in_tmp_file; post->size = len; if (post->type == post_in_tmp_file) { @@ -295,7 +296,7 @@ return ret_error; written = write (post->tmp_file_fd, post->info.buf, processed); - if (unlikely (written < 0)) + if (unlikely (written < 0 || written < processed)) return ret_error; cherokee_buffer_move_to_begin (&post->info, (cuint_t)written); @@ -329,7 +330,7 @@ return ret_error; written = write (post->tmp_file_fd, post->info.buf, post->info.len); - if (unlikely (written < 0)) + if (unlikely (written < 0 || write < processed)) return ret_error; cherokee_buffer_move_to_begin (&post->info, (cuint_t)written); @@ -408,6 +409,7 @@ { ret_t ret; ssize_t r; + size_t len; /* Sanity check */ @@ -419,9 +421,10 @@ */ switch (post->type) { case post_in_memory: + len = post->info.len - post->walk_offset; r = write (fd, post->info.buf + post->walk_offset, - post->info.len - post->walk_offset); - if (r < 0) { + len); + if (r < 0 || r < len) { int err = errno; if (err == EAGAIN) @@ -444,7 +447,7 @@ /* Write it to the fd */ r = write (fd, post->info.buf, post->info.len); - if (r < 0) { + if (r < 0 || r < post->info.len) { if (errno == EAGAIN) { if (eagain_fd) { *eagain_fd = fd;