[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ssh_set_callbacks bug ?
[Thread Prev] | [Thread Next]
- Subject: Re: ssh_set_callbacks bug ?
- From: Yanis Kurganov <yanis.kurganov@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 16 Feb 2016 11:23:53 +0300
- To: libssh@xxxxxxxxxx
Yes, It's a bug.
I reported this in 2014 (search my message with subject "[PATCH] crash with
callbacks").
Migrate to new libssh log API or use my patch (attached).
2016-02-14 13:21 GMT+03:00 Giovanni Panozzo <giovanni@xxxxxxxxxx>:
>
> Hi to all. I just subscribed to the list... but I think I have been
> subscribed in the past :)
>
> While developing with libssh I have found the following problem:
>
> The lines at the end of ssh_set_callbacks() are:
>
> /* LEGACY */
> if (ssh_get_log_callback() == NULL && cb->log_function) {
> ssh_set_log_callback(ssh_legacy_log_callback);
> ssh_set_log_userdata(session);
> }
>
> the last line store "session" (a short life variable) in a global variable.
> That pointer to "sesson" may become later no longer available during a
> program run. For example when you close/destroy your first session and then
> reopen a second and enable logging callback.
> You can try to setup again callbacks to the second session, but
> if (ssh_get_log_callback() == NULL
> will prevent the call to ssh_set_log_userdata().
>
> Crashing example here:
>
> --------------
>
> #include <stdio.h>
> #include <malloc.h>
> #include <libssh/libssh.h>
> #include <libssh/callbacks.h>
> #include <stdlib.h>
>
> void mylogfunc(ssh_session session, int priority, const char *message,
> void *userdata)
> {
> printf("LOG MESSAGE: userdata=%p message=%s\n", userdata,message);
> }
>
> void onerun()
> {
>
> ssh_session sshs;
> struct ssh_callbacks_struct *cb;
> int rc;
> int verbosity = SSH_LOG_PROTOCOL;
>
> sshs = ssh_new();
> if (sshs == NULL) {
> printf("ssh_new() failed\n");
> return;
> }
>
> ssh_options_set(sshs, SSH_OPTIONS_HOST, "localhost");
> ssh_options_set(sshs, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
>
> cb = malloc(sizeof(struct ssh_callbacks_struct));
> memset(cb, 0, sizeof(struct ssh_callbacks_struct));
> ssh_callbacks_init(cb);
> cb->log_function = mylogfunc;
> cb->userdata = NULL;
> ssh_set_callbacks(sshs, cb);
>
> rc = ssh_connect(sshs);
> if (rc != SSH_OK) {
> printf("Unable to connect to server\n");
> }
> ssh_disconnect(sshs);
>
> ssh_free(sshs);
> free(cb);
>
> }
>
> int main()
> {
> onerun();
> // Allocate a new block of memory so ssh_new() will not reuse the
> old memory,
> // making the pointer saved in ssh_set_callbacks() with
> ssh_set_log_userdata()
> // erroneously available again
> malloc(2000);
> onerun();
> }
>
>
> -----
> As a workaround in user code, ssh_set_log_userdata(sshs) can be called
> just after a successful call to ssh_new.
>
> --------------
>
> Is this a bug or I'm doing something wrong ?
>
>
> Thank you
>
> Giovanni
>
>
>
Attachment:
0001-fix-crash-with-callbacks.patch
Description: Binary data
| ssh_set_callbacks bug ? | Giovanni Panozzo <giovanni@xxxxxxxxxx> |