aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2022-07-27 09:56:17 +0000
committerNIIBE Yutaka <[email protected]>2022-07-27 09:56:17 +0000
commit6f9bb301b720f6f791414b89391fbba7ef86e3da (patch)
treedb8a5ba9aee60c52e14fc2f6a5c0525aa5ebd2e6
parentInitial experiment for NamedPipe on Windows. (diff)
downloadgnupg-6f9bb301b720f6f791414b89391fbba7ef86e3da.tar.gz
gnupg-6f9bb301b720f6f791414b89391fbba7ef86e3da.zip
Implement the procedure to handle requests from client.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--agent/agent.h1
-rw-r--r--agent/command-ssh.c68
-rw-r--r--agent/gpg-agent.c65
3 files changed, 87 insertions, 47 deletions
diff --git a/agent/agent.h b/agent/agent.h
index 30f30200d..ee5c67568 100644
--- a/agent/agent.h
+++ b/agent/agent.h
@@ -453,6 +453,7 @@ gpg_error_t ssh_search_control_file (ssh_control_file_t cf,
int *r_disabled,
int *r_ttl, int *r_confirm);
+void start_command_handler_ssh_stream (ctrl_t ctrl, estream_t stream);
void start_command_handler_ssh (ctrl_t, gnupg_fd_t);
/*-- findkey.c --*/
diff --git a/agent/command-ssh.c b/agent/command-ssh.c
index ce2b5df9d..5aa2ea8ba 100644
--- a/agent/command-ssh.c
+++ b/agent/command-ssh.c
@@ -3768,67 +3768,73 @@ get_client_info (gnupg_fd_t fd, struct peer_info_s *out)
}
-/* Start serving client on SOCK_CLIENT. */
+/* Start serving client on STREAM. */
void
-start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
+start_command_handler_ssh_stream (ctrl_t ctrl, estream_t stream)
{
- estream_t stream_sock = NULL;
gpg_error_t err;
int ret;
- struct peer_info_s peer_info;
- es_syshd_t syshd;
-
- syshd.type = ES_SYSHD_SOCK;
- syshd.u.sock = sock_client;
err = agent_copy_startup_env (ctrl);
if (err)
goto out;
- get_client_info (sock_client, &peer_info);
- ctrl->client_pid = peer_info.pid;
- ctrl->client_uid = peer_info.uid;
-
- /* Create stream from socket. */
- stream_sock = es_sysopen (&syshd, "r+");
- if (!stream_sock)
- {
- err = gpg_error_from_syserror ();
- log_error (_("failed to create stream from socket: %s\n"),
- gpg_strerror (err));
- goto out;
- }
/* We have to disable the estream buffering, because the estream
core doesn't know about secure memory. */
- ret = es_setvbuf (stream_sock, NULL, _IONBF, 0);
+ ret = es_setvbuf (stream, NULL, _IONBF, 0);
if (ret)
{
- err = gpg_error_from_syserror ();
- log_error ("failed to disable buffering "
- "on socket stream: %s\n", gpg_strerror (err));
+ log_error ("failed to disable buffering on socket stream: %s\n",
+ strerror (errno));
goto out;
}
/* Main processing loop. */
- while ( !ssh_request_process (ctrl, stream_sock) )
+ while ( !ssh_request_process (ctrl, stream) )
{
/* Check whether we have reached EOF before trying to read
another request. */
int c;
- c = es_fgetc (stream_sock);
+ c = es_fgetc (stream);
if (c == EOF)
break;
- es_ungetc (c, stream_sock);
+ es_ungetc (c, stream);
}
/* Reset the daemon in case it has been used. */
agent_reset_daemon (ctrl);
-
out:
- if (stream_sock)
- es_fclose (stream_sock);
+ es_fclose (stream);
+}
+
+
+/* Start serving client on SOCK_CLIENT. */
+void
+start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client)
+{
+ estream_t stream_sock;
+ struct peer_info_s peer_info;
+ es_syshd_t syshd;
+
+ syshd.type = ES_SYSHD_SOCK;
+ syshd.u.sock = sock_client;
+
+ get_client_info (sock_client, &peer_info);
+ ctrl->client_pid = peer_info.pid;
+ ctrl->client_uid = peer_info.uid;
+
+ /* Create stream from socket. */
+ stream_sock = es_sysopen (&syshd, "r+");
+ if (!stream_sock)
+ {
+ log_error (_("failed to create stream from socket: %s\n"),
+ strerror (errno));
+ return;
+ }
+
+ start_command_handler_ssh_stream (ctrl, stream_sock);
}
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 5f7431edd..36d919d14 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -2767,6 +2767,7 @@ putty_message_thread (void *arg)
#define AGENT_PIPE_NAME "\\\\.\\pipe\\openssh-ssh-agent"
/* FIXME: Don't know exact semantics, but copied from Win32-Openssh */
#define SDDL_STR "D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;0x12019b;;;AU)"
+#define BUFSIZE 5 * 1024
/* The thread handling Win32-OpenSSH requests through NamedPipe. */
static void *
@@ -2774,7 +2775,6 @@ win32_openssh_thread (void *arg)
{
HANDLE pipe;
SECURITY_ATTRIBUTES sa;
- const char *;
(void)arg;
@@ -2783,10 +2783,10 @@ win32_openssh_thread (void *arg)
memset(&sa, 0, sizeof (SECURITY_ATTRIBUTES));
sa.nLength = sizeof (sa);
- if (!ConvertStringSecurityDescriptorToSecurityDescriptorA (SDDL_STR, SDDL_REVISION_1,
- &sa.lpSecurityDescriptor, &sa.nLength))
+ if (!ConvertStringSecurityDescriptorToSecurityDescriptorA
+ (SDDL_STR, SDDL_REVISION_1, &sa.lpSecurityDescriptor, &sa.nLength))
{
- log_error ("cannot convert sddl: %d\n", GetLastError ());
+ log_error ("cannot convert sddl: %ld\n", GetLastError ());
return NULL;
}
@@ -2794,12 +2794,12 @@ win32_openssh_thread (void *arg)
while (1)
{
- /* The message loop runs as thread independent from our nPth system.
- This also means that we need to make sure that we switch back to
- our system before calling any no-windows function. */
- npth_unprotect ();
+ ctrl_t ctrl = NULL;
+ estream_t ssh_stream = NULL;
+ es_syshd_t syshd;
- pipe = CreateNamedPipeW (AGENT_PIPE_NAME,
+ npth_unprotect ();
+ pipe = CreateNamedPipeA (AGENT_PIPE_NAME,
PIPE_ACCESS_DUPLEX, // | FILE_FLAG_OVERLAPPED
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
@@ -2807,26 +2807,59 @@ win32_openssh_thread (void *arg)
if (pipe == INVALID_HANDLE_VALUE)
{
- log_error ("cannot create pipe: %d\n", GetLastError());
+ npth_protect ();
+ log_error ("cannot create pipe: %ld\n", GetLastError());
break;
}
if (ConnectNamedPipe (pipe, NULL) != FALSE)
{
- CloseHandle (pipe);
npth_protect ();
+ CloseHandle (pipe);
log_error ("ConnectNamedPipe returned TRUE unexpectedly\n");
- return NULL;
+ break;
}
- /* FIXME: Here, handle the requests from ssh client */
+ npth_protect ();
+ ctrl = xtrycalloc (1, sizeof *ctrl);
+ if (!ctrl)
+ {
+ CloseHandle (pipe);
+ log_error ("error allocating connection control data: %s\n",
+ strerror (errno));
+ break;
+ }
+
+ ctrl->session_env = session_env_new ();
+ if (!ctrl->session_env)
+ {
+ log_error ("error allocating session environment block: %s\n",
+ strerror (errno));
+ agent_deinit_default_ctrl (ctrl);
+ xfree (ctrl);
+ CloseHandle (pipe);
+ break;
+ }
+ agent_init_default_ctrl (ctrl);
+
+ syshd.type = ES_SYSHD_HANDLE;
+ syshd.u.handle = pipe;
+ ssh_stream = es_sysopen (&syshd, "r+");
+ if (!ssh_stream)
+ {
+ agent_deinit_default_ctrl (ctrl);
+ xfree (ctrl);
+ CloseHandle (pipe);
+ break;
+ }
+
+ start_command_handler_ssh_stream (ctrl, ssh_stream);
+ agent_deinit_default_ctrl (ctrl);
+ xfree (ctrl);
CloseHandle (pipe);
}
- /* Back to nPth. */
- npth_protect ();
-
if (opt.verbose)
log_info ("Win32-OpenSSH thread stopped\n");
return NULL;