Overview building errors
Jen Linkova
jen at comp.chem.msu.su
Thu Sep 13 10:19:01 UTC 2001
On Thu, Sep 13, 2001 at 06:05:00PM +0900, Katsuhiro Kondou wrote:
> } I added some debugging fprintf(stderr..) at OV3packgroup() to get
> } size of all NEW.IDX files we are writting to. Error with pwrite() and
> } pointer outside the process's allocated address space appears
> } even if NEW.IDX file did not exist and was created by open(..O_CREAT..)
> } ans its size equal to 0.
>
> And what errno you got? I believe it's EINVAL in most OS'es. So,
Why??? NEW_IDX file did not exists before OV3packgroup() was called.
This file was created because open() was called with O_CREAT.
So, before pwrite() was called this file (and file descriptor)
exits and has size equal to 0.
> } > Sep 6 17:05:46 smaug makehistory[8323]: [ID 131604 news.error] tradindexed: packgroup cant write to
> } > /usr/local/news/spool/overview/n/p/m/b/netscape.public.mozilla.builds-NEW.IDX: No such file or directory
>
> I suspect above case(ENOENT) differs from yours.
As I wrote at my first message, 'ENOENT' appears because of
'%m' used in syslog() function. But pwrite() _does_ not set errno.
It wrote less than requested, but just wrote something, so
it returns number of bytes _acctually_ written, and doesn't
set errno.
So, %m may contains some junks - from previous errors.
The promblem is in unspecified behavior of write() if
we try n bytes from (char * buffer), and buffer[k] points
outside of the process's allocated address space ( k < n).
On some system (such FreeBSD 4.*) we get EFAULT at
firts time we call write(). So, code
if (pwrite(fd, &gh->indexmem[ge->low - ge->base] , nbytes,
sizeof(INDEXENTRY)*(ge->low - ge->base + delta - 1)) != nbytes) {
syslog(L_ERROR, "tradindexed: packgroup cant write to %s: %m", newidx);
will work correct - none will be written, return value will be '-1'
and errno will be set.
But on Linux 2.2.*
k bytes will be written (and k will be return value) at
first time we call write()/pwrite(). Remember - it's
less than requested number of bytes to be written..So, we will get error
message. It's just what I get - and what is possibly the problem
of author of original message.
If we write a loop trying to write all bytes we get '-1' and
errno = EFAULT at second attempt.
I changed pwrite.c - now there is a loop until all requested
data is written or -1 returned by write(2). So, I get 'Bad address'
error in logs now instead of 'No such file or directory' (with
original code).
I'm now trying to find why &gh->indexmem[ge->low - ge->base] + nbytes
is outside address space. But it isn't clear for me ;-(
SY, Jen aka Furry
More information about the inn-workers
mailing list