Am Dienstag, den 18.10.2005, 09:57 +0200 schrieb Alexander Larsson: > On Mon, 2005-10-17 at 20:45 +0200, Christian Neumair wrote: > > Am Montag, den 17.10.2005, 13:09 +0200 schrieb Alexander Larsson: > > > static gboolean > > > -prompt_authentication (SmbAuthContext *actx) > > > +prompt_authentication (SmbAuthContext *actx, > > > + gboolean *cancelled) > > > > > > This isn't fixing all uses of the old non-pointer cancelled variable. > > > (In particular, it breaks the return value at the end.) > > > > Eeek, I sent an old revision. I´ve actually changed the latter in a > > later revision. > > > > This one additionally initializes cancelled to FALSE in > > prompt_authentication (gcc 4 complains, gcc 3 not), and improves the > > previously bogus DEBUG_SMB macro invocations in perform_authentication. > > It still looks the same. prompt_authentication() uses the the cancelled > pointer without dereferencing it Dunno why this isn't in the patch. It was in my local tree. > and doesn't initialize it. Well, it is IMHO only meant to be valid if invoked is TRUE. However, I've changed it to match the semantics of the other modules. -- Christian Neumair <chris gnome-de org>
? modules/attachment.cgi?id=23538&action=view Index: modules/ftp-method.c =================================================================== RCS file: /cvs/gnome/gnome-vfs/modules/ftp-method.c,v retrieving revision 1.117 diff -u -p -r1.117 ftp-method.c --- modules/ftp-method.c 2 Jun 2005 14:10:56 -0000 1.117 +++ modules/ftp-method.c 18 Oct 2005 15:16:25 -0000 @@ -809,7 +809,8 @@ save_authn_info (GnomeVFSURI *uri, static gboolean query_user_for_authn_info (GnomeVFSURI *uri, - char **user, char **pass, char **keyring, gboolean *save, + char **user, char **pass, char **keyring, + gboolean *save, gboolean *aborted, gboolean no_username) { GnomeVFSModuleCallbackFullAuthenticationIn in_args; @@ -850,10 +851,10 @@ query_user_for_authn_info (GnomeVFSURI * *pass = g_strdup ("nobody gnome org"); goto error; } - - ret = !out_args.abort_auth; - - if (!ret) { + + *aborted = out_args.abort_auth; + + if (out_args.abort_auth) { goto error; } @@ -882,8 +883,8 @@ query_user_for_authn_info (GnomeVFSURI * g_free (out_args.domain); g_free (out_args.password); g_free (out_args.keyring); - - return ret; + + return ret && !out_args.abort_auth; } static gboolean @@ -1249,6 +1250,7 @@ ftp_connection_create (FtpConnectionPool gboolean got_connection; gboolean ret; gboolean connection_failed; + gboolean aborted; cancellation = get_cancellation (context); @@ -1320,7 +1322,7 @@ ftp_connection_create (FtpConnectionPool pool->num_connections++; G_UNLOCK (connection_pools); ret = query_user_for_authn_info (uri, &user, &pass, &keyring, &save_authn, - !uri_has_username); + &aborted, !uri_has_username); G_LOCK (connection_pools); pool->num_connections--; if (!ret) { @@ -1330,7 +1332,12 @@ ftp_connection_create (FtpConnectionPool g_free (user); g_free (pass); g_free (keyring); - return GNOME_VFS_ERROR_LOGIN_FAILED; + + if (aborted) { + return GNOME_VFS_ERROR_CANCELLED; + } else { + return GNOME_VFS_ERROR_LOGIN_FAILED; + } } g_string_free (conn->response_buffer, TRUE); conn->response_buffer = g_string_new (""); Index: modules/sftp-method.c =================================================================== RCS file: /cvs/gnome/gnome-vfs/modules/sftp-method.c,v retrieving revision 1.35 diff -u -p -r1.35 sftp-method.c --- modules/sftp-method.c 18 Jul 2005 08:19:28 -0000 1.35 +++ modules/sftp-method.c 18 Oct 2005 15:16:25 -0000 @@ -927,7 +927,8 @@ invoke_full_auth (const GnomeVFSURI *uri char **user_out, char **object_out, char **authtype_out, - gboolean *save_password_out) + gboolean *save_password_out, + gboolean *abort_auth_out) { GnomeVFSModuleCallbackFullAuthenticationIn in_args; GnomeVFSModuleCallbackFullAuthenticationOut out_args; @@ -970,6 +971,8 @@ invoke_full_auth (const GnomeVFSURI *uri *password_out = NULL; } + *abort_auth_out = out_args.abort_auth; + g_free (in_args.uri); g_free (in_args.username); g_free (in_args.object); @@ -1208,6 +1211,7 @@ sftp_connect (SftpConnection **connectio char *endpos; char *hostname = NULL; char *fingerprint = NULL; + gboolean aborted; if (client_vendor == SFTP_VENDOR_SSH) { prompt_fd = err_fd; @@ -1255,11 +1259,14 @@ sftp_connect (SftpConnection **connectio g_io_channel_write_chars (tty_channel, "\n", 1, &len, NULL); g_io_channel_flush (tty_channel, NULL); } else if (invoke_full_auth (uri, done_auth, buffer, &password, &keyring, - &user, &object, &authtype, &save_password) && password != NULL) { + &user, &object, &authtype, &save_password, &aborted) && password != NULL) { full_auth = TRUE; g_io_channel_write_chars (tty_channel, password, -1, &len, NULL); g_io_channel_write_chars (tty_channel, "\n", 1, &len, NULL); g_io_channel_flush (tty_channel, NULL); + } else if (aborted) { + res = GNOME_VFS_ERROR_CANCELLED; + goto bail; } else { res = GNOME_VFS_ERROR_ACCESS_DENIED; goto bail; Index: modules/smb-method.c =================================================================== RCS file: /cvs/gnome/gnome-vfs/modules/smb-method.c,v retrieving revision 1.34 diff -u -p -r1.34 smb-method.c --- modules/smb-method.c 5 Oct 2005 08:49:29 -0000 1.34 +++ modules/smb-method.c 18 Oct 2005 15:16:26 -0000 @@ -922,13 +922,14 @@ prefill_authentication (SmbAuthContext * } static gboolean -prompt_authentication (SmbAuthContext *actx) +prompt_authentication (SmbAuthContext *actx, + gboolean *cancelled) { /* IMPORTANT: We are NOT in the lock at this point */ GnomeVFSModuleCallbackFullAuthenticationIn in_args; GnomeVFSModuleCallbackFullAuthenticationOut out_args; - gboolean invoked, cancelled = FALSE; + gboolean invoked; g_return_val_if_fail (actx != NULL, FALSE); g_return_val_if_fail (actx->for_server != NULL, FALSE); @@ -961,7 +962,6 @@ prompt_authentication (SmbAuthContext *a &out_args, sizeof (out_args)); if (invoked) { - cancelled = out_args.abort_auth; if (in_args.flags & GNOME_VFS_MODULE_CALLBACK_FULL_AUTHENTICATION_NEED_USERNAME) { g_free (actx->use_user); actx->use_user = string_dup_nzero (out_args.username); @@ -977,7 +977,9 @@ prompt_authentication (SmbAuthContext *a actx->keyring = actx->save_auth && out_args.keyring ? g_strdup (out_args.keyring) : NULL; DEBUG_SMB(("[auth] Prompted credentials: %s %s:%s\n", actx->use_user, actx->use_domain, actx->use_password)); } - + + *cancelled = out_args.abort_auth; + actx->state |= SMB_AUTH_STATE_PROMPTED; g_free (out_args.username); @@ -987,7 +989,7 @@ prompt_authentication (SmbAuthContext *a g_free (in_args.uri); - return invoked && !cancelled; + return invoked && !*cancelled; } static void @@ -1125,7 +1127,7 @@ init_authentication (SmbAuthContext *act static int perform_authentication (SmbAuthContext *actx) { - gboolean cont, auth_failed = FALSE; + gboolean cont, auth_failed = FALSE, auth_cancelled = FALSE; int ret = -1; /* IMPORTANT: We are IN the lock at this point */ @@ -1203,7 +1205,7 @@ perform_authentication (SmbAuthContext * } if (!cont) - cont = prompt_authentication (actx); + cont = prompt_authentication (actx, &auth_cancelled); LOCK_SMB(); @@ -1214,9 +1216,16 @@ perform_authentication (SmbAuthContext * if (cont) ret = 1; else { - /* Note that we leave actx->res set to whatever it was set to */ - DEBUG_SMB(("[auth] Authentication cancelled by user.\n")); ret = -1; + + if (auth_cancelled) { + DEBUG_SMB(("[auth] Authentication cancelled by user.\n")); + actx->res = GNOME_VFS_ERROR_CANCELLED; + } else { + DEBUG_SMB(("[auth] Authentication failed with result %s.\n", + gnome_vfs_result_to_string (actx->res))); + /* Note that we leave actx->res set to whatever it was set to */ + } } /* Weird, don't want authentication, but failed */
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil