homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: mmap.flush does not check for errors on windows
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.8
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: berker.peksag, ishimoto, ocean-city, paul.moore, pitrou, schmir, serhiy.storchaka, steve.dower, tim.golden, zach.ware
Priority: normal Keywords: patch

Created on 2008年02月15日 13:20 by schmir, last changed 2022年04月11日 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
mmap-flush.txt schmir, 2008年03月10日 08:19 make flush return None
Pull Requests
URL Status Linked Edit
PR 8692 merged berker.peksag, 2018年08月06日 18:55
Messages (11)
msg62427 - (view) Author: Ralf Schmitt (schmir) Date: 2008年02月15日 13:20
mmap.flush returns the result of the call to FlushViewOfFile as an
integer, and does not check for errors. On unix it does check for
errors. The function should return None and raise an exception if an
error occurs...
This bug can lead to data loss...
Here's the current version of that function:
static PyObject *
mmap_flush_method(mmap_object *self, PyObject *args)
{
	Py_ssize_t offset = 0;
	Py_ssize_t size = self->size;
	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size))
		return NULL;
	if ((size_t)(offset + size) > self->size) {
		PyErr_SetString(PyExc_ValueError, "flush values out of range");
		return NULL;
	}
#ifdef MS_WINDOWS
	return PyInt_FromLong((long) FlushViewOfFile(self->data+offset, size));
#elif defined(UNIX)
	/* XXX semantics of return value? */
	/* XXX flags for msync? */
	if (-1 == msync(self->data + offset, size, MS_SYNC)) {
		PyErr_SetFromErrno(mmap_module_error);
		return NULL;
	}
	return PyInt_FromLong(0);
#else
	PyErr_SetString(PyExc_ValueError, "flush not supported on this system");
	return NULL;
#endif
}
msg63436 - (view) Author: Ralf Schmitt (schmir) Date: 2008年03月10日 08:19
attached is a patch. I hope it is ok to change the semantics a bit. 
They were very strange:
- on unix it raises an exception on errors. otherwise it always returns 0.
- on windows it returns non-zero on success, and returns zero on errors.
Now, flush returns None or raises an Exception.
msg65549 - (view) Author: Ralf Schmitt (schmir) Date: 2008年04月16日 13:21
now this insanity is even documented with svn revision 62359
(http://hgpy.de/py/trunk/rev/442252bce780)
msg65550 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2008年04月16日 16:02
Perhaps it would be better if the patch came with unit tests. I agree
that the situation right now is insane.
PS : I have no power to commit or even accept a patch :)
msg65551 - (view) Author: Ralf Schmitt (schmir) Date: 2008年04月16日 16:26
I thought about this too, but I don't know of a way to provoke an error.
(Other than passing in illegal values, but the code tries to catch
those. And btw, raises an Exception on windows :)
One could currently pass in a negative value for size (this isn't caught
in the checks). e.g.
m.flush(500, -500) gives an 'error: [Errno 22] Invalid argument' on linux.
but then you don't want to rely on another bug for testing purposes.
msg138227 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2011年06月13日 03:00
This issue seems to be reproduced in following way.
1. Attach USB flash drive. (On my machine, it was attached as E drive)
2. Run python interactive shell and run following commands.
 (Confirmed on Python2.6)
 > import mmap
 > f = open("e:/temp.tmp", "w+b")
 > f.write("foo")
 > f.flush()
 > m = mmap.mmap(f.fileno(), 3)
 > m[:] = "xxx"
3. Detach USB flash drive violently here! (Without safety mechanism
 to detach USB flash drive, just plug it off) Note that
 python shell is still running.
4. Enter following command in python shell.
 > m.flush()
 It returns *0*. (Means failure)
msg242715 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2015年05月07日 14:37
I think we should be properly handling errors. If people agree I'll provide a new patch to cover code and doc changes, but I've no idea how to provide any form of unit test for the change.
msg323563 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2018年08月15日 11:03
If we break compatibility in any case, what if return None instead of 0? The function always returning 0 looks strange. The function always returning None is common.
msg323571 - (view) Author: Steve Dower (steve.dower) * (Python committer) Date: 2018年08月15日 15:40
I agree. We should definitely document it as a change, but I don't think there's anything useful you can do in the case of a flush failing anyway, so it seems unlikely that anyone could depend on the return value.
Returning None for success and exception on error sounds like a good change. Technically this is no longer returning zero, as previously documented, so if anyone wants to get *really* pedantic, we're not returning the "failed" result for success ;)
msg323898 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2018年08月22日 18:21
New changeset e7d4b2f205c711d056bea73a0093e2e2b200544b by Berker Peksag in branch 'master':
bpo-2122: Make mmap.flush() behave same on all platforms (GH-8692)
https://github.com/python/cpython/commit/e7d4b2f205c711d056bea73a0093e2e2b200544b
msg323899 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2018年08月22日 18:22
Thanks for the suggestions and for the reviews!
History
Date User Action Args
2022年04月11日 14:56:30adminsetgithub: 46375
2018年08月22日 18:22:51berker.peksagsetstatus: open -> closed
priority: high -> normal
messages: + msg323899

assignee: brian.curtin ->
resolution: fixed
stage: patch review -> resolved
2018年08月22日 18:21:16berker.peksagsetnosy: + berker.peksag
messages: + msg323898
2018年08月15日 15:40:45steve.dowersetmessages: + msg323571
2018年08月15日 11:03:44serhiy.storchakasetnosy: + serhiy.storchaka

messages: + msg323563
versions: + Python 3.8, - Python 2.7, Python 3.4, Python 3.5
2018年08月06日 21:05:29BreamoreBoysetnosy: - BreamoreBoy
2018年08月06日 18:55:51berker.peksagsetpull_requests: + pull_request8187
2015年05月07日 14:45:54brian.curtinsetnosy: - brian.curtin
2015年05月07日 14:37:18BreamoreBoysetnosy: + paul.moore, BreamoreBoy, zach.ware, steve.dower

messages: + msg242715
versions: + Python 3.4, Python 3.5, - Python 3.2, Python 3.3
2012年07月25日 03:18:45ishimotosetnosy: + ishimoto
2011年06月13日 11:17:41pitrousetstage: test needed -> patch review
2011年06月13日 03:00:19ocean-citysetmessages: + msg138227
2011年06月12日 18:50:10terry.reedysetversions: + Python 3.3, - Python 3.1
2010年09月03日 23:48:03brian.curtinsetassignee: brian.curtin
2010年09月03日 23:23:15pitrousetnosy: + tim.golden, brian.curtin

versions: - Python 2.6
2010年05月11日 20:56:40terry.reedysetversions: + Python 2.7, Python 3.2
2009年05月16日 19:42:55pitrousetnosy: + ocean-city
2009年05月16日 19:37:56ajaksu2setpriority: high
stage: test needed
versions: + Python 3.1, - Python 2.5, Python 3.0
2008年04月16日 16:26:17schmirsetmessages: + msg65551
2008年04月16日 16:02:58pitrousetnosy: + pitrou
messages: + msg65550
2008年04月16日 13:21:02schmirsetmessages: + msg65549
2008年04月15日 05:50:28loewissetkeywords: + patch
2008年03月10日 08:19:23schmirsetfiles: + mmap-flush.txt
messages: + msg63436
2008年02月15日 13:20:02schmircreate

AltStyle によって変換されたページ (->オリジナル) /