blob: c226edcdb1f825481785aa673b1b2b04e2bee4b2 [file] [log] [blame]
/* writev() source from a free'd buffer */
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/uio.h>
#include <stdio.h>
#define BUFFERS 30
#define READBUF 100
int main()
{
struct iovec buffers[BUFFERS];
int fd[2], i, amt, total_read, total_wrote;
char string[] = "String", dest[READBUF];
pipe(fd);
for (i = 0; i < BUFFERS; i++)
{
buffers[i].iov_base = malloc( sizeof(string) - 1 );
memcpy(buffers[i].iov_base, string, sizeof(string) - 1);
buffers[i].iov_len = sizeof(string) - 1;
}
free(buffers[10].iov_base); // free before use
total_wrote = writev(fd[1], buffers, BUFFERS);
close(fd[1]);
total_read = 0;
do
{
amt = read(fd[0], dest, READBUF - 1);
if (amt != -1)
{
dest[amt] = '\0';
total_read += amt;
printf("%s", dest);
}
} while (total_read != total_wrote);
printf("\n");
for (i = 0; i < BUFFERS; i++)
if (i != 10) // don't double free
free(buffers[i].iov_base);
close(fd[0]);
return 0;
}