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
c345ce1a
Commit
c345ce1a
authored
Dec 16, 2011
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #10350: Read and save errno before calling a function which might overwrite it.
Original patch by Hallvard B Furuseth.
parent
87448819
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 @
c345ce1a
...
...
@@ -97,6 +97,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 #13591: A bug in importlib has been fixed that caused import_module
to load a module twice.
...
...
Modules/_io/fileio.c
View file @
c345ce1a
...
...
@@ -506,6 +506,7 @@ fileio_readinto(fileio *self, PyObject *args)
{
Py_buffer
pbuf
;
Py_ssize_t
n
,
len
;
int
err
;
if
(
self
->
fd
<
0
)
return
err_closed
();
...
...
@@ -529,10 +530,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
;
}
...
...
@@ -675,9 +678,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
;
}
...
...
@@ -697,6 +702,7 @@ fileio_write(fileio *self, PyObject *args)
{
Py_buffer
pbuf
;
Py_ssize_t
n
,
len
;
int
err
;
if
(
self
->
fd
<
0
)
return
err_closed
();
...
...
@@ -727,12 +733,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 @
c345ce1a
...
...
@@ -267,7 +267,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
};
...
...
@@ -313,11 +313,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 @
c345ce1a
...
...
@@ -654,13 +654,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 @
c345ce1a
...
...
@@ -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
;
...
...
@@ -970,7 +972,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 */
...
...
@@ -984,13 +986,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 @
c345ce1a
...
...
@@ -527,12 +527,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!
...
...
@@ -550,7 +552,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 @
c345ce1a
...
...
@@ -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