Copy 'errno' and use copied value in the if check of retry in cluster migrate commands socket_err block. (#1042)

errno is global variable and shared with system calls, so there is
chance it may be overwritten during io free or close socket in migrate
command code. It would be better it is copied before the free or
closesocket and use copied value to check for retry in socket_err block.
So added new variable to take copy and used the copy variable for the
check.

Signed-off-by: Shivshankar-Reddy <shiva.sheri.github@gmail.com>
This commit is contained in:
Shivshankar 2024-09-17 22:34:11 -04:00 committed by GitHub
parent ff69b4be1d
commit ba71c7e56e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -422,6 +422,7 @@ void migrateCommand(client *c) {
int may_retry = 1;
int write_error = 0;
int argv_rewritten = 0;
int errno_copy = 0;
/* To support the KEYS option we need the following additional state. */
int first_key = 3; /* Argument index of the first key. */
@ -710,6 +711,10 @@ try_again:
* It is very common for the cached socket to get closed, if just reopening
* it works it's a shame to notify the error to the caller. */
socket_err:
/* Take a copy of 'errno' prior cleanup as it can be overwritten and
* use copied variable for re-try check. */
errno_copy = errno;
/* Cleanup we want to perform in both the retry and no retry case.
* Note: Closing the migrate socket will also force SELECT next time. */
sdsfree(cmd.io.buffer.ptr);
@ -724,7 +729,7 @@ socket_err:
/* Retry only if it's not a timeout and we never attempted a retry
* (or the code jumping here did not set may_retry to zero). */
if (errno != ETIMEDOUT && may_retry) {
if (errno_copy != ETIMEDOUT && may_retry) {
may_retry = 0;
goto try_again;
}