libssh: fix "empty expression statement has no effect" warnings

... by fixing macros to do-while constructs and moving out the calls to
"break" outside of the actual macro. It also fixes the problem where the
macro was used witin a loop and the break didn't do right.

Reported-by: Emil Engler
Fixes #6847
Closes #6909
This commit is contained in:
Daniel Stenberg 2021-04-17 19:00:15 +02:00
parent d71ff2b9db
commit 2426fa49ea
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -549,49 +549,48 @@ cleanup:
return rc; return rc;
} }
#define MOVE_TO_ERROR_STATE(_r) { \ #define MOVE_TO_ERROR_STATE(_r) do { \
state(data, SSH_SESSION_DISCONNECT); \ state(data, SSH_SESSION_DISCONNECT); \
sshc->actualcode = _r; \ sshc->actualcode = _r; \
rc = SSH_ERROR; \ rc = SSH_ERROR; \
break; \ } while(0)
}
#define MOVE_TO_SFTP_CLOSE_STATE() { \ #define MOVE_TO_SFTP_CLOSE_STATE() do { \
state(data, SSH_SFTP_CLOSE); \ state(data, SSH_SFTP_CLOSE); \
sshc->actualcode = sftp_error_to_CURLE(sftp_get_error(sshc->sftp_session)); \ sshc->actualcode = \
rc = SSH_ERROR; \ sftp_error_to_CURLE(sftp_get_error(sshc->sftp_session)); \
break; \ rc = SSH_ERROR; \
} } while(0)
#define MOVE_TO_LAST_AUTH \ #define MOVE_TO_LAST_AUTH do { \
if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) { \ if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) { \
rc = SSH_OK; \ rc = SSH_OK; \
state(data, SSH_AUTH_PASS_INIT); \ state(data, SSH_AUTH_PASS_INIT); \
break; \ } \
} \ else { \
else { \ MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); \
MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); \ } \
} } while(0)
#define MOVE_TO_TERTIARY_AUTH \ #define MOVE_TO_TERTIARY_AUTH do { \
if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) { \ if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) { \
rc = SSH_OK; \ rc = SSH_OK; \
state(data, SSH_AUTH_KEY_INIT); \ state(data, SSH_AUTH_KEY_INIT); \
break; \ } \
} \ else { \
else { \ MOVE_TO_LAST_AUTH; \
MOVE_TO_LAST_AUTH; \ } \
} } while(0)
#define MOVE_TO_SECONDARY_AUTH \ #define MOVE_TO_SECONDARY_AUTH do { \
if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) { \ if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) { \
rc = SSH_OK; \ rc = SSH_OK; \
state(data, SSH_AUTH_GSSAPI); \ state(data, SSH_AUTH_GSSAPI); \
break; \ } \
} \ else { \
else { \ MOVE_TO_TERTIARY_AUTH; \
MOVE_TO_TERTIARY_AUTH; \ } \
} } while(0)
static static
int myssh_auth_interactive(struct connectdata *conn) int myssh_auth_interactive(struct connectdata *conn)
@ -704,6 +703,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
if(rc != SSH_OK) { if(rc != SSH_OK) {
failf(data, "Failure establishing ssh session"); failf(data, "Failure establishing ssh session");
MOVE_TO_ERROR_STATE(CURLE_FAILED_INIT); MOVE_TO_ERROR_STATE(CURLE_FAILED_INIT);
break;
} }
state(data, SSH_HOSTKEY); state(data, SSH_HOSTKEY);
@ -714,6 +714,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
rc = myssh_is_known(data); rc = myssh_is_known(data);
if(rc != SSH_OK) { if(rc != SSH_OK) {
MOVE_TO_ERROR_STATE(CURLE_PEER_FAILED_VERIFICATION); MOVE_TO_ERROR_STATE(CURLE_PEER_FAILED_VERIFICATION);
break;
} }
state(data, SSH_AUTHLIST); state(data, SSH_AUTHLIST);
@ -735,6 +736,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
} }
else if(rc == SSH_AUTH_ERROR) { else if(rc == SSH_AUTH_ERROR) {
MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
break;
} }
sshc->auth_methods = ssh_userauth_list(sshc->ssh_session, NULL); sshc->auth_methods = ssh_userauth_list(sshc->ssh_session, NULL);
@ -753,6 +755,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
} }
else { /* unsupported authentication method */ else { /* unsupported authentication method */
MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
break;
} }
break; break;
@ -760,6 +763,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
case SSH_AUTH_PKEY_INIT: case SSH_AUTH_PKEY_INIT:
if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY)) { if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY)) {
MOVE_TO_SECONDARY_AUTH; MOVE_TO_SECONDARY_AUTH;
break;
} }
/* Two choices, (1) private key was given on CMD, /* Two choices, (1) private key was given on CMD,
@ -775,6 +779,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
if(rc != SSH_OK) { if(rc != SSH_OK) {
MOVE_TO_SECONDARY_AUTH; MOVE_TO_SECONDARY_AUTH;
break;
} }
} }
@ -833,6 +838,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
case SSH_AUTH_GSSAPI: case SSH_AUTH_GSSAPI:
if(!(data->set.ssh_auth_types & CURLSSH_AUTH_GSSAPI)) { if(!(data->set.ssh_auth_types & CURLSSH_AUTH_GSSAPI)) {
MOVE_TO_TERTIARY_AUTH; MOVE_TO_TERTIARY_AUTH;
break;
} }
rc = ssh_userauth_gssapi(sshc->ssh_session); rc = ssh_userauth_gssapi(sshc->ssh_session);
@ -879,6 +885,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD)) { if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD)) {
/* Host key authentication is intentionally not implemented */ /* Host key authentication is intentionally not implemented */
MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
break;
} }
state(data, SSH_AUTH_PASS); state(data, SSH_AUTH_PASS);
/* FALLTHROUGH */ /* FALLTHROUGH */
@ -953,6 +960,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
sshc->homedir = sftp_canonicalize_path(sshc->sftp_session, "."); sshc->homedir = sftp_canonicalize_path(sshc->sftp_session, ".");
if(sshc->homedir == NULL) { if(sshc->homedir == NULL) {
MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT); MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
break;
} }
data->state.most_recent_ftp_entrypath = sshc->homedir; data->state.most_recent_ftp_entrypath = sshc->homedir;
@ -1213,6 +1221,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
if(size < 0) { if(size < 0) {
failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size); failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
MOVE_TO_ERROR_STATE(CURLE_BAD_DOWNLOAD_RESUME); MOVE_TO_ERROR_STATE(CURLE_BAD_DOWNLOAD_RESUME);
break;
} }
data->state.resume_from = attrs->size; data->state.resume_from = attrs->size;
@ -1254,6 +1263,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
} }
else { else {
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
} }
@ -1292,8 +1302,11 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
CURL_READFUNC_ABORT return code still aborts */ CURL_READFUNC_ABORT return code still aborts */
failf(data, "Failed to read data"); failf(data, "Failed to read data");
MOVE_TO_ERROR_STATE(CURLE_FTP_COULDNT_USE_REST); MOVE_TO_ERROR_STATE(CURLE_FTP_COULDNT_USE_REST);
break;
} }
} while(passed < data->state.resume_from); } while(passed < data->state.resume_from);
if(rc)
break;
} }
/* now, decrease the size of the read */ /* now, decrease the size of the read */
@ -1306,6 +1319,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
rc = sftp_seek64(sshc->sftp_file, data->state.resume_from); rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
if(rc != 0) { if(rc != 0) {
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
} }
if(data->state.infilesize > 0) { if(data->state.infilesize > 0) {
@ -1375,6 +1389,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
(err != SSH_FX_FAILURE) && (err != SSH_FX_FAILURE) &&
(err != SSH_FX_PERMISSION_DENIED)) { (err != SSH_FX_PERMISSION_DENIED)) {
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
rc = 0; /* clear rc and continue */ rc = 0; /* clear rc and continue */
} }
@ -1398,6 +1413,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
failf(data, "Could not open directory for reading: %s", failf(data, "Could not open directory for reading: %s",
ssh_get_error(sshc->ssh_session)); ssh_get_error(sshc->ssh_session));
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
state(data, SSH_SFTP_READDIR); state(data, SSH_SFTP_READDIR);
break; break;
@ -1491,6 +1507,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
failf(data, "Could not read symlink for reading: %s", failf(data, "Could not read symlink for reading: %s",
ssh_get_error(sshc->ssh_session)); ssh_get_error(sshc->ssh_session));
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
if(sshc->readdir_link_attrs->name == NULL) { if(sshc->readdir_link_attrs->name == NULL) {
@ -1586,6 +1603,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
ssh_get_error(sshc->ssh_session)); ssh_get_error(sshc->ssh_session));
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
state(data, SSH_SFTP_DOWNLOAD_STAT); state(data, SSH_SFTP_DOWNLOAD_STAT);
@ -1663,6 +1681,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
rc = sftp_seek64(sshc->sftp_file, from); rc = sftp_seek64(sshc->sftp_file, from);
if(rc != 0) { if(rc != 0) {
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
} }
data->req.size = size; data->req.size = size;
@ -1701,6 +1720,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
rc = sftp_seek64(sshc->sftp_file, data->state.resume_from); rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
if(rc != 0) { if(rc != 0) {
MOVE_TO_SFTP_CLOSE_STATE(); MOVE_TO_SFTP_CLOSE_STATE();
break;
} }
} }
} }
@ -1795,6 +1815,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
failf(data, "SCP requires a known file size for upload"); failf(data, "SCP requires a known file size for upload");
sshc->actualcode = CURLE_UPLOAD_FAILED; sshc->actualcode = CURLE_UPLOAD_FAILED;
MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED); MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
break;
} }
sshc->scp_session = sshc->scp_session =
@ -1822,6 +1843,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
err_msg = ssh_get_error(sshc->ssh_session); err_msg = ssh_get_error(sshc->ssh_session);
failf(data, "%s", err_msg); failf(data, "%s", err_msg);
MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED); MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
break;
} }
rc = ssh_scp_push_file(sshc->scp_session, protop->path, rc = ssh_scp_push_file(sshc->scp_session, protop->path,
@ -1831,6 +1853,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
err_msg = ssh_get_error(sshc->ssh_session); err_msg = ssh_get_error(sshc->ssh_session);
failf(data, "%s", err_msg); failf(data, "%s", err_msg);
MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED); MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
break;
} }
/* upload data */ /* upload data */
@ -1859,6 +1882,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data, bool *block)
err_msg = ssh_get_error(sshc->ssh_session); err_msg = ssh_get_error(sshc->ssh_session);
failf(data, "%s", err_msg); failf(data, "%s", err_msg);
MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT); MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
break;
} }
state(data, SSH_SCP_DOWNLOAD); state(data, SSH_SCP_DOWNLOAD);
/* FALLTHROUGH */ /* FALLTHROUGH */