diff options
| -rw-r--r-- | lib/sqfs/blk_proc/pthread.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/sqfs/blk_proc/pthread.c b/lib/sqfs/blk_proc/pthread.c index b1755ce..85146da 100644 --- a/lib/sqfs/blk_proc/pthread.c +++ b/lib/sqfs/blk_proc/pthread.c @@ -268,6 +268,7 @@ static int queue_pump(sqfs_block_processor_t *proc, sqfs_block_t *block)  	if (proc->status != 0) {  		status = proc->status;  		pthread_mutex_unlock(&proc->mtx); +		free(block);  		return status;  	} @@ -277,15 +278,16 @@ static int queue_pump(sqfs_block_processor_t *proc, sqfs_block_t *block)  	block = NULL;  	pthread_mutex_unlock(&proc->mtx); -	if (completed != NULL && (completed->flags & SQFS_BLK_IS_FRAGMENT)) { +	if (completed == NULL) +		return 0; + +	if (completed->flags & SQFS_BLK_IS_FRAGMENT) {  		status = handle_fragment(proc, completed, &block);  		if (status != 0) {  			free(block); -			return test_and_set_status(proc, status); -		} - -		if (block != NULL) { +			status = test_and_set_status(proc, status); +		} else if (block != NULL) {  			pthread_mutex_lock(&proc->mtx);  			proc->dequeue_id = completed->sequence_number;  			block->sequence_number = proc->dequeue_id; @@ -302,7 +304,7 @@ static int queue_pump(sqfs_block_processor_t *proc, sqfs_block_t *block)  			pthread_cond_broadcast(&proc->queue_cond);  			pthread_mutex_unlock(&proc->mtx);  		} -	} else if (completed != NULL) { +	} else {  		status = process_completed_block(proc, completed);  		if (status != 0) @@ -316,8 +318,10 @@ static int queue_pump(sqfs_block_processor_t *proc, sqfs_block_t *block)  int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc,  				 sqfs_block_t *block)  { -	if (block->flags & ~SQFS_BLK_USER_SETTABLE_FLAGS) +	if (block->flags & ~SQFS_BLK_USER_SETTABLE_FLAGS) { +		free(block);  		return test_and_set_status(proc, SQFS_ERROR_UNSUPPORTED); +	}  	return queue_pump(proc, block);  } @@ -350,6 +354,7 @@ restart:  			if (status != 0) {  				proc->status = status;  				pthread_mutex_unlock(&proc->mtx); +				free(block);  				free(it);  				return status;  			} @@ -371,6 +376,8 @@ restart:  				pthread_cond_broadcast(&proc->queue_cond);  				goto restart;  			} + +			free(it);  		} else {  			status = process_completed_block(proc, it);  			free(it);  | 
