reftable/merged: fix zero-sized allocation when there are no readers
It was reported [1] that Git started to fail with an out-of-memory error
when initializing repositories with the reftable backend on NonStop
platforms. A bisect led to 802c0646ac (reftable/merged: handle
allocation failures in `merged_table_init_iter()`, 2024-10-02), which
changed how we allocate memory when initializing a merged table.
The root cause of this seems to be that NonStop returns a `NULL` pointer
when doing a zero-sized allocation. This would've already happened
before the above change, but we never noticed because we did not check
the result. Now we do notice and thus return an out-of-memory error to
the caller.
Fix the issue by skipping the allocation altogether in case there are no
readers.
[1]: <00ad01db5017$aa9ce340$ffd6a9c0$@nexbridge.com>
Reported-by: Randall S. Becker <rsbecker@nexbridge.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
This commit is contained in:
		 Patrick Steinhardt
					Patrick Steinhardt
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							8e27ee9220
						
					
				
				
					commit
					5ab83521cf
				
			| @ -238,14 +238,16 @@ int merged_table_init_iter(struct reftable_merged_table *mt, | |||||||
| 			   struct reftable_iterator *it, | 			   struct reftable_iterator *it, | ||||||
| 			   uint8_t typ) | 			   uint8_t typ) | ||||||
| { | { | ||||||
| 	struct merged_subiter *subiters; | 	struct merged_subiter *subiters = NULL; | ||||||
| 	struct merged_iter *mi = NULL; | 	struct merged_iter *mi = NULL; | ||||||
| 	int ret; | 	int ret; | ||||||
|  |  | ||||||
| 	REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len); | 	if (mt->readers_len) { | ||||||
| 	if (!subiters) { | 		REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len); | ||||||
| 		ret = REFTABLE_OUT_OF_MEMORY_ERROR; | 		if (!subiters) { | ||||||
| 		goto out; | 			ret = REFTABLE_OUT_OF_MEMORY_ERROR; | ||||||
|  | 			goto out; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (size_t i = 0; i < mt->readers_len; i++) { | 	for (size_t i = 0; i < mt->readers_len; i++) { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user