Skip to content

Commit bb3c6bb

Browse files
LarsNordin-LNdatawillco007vszakats
authored
example/x11.c: free session/cleanup (libssh2#1762)
Notes: Fix memory leak of the session. --------- Author: Lars Nordin Co-authored-by: Will Cosgrove <will@panic.com> Co-authored-by: Viktor Szakats <vszakats@users.noreply.github.com>
1 parent 141b035 commit bb3c6bb

1 file changed

Lines changed: 27 additions & 36 deletions

File tree

example/x11.c

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,6 @@ static void remove_node(struct chan_X11_list *elem)
7878
}
7979
}
8080

81-
static void session_shutdown(LIBSSH2_SESSION *session)
82-
{
83-
libssh2_session_disconnect(session, "Normal Shutdown");
84-
libssh2_session_free(session);
85-
}
86-
8781
static int _raw_mode(void)
8882
{
8983
int rc;
@@ -276,7 +270,7 @@ int main(int argc, char *argv[])
276270
libssh2_socket_t sock = LIBSSH2_INVALID_SOCKET;
277271
struct sockaddr_in sin;
278272
LIBSSH2_SESSION *session = NULL;
279-
LIBSSH2_CHANNEL *channel;
273+
LIBSSH2_CHANNEL* channel = NULL;
280274
char *username = NULL;
281275
char *password = NULL;
282276
size_t bufsiz = 8193;
@@ -306,7 +300,7 @@ int main(int argc, char *argv[])
306300
else {
307301
fprintf(stderr, "Usage: %s destination username password",
308302
argv[0]);
309-
return -1;
303+
return 1;
310304
}
311305

312306
if(argc > 4) {
@@ -323,7 +317,7 @@ int main(int argc, char *argv[])
323317
sock = socket(AF_INET, SOCK_STREAM, 0);
324318
if(sock == LIBSSH2_INVALID_SOCKET) {
325319
fprintf(stderr, "failed to open socket.\n");
326-
return -1;
320+
return 1;
327321
}
328322

329323
sin.sin_family = AF_INET;
@@ -332,14 +326,14 @@ int main(int argc, char *argv[])
332326

333327
if(connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in))) {
334328
fprintf(stderr, "Failed to established connection.\n");
335-
return -1;
329+
return 1;
336330
}
337331
/* Open a session */
338332
session = libssh2_session_init();
339333
rc = libssh2_session_handshake(session, sock);
340334
if(rc) {
341335
fprintf(stderr, "Failed Start the SSH session\n");
342-
return -1;
336+
return 1;
343337
}
344338

345339
if(set_debug_on == 1)
@@ -360,59 +354,41 @@ int main(int argc, char *argv[])
360354
rc = libssh2_userauth_password(session, username, password);
361355
if(rc) {
362356
fprintf(stderr, "Failed to authenticate\n");
363-
session_shutdown(session);
364-
shutdown(sock, SHUT_RDWR);
365-
LIBSSH2_SOCKET_CLOSE(sock);
366-
return -1;
357+
goto shutdown;
367358
}
368359

369360
/* Open a channel */
370361
channel = libssh2_channel_open_session(session);
371362
if(!channel) {
372363
fprintf(stderr, "Failed to open a new channel\n");
373-
session_shutdown(session);
374-
shutdown(sock, SHUT_RDWR);
375-
LIBSSH2_SOCKET_CLOSE(sock);
376-
return -1;
364+
goto shutdown;
377365
}
378366

379367
/* Request a PTY */
380368
rc = libssh2_channel_request_pty(channel, "xterm");
381369
if(rc) {
382370
fprintf(stderr, "Failed to request a pty\n");
383-
session_shutdown(session);
384-
shutdown(sock, SHUT_RDWR);
385-
LIBSSH2_SOCKET_CLOSE(sock);
386-
return -1;
371+
goto shutdown;
387372
}
388373

389374
/* Request X11 */
390375
rc = libssh2_channel_x11_req(channel, 0);
391376
if(rc) {
392377
fprintf(stderr, "Failed to request X11 forwarding\n");
393-
session_shutdown(session);
394-
shutdown(sock, SHUT_RDWR);
395-
LIBSSH2_SOCKET_CLOSE(sock);
396-
return -1;
378+
goto shutdown;
397379
}
398380

399381
/* Request a shell */
400382
rc = libssh2_channel_shell(channel);
401383
if(rc) {
402384
fprintf(stderr, "Failed to open a shell\n");
403-
session_shutdown(session);
404-
shutdown(sock, SHUT_RDWR);
405-
LIBSSH2_SOCKET_CLOSE(sock);
406-
return -1;
385+
goto shutdown;
407386
}
408387

409388
rc = _raw_mode();
410389
if(rc) {
411390
fprintf(stderr, "Failed to entered in raw mode\n");
412-
session_shutdown(session);
413-
shutdown(sock, SHUT_RDWR);
414-
LIBSSH2_SOCKET_CLOSE(sock);
415-
return -1;
391+
goto shutdown;
416392
}
417393

418394
memset(&w_size, 0, sizeof(struct winsize));
@@ -501,15 +477,30 @@ int main(int argc, char *argv[])
501477
}
502478
}
503479

480+
shutdown:
481+
504482
if(channel) {
505483
libssh2_channel_free(channel);
506484
channel = NULL;
507485
}
486+
487+
if(session) {
488+
libssh2_session_disconnect(session, "Normal Shutdown");
489+
libssh2_session_free(session);
490+
}
491+
492+
if(sock != LIBSSH2_INVALID_SOCKET) {
493+
shutdown(sock, 2);
494+
LIBSSH2_SOCKET_CLOSE(sock);
495+
}
496+
497+
fprintf(stderr, "all done\n");
498+
508499
_normal_mode();
509500

510501
libssh2_exit();
511502

512-
return 0;
503+
return rc ? 1 : 0;
513504
}
514505

515506
#else

0 commit comments

Comments
 (0)