mirror of
https://github.com/GOSTSec/sgminer
synced 2025-02-02 10:04:33 +00:00
Protect the freeing of current_hash under mutex_lock to prevent racing on it when set_curblock is hit concurrently.
This commit is contained in:
parent
10f619cb2f
commit
7233890d85
19
cgminer.c
19
cgminer.c
@ -161,7 +161,9 @@ static pthread_mutex_t *stgd_lock;
|
|||||||
#ifdef HAVE_CURSES
|
#ifdef HAVE_CURSES
|
||||||
static pthread_mutex_t curses_lock;
|
static pthread_mutex_t curses_lock;
|
||||||
#endif
|
#endif
|
||||||
|
static pthread_mutex_t ch_lock;
|
||||||
static pthread_rwlock_t blk_lock;
|
static pthread_rwlock_t blk_lock;
|
||||||
|
|
||||||
pthread_rwlock_t netacc_lock;
|
pthread_rwlock_t netacc_lock;
|
||||||
|
|
||||||
double total_mhashes_done;
|
double total_mhashes_done;
|
||||||
@ -2419,23 +2421,25 @@ static void restart_threads(void)
|
|||||||
static void set_curblock(char *hexstr, unsigned char *hash)
|
static void set_curblock(char *hexstr, unsigned char *hash)
|
||||||
{
|
{
|
||||||
unsigned char hash_swap[32];
|
unsigned char hash_swap[32];
|
||||||
char *old_hash = NULL;
|
|
||||||
struct timeval tv_now;
|
struct timeval tv_now;
|
||||||
|
char *old_hash;
|
||||||
|
|
||||||
/* Don't free current_hash directly to avoid dereferencing it when
|
|
||||||
* we might be accessing its data elsewhere */
|
|
||||||
if (current_hash)
|
|
||||||
old_hash = current_hash;
|
|
||||||
strcpy(current_block, hexstr);
|
strcpy(current_block, hexstr);
|
||||||
gettimeofday(&tv_now, NULL);
|
gettimeofday(&tv_now, NULL);
|
||||||
get_timestamp(blocktime, &tv_now);
|
get_timestamp(blocktime, &tv_now);
|
||||||
swap256(hash_swap, hash);
|
swap256(hash_swap, hash);
|
||||||
|
|
||||||
|
/* Don't free current_hash directly to avoid dereferencing when read
|
||||||
|
* elsewhere */
|
||||||
|
mutex_lock(&ch_lock);
|
||||||
|
old_hash = current_hash;
|
||||||
current_hash = bin2hex(hash_swap, 16);
|
current_hash = bin2hex(hash_swap, 16);
|
||||||
|
free(old_hash);
|
||||||
|
mutex_unlock(&ch_lock);
|
||||||
|
|
||||||
if (unlikely(!current_hash))
|
if (unlikely(!current_hash))
|
||||||
quit (1, "set_curblock OOM");
|
quit (1, "set_curblock OOM");
|
||||||
applog(LOG_INFO, "New block: %s...", current_hash);
|
applog(LOG_INFO, "New block: %s...", current_hash);
|
||||||
if (old_hash)
|
|
||||||
free(old_hash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search to see if this string is from a block that has been seen before */
|
/* Search to see if this string is from a block that has been seen before */
|
||||||
@ -4706,6 +4710,7 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
mutex_init(&control_lock);
|
mutex_init(&control_lock);
|
||||||
mutex_init(&sharelog_lock);
|
mutex_init(&sharelog_lock);
|
||||||
|
mutex_init(&ch_lock);
|
||||||
rwlock_init(&blk_lock);
|
rwlock_init(&blk_lock);
|
||||||
rwlock_init(&netacc_lock);
|
rwlock_init(&netacc_lock);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user