Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
ab0e9f70
Commit
ab0e9f70
authored
Dec 16, 2011
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Plain Diff
Issue #10350: Read and save errno before calling a function which might overwrite it.
Original patch by Hallvard B Furuseth.
parents
e2b2bf55
c345ce1a
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
33 additions
and
12 deletions
+33
-12
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_io/fileio.c
Modules/_io/fileio.c
+11
-3
Modules/_multiprocessing/semaphore.c
Modules/_multiprocessing/semaphore.c
+3
-1
Modules/main.c
Modules/main.c
+2
-1
Modules/readline.c
Modules/readline.c
+8
-5
Modules/timemodule.c
Modules/timemodule.c
+3
-1
Parser/myreadline.c
Parser/myreadline.c
+3
-1
No files found.
Misc/NEWS
View file @
ab0e9f70
...
...
@@ -419,6 +419,9 @@ Core and Builtins
Library
-------
-
Issue
#
10350
:
Read
and
save
errno
before
calling
a
function
which
might
overwrite
it
.
Original
patch
by
Hallvard
B
Furuseth
.
-
Issue
#
11610
:
Introduce
a
more
general
way
to
declare
abstract
properties
.
-
Issue
#
13591
:
A
bug
in
importlib
has
been
fixed
that
caused
import_module
...
...
Modules/_io/fileio.c
View file @
ab0e9f70
...
...
@@ -530,6 +530,7 @@ fileio_readinto(fileio *self, PyObject *args)
{
Py_buffer
pbuf
;
Py_ssize_t
n
,
len
;
int
err
;
if
(
self
->
fd
<
0
)
return
err_closed
();
...
...
@@ -553,10 +554,12 @@ fileio_readinto(fileio *self, PyObject *args)
Py_END_ALLOW_THREADS
}
else
n
=
-
1
;
err
=
errno
;
PyBuffer_Release
(
&
pbuf
);
if
(
n
<
0
)
{
if
(
err
no
==
EAGAIN
)
if
(
err
==
EAGAIN
)
Py_RETURN_NONE
;
errno
=
err
;
PyErr_SetFromErrno
(
PyExc_IOError
);
return
NULL
;
}
...
...
@@ -726,9 +729,11 @@ fileio_read(fileio *self, PyObject *args)
n
=
-
1
;
if
(
n
<
0
)
{
int
err
=
errno
;
Py_DECREF
(
bytes
);
if
(
err
no
==
EAGAIN
)
if
(
err
==
EAGAIN
)
Py_RETURN_NONE
;
errno
=
err
;
PyErr_SetFromErrno
(
PyExc_IOError
);
return
NULL
;
}
...
...
@@ -748,6 +753,7 @@ fileio_write(fileio *self, PyObject *args)
{
Py_buffer
pbuf
;
Py_ssize_t
n
,
len
;
int
err
;
if
(
self
->
fd
<
0
)
return
err_closed
();
...
...
@@ -778,12 +784,14 @@ fileio_write(fileio *self, PyObject *args)
Py_END_ALLOW_THREADS
}
else
n
=
-
1
;
err
=
errno
;
PyBuffer_Release
(
&
pbuf
);
if
(
n
<
0
)
{
if
(
err
no
==
EAGAIN
)
if
(
err
==
EAGAIN
)
Py_RETURN_NONE
;
errno
=
err
;
PyErr_SetFromErrno
(
PyExc_IOError
);
return
NULL
;
}
...
...
Modules/_multiprocessing/semaphore.c
View file @
ab0e9f70
...
...
@@ -255,7 +255,7 @@ sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save)
static
PyObject
*
semlock_acquire
(
SemLockObject
*
self
,
PyObject
*
args
,
PyObject
*
kwds
)
{
int
blocking
=
1
,
res
;
int
blocking
=
1
,
res
,
err
=
0
;
double
timeout
;
PyObject
*
timeout_obj
=
Py_None
;
struct
timespec
deadline
=
{
0
};
...
...
@@ -301,11 +301,13 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds)
else
res
=
sem_timedwait
(
self
->
handle
,
&
deadline
);
Py_END_ALLOW_THREADS
err
=
errno
;
if
(
res
==
MP_EXCEPTION_HAS_BEEN_SET
)
break
;
}
while
(
res
<
0
&&
errno
==
EINTR
&&
!
PyErr_CheckSignals
());
if
(
res
<
0
)
{
errno
=
err
;
if
(
errno
==
EAGAIN
||
errno
==
ETIMEDOUT
)
Py_RETURN_FALSE
;
else
if
(
errno
==
EINTR
)
...
...
Modules/main.c
View file @
ab0e9f70
...
...
@@ -655,13 +655,14 @@ Py_Main(int argc, wchar_t **argv)
if
(
fp
==
NULL
)
{
char
*
cfilename_buffer
;
const
char
*
cfilename
;
int
err
=
errno
;
cfilename_buffer
=
_Py_wchar2char
(
filename
,
NULL
);
if
(
cfilename_buffer
!=
NULL
)
cfilename
=
cfilename_buffer
;
else
cfilename
=
"<unprintable file name>"
;
fprintf
(
stderr
,
"%ls: can't open file '%s': [Errno %d] %s
\n
"
,
argv
[
0
],
cfilename
,
err
no
,
strerror
(
errno
));
argv
[
0
],
cfilename
,
err
,
strerror
(
err
));
if
(
cfilename_buffer
)
PyMem_Free
(
cfilename_buffer
);
return
2
;
...
...
Modules/readline.c
View file @
ab0e9f70
...
...
@@ -154,6 +154,7 @@ write_history_file(PyObject *self, PyObject *args)
{
PyObject
*
filename_obj
=
Py_None
,
*
filename_bytes
;
char
*
filename
;
int
err
;
if
(
!
PyArg_ParseTuple
(
args
,
"|O:write_history_file"
,
&
filename_obj
))
return
NULL
;
if
(
filename_obj
!=
Py_None
)
{
...
...
@@ -164,10 +165,11 @@ write_history_file(PyObject *self, PyObject *args)
filename_bytes
=
NULL
;
filename
=
NULL
;
}
errno
=
write_history
(
filename
);
if
(
!
err
no
&&
_history_length
>=
0
)
errno
=
err
=
write_history
(
filename
);
if
(
!
err
&&
_history_length
>=
0
)
history_truncate_file
(
filename
,
_history_length
);
Py_XDECREF
(
filename_bytes
);
errno
=
err
;
if
(
errno
)
return
PyErr_SetFromErrno
(
PyExc_IOError
);
Py_RETURN_NONE
;
...
...
@@ -969,7 +971,7 @@ readline_until_enter_or_signal(char *prompt, int *signal)
completed_input_string
=
not_done_reading
;
while
(
completed_input_string
==
not_done_reading
)
{
int
has_input
=
0
;
int
has_input
=
0
,
err
=
0
;
while
(
!
has_input
)
{
struct
timeval
timeout
=
{
0
,
100000
};
/* 0.1 seconds */
...
...
@@ -983,13 +985,14 @@ readline_until_enter_or_signal(char *prompt, int *signal)
/* select resets selectset if no input was available */
has_input
=
select
(
fileno
(
rl_instream
)
+
1
,
&
selectset
,
NULL
,
NULL
,
timeoutp
);
err
=
errno
;
if
(
PyOS_InputHook
)
PyOS_InputHook
();
}
if
(
has_input
>
0
)
{
if
(
has_input
>
0
)
{
rl_callback_read_char
();
}
else
if
(
err
no
==
EINTR
)
{
else
if
(
err
==
EINTR
)
{
int
s
;
#ifdef WITH_THREAD
PyEval_RestoreThread
(
_PyOS_ReadlineTState
);
...
...
Modules/timemodule.c
View file @
ab0e9f70
...
...
@@ -515,12 +515,14 @@ time_strftime(PyObject *self, PyObject *args)
* will be ahead of time...
*/
for
(
i
=
1024
;
;
i
+=
i
)
{
int
err
;
outbuf
=
(
time_char
*
)
PyMem_Malloc
(
i
*
sizeof
(
time_char
));
if
(
outbuf
==
NULL
)
{
PyErr_NoMemory
();
break
;
}
buflen
=
format_time
(
outbuf
,
i
,
fmt
,
&
buf
);
err
=
errno
;
if
(
buflen
>
0
||
i
>=
256
*
fmtlen
)
{
/* If the buffer is 256 times as long as the format,
it's probably not failing for lack of room!
...
...
@@ -538,7 +540,7 @@ time_strftime(PyObject *self, PyObject *args)
PyMem_Free
(
outbuf
);
#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
/* VisualStudio .NET 2005 does this properly */
if
(
buflen
==
0
&&
err
no
==
EINVAL
)
{
if
(
buflen
==
0
&&
err
==
EINVAL
)
{
PyErr_SetString
(
PyExc_ValueError
,
"Invalid format string"
);
break
;
}
...
...
Parser/myreadline.c
View file @
ab0e9f70
...
...
@@ -36,6 +36,7 @@ static int
my_fgets
(
char
*
buf
,
int
len
,
FILE
*
fp
)
{
char
*
p
;
int
err
;
while
(
1
)
{
if
(
PyOS_InputHook
!=
NULL
)
(
void
)(
PyOS_InputHook
)();
...
...
@@ -44,6 +45,7 @@ my_fgets(char *buf, int len, FILE *fp)
p
=
fgets
(
buf
,
len
,
fp
);
if
(
p
!=
NULL
)
return
0
;
/* No error */
err
=
errno
;
#ifdef MS_WINDOWS
/* In the case of a Ctrl+C or some other external event
interrupting the operation:
...
...
@@ -78,7 +80,7 @@ my_fgets(char *buf, int len, FILE *fp)
return
-
1
;
/* EOF */
}
#ifdef EINTR
if
(
err
no
==
EINTR
)
{
if
(
err
==
EINTR
)
{
int
s
;
#ifdef WITH_THREAD
PyEval_RestoreThread
(
_PyOS_ReadlineTState
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment