imap.c: Fixed bad state error when logging in with invalid credentials

Fixed a problem with the state machine when attempting to log in with
invalid credentials. The server would report login failure but libcurl
would not read the response due to inappropriate IMAP_STOP states being
set after the login was sent.
This commit is contained in:
Steve Holme 2012-12-29 19:23:10 +00:00
Родитель 27f90c0962
Коммит 488245f99c
1 изменённых файлов: 5 добавлений и 7 удалений

Просмотреть файл

@ -462,7 +462,7 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
else { else {
if(data->state.used_interface == Curl_if_multi) { if(data->state.used_interface == Curl_if_multi) {
state(conn, IMAP_UPGRADETLS); state(conn, IMAP_UPGRADETLS);
return imap_state_upgrade_tls(conn); result = imap_state_upgrade_tls(conn);
} }
else { else {
result = Curl_ssl_connect(conn, FIRSTSOCKET); result = Curl_ssl_connect(conn, FIRSTSOCKET);
@ -473,8 +473,6 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
} }
} }
state(conn, IMAP_STOP);
return result; return result;
} }
@ -488,7 +486,6 @@ static CURLcode imap_state_upgrade_tls(struct connectdata *conn)
if(imapc->ssldone) { if(imapc->ssldone) {
imap_to_imaps(conn); imap_to_imaps(conn);
result = imap_state_login(conn); result = imap_state_login(conn);
state(conn, IMAP_STOP);
} }
return result; return result;
@ -508,9 +505,9 @@ static CURLcode imap_state_login_resp(struct connectdata *conn,
failf(data, "Access denied. %c", imapcode); failf(data, "Access denied. %c", imapcode);
result = CURLE_LOGIN_DENIED; result = CURLE_LOGIN_DENIED;
} }
else
/* End of connect phase */ /* End of connect phase */
state(conn, IMAP_STOP); state(conn, IMAP_STOP);
return result; return result;
} }
@ -655,6 +652,7 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn,
/* We don't know how to parse this line */ /* We don't know how to parse this line */
result = CURLE_FTP_WEIRD_SERVER_REPLY; /* TODO: fix this code */ result = CURLE_FTP_WEIRD_SERVER_REPLY; /* TODO: fix this code */
/* End of do phase */
state(conn, IMAP_STOP); state(conn, IMAP_STOP);
return result; return result;