[Pkg-gnupg-commit] [libgpg-error] 13/29: w32: Do not use the syscall clamps in pollable mode.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Sun Mar 5 00:41:34 UTC 2017
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch master
in repository libgpg-error.
commit 915e1bf2ad1b23239b17843755376344e59a3110
Author: Werner Koch <wk at gnupg.org>
Date: Fri Feb 24 12:17:15 2017 +0100
w32: Do not use the syscall clamps in pollable mode.
* src/estream.c (estream_cookie_w32): Add flag no_syscall_clamp.
(func_w32_create): Add arg no_syscall_clamp.
(func_w32_read): Do not call pre/post_syscall_clamp when flag is set.
(func_w32_write): Ditto.
(func_w32_seek): Ditto.
(do_w32open): Set NO_SYSCALL_CLAMP in pollable mode.
(es_create) [W32]: Make sure that pollable-mode is unly used with the
W32 backend.
Signed-off-by: Werner Koch <wk at gnupg.org>
---
src/estream.c | 46 ++++++++++++++++++++++++++++++++++++----------
1 file changed, 36 insertions(+), 10 deletions(-)
diff --git a/src/estream.c b/src/estream.c
index 045182b..db9de01 100644
--- a/src/estream.c
+++ b/src/estream.c
@@ -1127,6 +1127,7 @@ typedef struct estream_cookie_w32
{
HANDLE hd; /* The handle we are using for actual output. */
int no_close; /* If set we won't close the handle. */
+ int no_syscall_clamp; /* Do not use the syscall clamp. */
} *estream_cookie_w32_t;
@@ -1135,7 +1136,7 @@ typedef struct estream_cookie_w32
*/
static int
func_w32_create (void **cookie, HANDLE hd,
- unsigned int modeflags, int no_close)
+ unsigned int modeflags, int no_close, int no_syscall_clamp)
{
estream_cookie_w32_t w32_cookie;
int err;
@@ -1152,6 +1153,7 @@ func_w32_create (void **cookie, HANDLE hd,
w32_cookie->hd = hd;
w32_cookie->no_close = no_close;
+ w32_cookie->no_syscall_clamp = no_syscall_clamp;
*cookie = w32_cookie;
err = 0;
}
@@ -1161,6 +1163,9 @@ func_w32_create (void **cookie, HANDLE hd,
/*
* Read function for W32 handle objects.
+ *
+ * Note that this function may also be used by the reader thread of
+ * w32-stream. In that case the NO_SYSCALL_CLAMP is set.
*/
static gpgrt_ssize_t
func_w32_read (void *cookie, void *buffer, size_t size)
@@ -1177,7 +1182,7 @@ func_w32_read (void *cookie, void *buffer, size_t size)
}
else
{
- if (pre_syscall_func)
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
pre_syscall_func ();
do
{
@@ -1198,7 +1203,7 @@ func_w32_read (void *cookie, void *buffer, size_t size)
bytes_read = (int)nread;
}
while (bytes_read == -1 && errno == EINTR);
- if (post_syscall_func)
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
post_syscall_func ();
}
@@ -1208,6 +1213,9 @@ func_w32_read (void *cookie, void *buffer, size_t size)
/*
* Write function for W32 handle objects.
+ *
+ * Note that this function may also be used by the writer thread of
+ * w32-stream. In that case the NO_SYSCALL_CLAMP is set.
*/
static gpgrt_ssize_t
func_w32_write (void *cookie, const void *buffer, size_t size)
@@ -1222,7 +1230,7 @@ func_w32_write (void *cookie, const void *buffer, size_t size)
}
else if (buffer)
{
- if (pre_syscall_func)
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
pre_syscall_func ();
do
{
@@ -1237,7 +1245,7 @@ func_w32_write (void *cookie, const void *buffer, size_t size)
bytes_written = (int)nwritten;
}
while (bytes_written == -1 && errno == EINTR);
- if (post_syscall_func)
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
post_syscall_func ();
}
else
@@ -1286,7 +1294,7 @@ func_w32_seek (void *cookie, gpgrt_off_t *offset, int whence)
#ifdef HAVE_W32CE_SYSTEM
# warning need to use SetFilePointer
#else
- if (pre_syscall_func)
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
pre_syscall_func ();
if (!SetFilePointerEx (w32_cookie->hd, distance, &newoff, method))
{
@@ -1295,7 +1303,7 @@ func_w32_seek (void *cookie, gpgrt_off_t *offset, int whence)
post_syscall_func ();
return -1;
}
- if (post_syscall_func)
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
post_syscall_func ();
#endif
/* Note that gpgrt_off_t is always 64 bit. */
@@ -1661,6 +1669,7 @@ func_file_create (void **cookie, int *filedes,
* The object is opened in sysmode. On POSIX this is a NOP but
* under Windows the direct W32 API functions (HANDLE) are used
* instead of their libc counterparts (fd).
+ * FIXME: The functionality is not yet implemented.
*
* pollable
*
@@ -2067,6 +2076,19 @@ es_create (estream_t *stream, void *cookie, es_syshd_t *syshd,
stream_new = NULL;
stream_internal_new = NULL;
+#if HAVE_W32_SYSTEM
+ if ((xmode & X_POLLABLE) && kind != BACKEND_W32)
+ {
+ /* We require the W32 backend, because only that allows us to
+ * write directly using the native W32 API and to disable the
+ * system clamp. Note that func_w32_create has already been
+ * called with the flag to disable the system call clamp. */
+ _set_errno (EINVAL);
+ err = -1;
+ goto out;
+ }
+#endif /*HAVE_W32_SYSTEM*/
+
stream_new = mem_alloc (sizeof (*stream_new));
if (! stream_new)
{
@@ -2087,7 +2109,7 @@ es_create (estream_t *stream, void *cookie, es_syshd_t *syshd,
stream_new->unread_buffer_size = sizeof (stream_internal_new->unread_buffer);
stream_new->intern = stream_internal_new;
-#if _WIN32
+#if HAVE_W32_SYSTEM
if ((xmode & X_POLLABLE))
{
void *new_cookie;
@@ -2102,7 +2124,7 @@ es_create (estream_t *stream, void *cookie, es_syshd_t *syshd,
kind = BACKEND_W32_POLLABLE;
functions = _gpgrt_functions_w32_pollable;
}
-#endif
+#endif /*HAVE_W32_SYSTEM*/
init_stream_obj (stream_new, cookie, syshd, kind, functions, modeflags,
xmode);
@@ -3379,7 +3401,11 @@ do_w32open (HANDLE hd, const char *mode,
if (err)
goto leave;
- err = func_w32_create (&cookie, hd, modeflags, no_close);
+ /* If we are pollable we create the function cookie with syscall
+ * clamp disabled. This is because functions are called from
+ * separatre reader and writer threads in w32-stream. */
+ err = func_w32_create (&cookie, hd, modeflags,
+ no_close, !!(xmode & X_POLLABLE));
if (err)
goto leave;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libgpg-error.git
More information about the Pkg-gnupg-commit
mailing list