[Bug 1309818] Re: pwritev() doesn't work anymore on i386
Michael Ferguson
mpfergu at gmail.com
Thu Mar 12 20:54:18 UTC 2015
I'm also encountering this bug with updated Ubuntu 14.04 but only on
32-bit installations.
I have another program to reproduce it, included below. This program
makes it to printing out OK on the 64-bit version.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/uio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
int main() {
struct iovec vec[1];
char* buf;
size_t buflen = 4096;
char* data = "aaaaaaaaaaaaaaaaaaaa";
int datalen = strlen(data);
int fd;
ssize_t got;
buf = malloc(buflen);
assert(buf);
vec[0].iov_base = buf;
vec[0].iov_len = buflen;
// open file
fd = open("tmp.data", O_RDWR | O_CREAT, S_IRWXU);
assert(fd>=0);
// copy data to buf
memset(buf, 0, buflen);
memcpy(buf, data, datalen);
vec[0].iov_base = buf;
vec[0].iov_len = datalen;
// write data
got = pwritev(fd, vec, 1, 0);
//got = pwrite(fd, buf, datalen, 0);
if( got == - 1 ) perror("in write");
assert(got == datalen);
// clear buf
memset(buf, 0, buflen);
// read data
vec[0].iov_base = buf;
vec[0].iov_len = buflen;
got = preadv(fd, vec, 1, 0);
//got = pread(fd, buf, buflen, 0);
if( got == - 1 ) perror("in read");
assert(got == datalen);
// check data
assert(0 == memcmp(data, buf, datalen));
close(fd);
unlink("tmp.data");
printf("OK\n");
return 0;
}
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to eglibc in Ubuntu.
https://bugs.launchpad.net/bugs/1309818
Title:
pwritev() doesn't work anymore on i386
Status in eglibc package in Ubuntu:
New
Bug description:
I just upgraded to Trusty, and the following programs fails on x86:
#include <stdio.h>
#include <stdint.h>
#include <sys/uio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char *str0 = "hello ";
char *str1 = "world\n";
struct iovec iov[2];
ssize_t nwritten;
int fd = open("test.txt", O_CREAT | O_WRONLY);
iov[0].iov_base = str0;
iov[0].iov_len = strlen(str0);
iov[1].iov_base = str1;
iov[1].iov_len = strlen(str1);
nwritten = pwritev(fd, iov, 2, 0);
if(nwritten < 0)
perror("pwritev");
return 0;
}
Compiled without any flags, I see:
$ ./test
pwritev: File too large
And, from strace, I can see the offset parameter is handled wrongly by
(presumably) libc:
...
pwritev(3, [{"hello ", 6}, {"world\n", 6}], 2, 577730142772658176) = -1 EFBIG (File too large)
...
If I compile with -D_FILE_OFFSET_BITS=64, everything is right, but is
not a solution for my problem as I can't use that flag in my program.
I reported this here because it doesn't seem to happen on Debian sid,
but let me know if I have to report it upstream.
$ lsb_release -rd
Description: Ubuntu 14.04 LTS
Release: 14.04
$ apt-cache policy libc6
libc6:
Installed: 2.19-0ubuntu6
Candidate: 2.19-0ubuntu6
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/1309818/+subscriptions
More information about the foundations-bugs
mailing list