projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Rationalise null pointer checks in both decode_codepage functions, so
[u/mdw/putty]
/
x11fwd.c
diff --git
a/x11fwd.c
b/x11fwd.c
index
d674120
..
895d8a9
100644
(file)
--- a/
x11fwd.c
+++ b/
x11fwd.c
@@
-68,8
+68,7
@@
static const struct plug_function_table dummy_plug = {
dummy_plug_sent, dummy_plug_accepting
};
dummy_plug_sent, dummy_plug_accepting
};
-struct X11Display *x11_setup_display(char *display, int authtype,
- const Config *cfg)
+struct X11Display *x11_setup_display(char *display, int authtype, Conf *conf)
{
struct X11Display *disp = snew(struct X11Display);
char *localcopy;
{
struct X11Display *disp = snew(struct X11Display);
char *localcopy;
@@
-166,12
+165,13
@@
struct X11Display *x11_setup_display(char *display, int authtype,
disp->port = 6000 + disp->displaynum;
disp->addr = name_lookup(disp->hostname, disp->port,
disp->port = 6000 + disp->displaynum;
disp->addr = name_lookup(disp->hostname, disp->port,
- &disp->realhost, c
fg
, ADDRTYPE_UNSPEC);
+ &disp->realhost, c
onf
, ADDRTYPE_UNSPEC);
if ((err = sk_addr_error(disp->addr)) != NULL) {
sk_addr_free(disp->addr);
sfree(disp->hostname);
sfree(disp->unixsocketpath);
if ((err = sk_addr_error(disp->addr)) != NULL) {
sk_addr_free(disp->addr);
sfree(disp->hostname);
sfree(disp->unixsocketpath);
+ sfree(disp);
return NULL; /* FIXME: report an error */
}
}
return NULL; /* FIXME: report an error */
}
}
@@
-249,7
+249,7
@@
struct X11Display *x11_setup_display(char *display, int authtype,
disp->localauthproto = X11_NO_AUTH;
disp->localauthdata = NULL;
disp->localauthdatalen = 0;
disp->localauthproto = X11_NO_AUTH;
disp->localauthdata = NULL;
disp->localauthdatalen = 0;
- platform_get_x11_auth(disp, c
fg
);
+ platform_get_x11_auth(disp, c
onf
);
return disp;
}
return disp;
}
@@
-265,10
+265,10
@@
void x11_free_display(struct X11Display *disp)
sfree(disp->hostname);
sfree(disp->unixsocketpath);
if (disp->localauthdata)
sfree(disp->hostname);
sfree(disp->unixsocketpath);
if (disp->localauthdata)
-
memset(disp->localauthdata, 0
, disp->localauthdatalen);
+
smemclr(disp->localauthdata
, disp->localauthdatalen);
sfree(disp->localauthdata);
if (disp->remoteauthdata)
sfree(disp->localauthdata);
if (disp->remoteauthdata)
-
memset(disp->remoteauthdata, 0
, disp->remoteauthdatalen);
+
smemclr(disp->remoteauthdata
, disp->remoteauthdatalen);
sfree(disp->remoteauthdata);
sfree(disp->remoteauthprotoname);
sfree(disp->remoteauthdatastring);
sfree(disp->remoteauthdata);
sfree(disp->remoteauthprotoname);
sfree(disp->remoteauthdatastring);
@@
-344,7
+344,7
@@
void x11_get_auth_from_authfile(struct X11Display *disp,
int len[4];
int family, protocol;
int ideal_match = FALSE;
int len[4];
int family, protocol;
int ideal_match = FALSE;
- char *ourhostname
= get_hostname()
;
+ char *ourhostname;
/*
* Normally we should look for precisely the details specified in
/*
* Normally we should look for precisely the details specified in
@@
-373,6
+373,8
@@
void x11_get_auth_from_authfile(struct X11Display *disp,
if (!authfp)
return;
if (!authfp)
return;
+ ourhostname = get_hostname();
+
/* Records in .Xauthority contain four strings of up to 64K each */
buf = snewn(65537 * 4, char);
/* Records in .Xauthority contain four strings of up to 64K each */
buf = snewn(65537 * 4, char);
@@
-488,7
+490,7
@@
void x11_get_auth_from_authfile(struct X11Display *disp,
done:
fclose(authfp);
done:
fclose(authfp);
-
memset(buf, 0
, 65537 * 4);
+
smemclr(buf
, 65537 * 4);
sfree(buf);
sfree(ourhostname);
}
sfree(buf);
sfree(ourhostname);
}
@@
-504,13
+506,20
@@
static int x11_closing(Plug plug, const char *error_msg, int error_code,
{
struct X11Private *pr = (struct X11Private *) plug;
{
struct X11Private *pr = (struct X11Private *) plug;
- /*
- * We have no way to communicate down the forwarded connection,
- * so if an error occurred on the socket, we just ignore it
- * and treat it like a proper close.
- */
- sshfwd_close(pr->c);
- x11_close(pr->s);
+ if (error_msg) {
+ /*
+ * Socket error. Slam the connection instantly shut.
+ */
+ sshfwd_unclean_close(pr->c);
+ } else {
+ /*
+ * Ordinary EOF received on socket. Send an EOF on the SSH
+ * channel.
+ */
+ if (pr->c)
+ sshfwd_write_eof(pr->c);
+ }
+
return 1;
}
return 1;
}
@@
-558,8
+567,7
@@
int x11_get_screen_number(char *display)
* also, fills the SocketsStructure
*/
extern const char *x11_init(Socket *s, struct X11Display *disp, void *c,
* also, fills the SocketsStructure
*/
extern const char *x11_init(Socket *s, struct X11Display *disp, void *c,
- const char *peeraddr, int peerport,
- const Config *cfg)
+ const char *peeraddr, int peerport, Conf *conf)
{
static const struct plug_function_table fn_table = {
x11_log,
{
static const struct plug_function_table fn_table = {
x11_log,
@@
-586,7
+594,7
@@
extern const char *x11_init(Socket *s, struct X11Display *disp, void *c,
pr->s = *s = new_connection(sk_addr_dup(disp->addr),
disp->realhost, disp->port,
pr->s = *s = new_connection(sk_addr_dup(disp->addr),
disp->realhost, disp->port,
- 0, 1, 0, 0, (Plug) pr, c
fg
);
+ 0, 1, 0, 0, (Plug) pr, c
onf
);
if ((err = sk_socket_error(*s)) != NULL) {
sfree(pr);
return err;
if ((err = sk_socket_error(*s)) != NULL) {
sfree(pr);
return err;
@@
-723,8
+731,7
@@
int x11_send(Socket s, char *data, int len)
memset(reply + 8, 0, msgsize);
memcpy(reply + 8, message, msglen);
sshfwd_write(pr->c, (char *)reply, 8 + msgsize);
memset(reply + 8, 0, msgsize);
memcpy(reply + 8, message, msglen);
sshfwd_write(pr->c, (char *)reply, 8 + msgsize);
- sshfwd_close(pr->c);
- x11_close(s);
+ sshfwd_write_eof(pr->c);
sfree(reply);
sfree(message);
return 0;
sfree(reply);
sfree(message);
return 0;
@@
-789,3
+796,8
@@
int x11_send(Socket s, char *data, int len)
return sk_write(s, data, len);
}
return sk_write(s, data, len);
}
+
+void x11_send_eof(Socket s)
+{
+ sk_write_eof(s);
+}