diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-08-14 14:04:29 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-08-14 14:04:29 +0300 |
commit | 9a4c4768811f5462f7becfc47c4539bd72cc6dd0 (patch) | |
tree | 6b79bd120d2be82b7df41e59ca51b7cf16064d89 /libmailutils | |
parent | f9cc3bbee99bb4392942052efafced724568e5c8 (diff) | |
download | mailutils-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.c | 10 | ||||
-rw-r--r-- | libmailutils/stream/stream.c | 20 |
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; } |