summaryrefslogtreecommitdiff
path: root/libmailutils
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-08-14 14:04:29 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-08-14 14:04:29 +0300
commit9a4c4768811f5462f7becfc47c4539bd72cc6dd0 (patch)
tree6b79bd120d2be82b7df41e59ca51b7cf16064d89 /libmailutils
parentf9cc3bbee99bb4392942052efafced724568e5c8 (diff)
downloadmailutils-9a4c4768811f5462f7becfc47c4539bd72cc6dd0.tar.gz
mailutils-9a4c4768811f5462f7becfc47c4539bd72cc6dd0.tar.bz2
Bugfixes.
* libmailutils/stream/mapfile_stream.c (_mapfile_open): For MU_STREAM_WRITE set open flags to O_RDWR. This is required for the remapping code to work. Without it mmap with MAP_SHARED falls with EACCESS. * libmailutils/stream/stream.c (mu_stream_close): Improve error checking.
Diffstat (limited to 'libmailutils')
-rw-r--r--libmailutils/stream/mapfile_stream.c10
-rw-r--r--libmailutils/stream/stream.c20
2 files changed, 17 insertions, 13 deletions
diff --git a/libmailutils/stream/mapfile_stream.c b/libmailutils/stream/mapfile_stream.c
index 215a95731..7e153b1a7 100644
--- a/libmailutils/stream/mapfile_stream.c
+++ b/libmailutils/stream/mapfile_stream.c
@@ -99,7 +99,7 @@ _mapfile_write (mu_stream_t stream, const char *iptr, size_t isize,
}
if (ftruncate (mfs->fd, mfs->offset + isize) != 0)
return errno;
- mfs->ptr = mmap (0, mfs->offset + isize, mfs->flags,
+ mfs->ptr = mmap (NULL, mfs->offset + isize, mfs->flags,
MAP_SHARED, mfs->fd, 0);
if (mfs->ptr == MAP_FAILED)
{
@@ -138,7 +138,7 @@ _mapfile_truncate (mu_stream_t stream, mu_off_t len)
}
if (ftruncate (mfs->fd, len) != 0)
return errno;
- mfs->ptr = len ? mmap (0, len, mfs->flags, MAP_SHARED, mfs->fd, 0) : NULL;
+ mfs->ptr = len ? mmap (NULL, len, mfs->flags, MAP_SHARED, mfs->fd, 0) : NULL;
if (mfs->ptr == MAP_FAILED)
{
int err = errno;
@@ -171,7 +171,7 @@ _mapfile_size (mu_stream_t stream, mu_off_t *psize)
mfs->size = stbuf.st_size;
if (mfs->size)
{
- mfs->ptr = mmap (0, mfs->size, mfs->flags , MAP_SHARED,
+ mfs->ptr = mmap (NULL, mfs->size, mfs->flags, MAP_SHARED,
mfs->fd, 0);
if (mfs->ptr == MAP_FAILED)
err = errno;
@@ -306,7 +306,7 @@ _mapfile_open (mu_stream_t stream)
else if (flags & MU_STREAM_WRITE)
{
mflag = PROT_WRITE;
- flg = O_WRONLY;
+ flg = O_RDWR;
}
else if (flags & MU_STREAM_CREAT)
return ENOSYS;
@@ -328,7 +328,7 @@ _mapfile_open (mu_stream_t stream)
mfs->size = st.st_size;
if (mfs->size)
{
- mfs->ptr = mmap (0, mfs->size, mflag , MAP_SHARED, mfs->fd, 0);
+ mfs->ptr = mmap (NULL, mfs->size, mflag, MAP_SHARED, mfs->fd, 0);
if (mfs->ptr == MAP_FAILED)
{
int err = errno;
diff --git a/libmailutils/stream/stream.c b/libmailutils/stream/stream.c
index 0131e3b52..8ff0b808d 100644
--- a/libmailutils/stream/stream.c
+++ b/libmailutils/stream/stream.c
@@ -1104,14 +1104,18 @@ mu_stream_close (mu_stream_t stream)
if (!(stream->flags & _MU_STR_OPEN))
return MU_ERR_NOT_OPEN;
- mu_stream_flush (stream);
- /* Do close the stream only if it is not used by anyone else */
- if (stream->ref_count > 1)
- return 0;
- _stream_event (stream, _MU_STR_EVENT_CLOSE, 0, NULL);
- if (stream->close)
- rc = stream->close (stream);
- _stream_clrflag (stream, _MU_STR_OPEN);
+ rc = mu_stream_flush (stream);
+ if (rc == 0)
+ {
+ /* Do close the stream only if it is not used by anyone else */
+ if (stream->ref_count > 1)
+ return 0;
+ _stream_event (stream, _MU_STR_EVENT_CLOSE, 0, NULL);
+ if (stream->close)
+ rc = stream->close (stream);
+ if (rc == 0)
+ _stream_clrflag (stream, _MU_STR_OPEN);
+ }
return rc;
}

Return to:

Send suggestions and report system problems to the System administrator.