mirror of
				https://github.com/vim/vim.git
				synced 2025-10-27 09:24:23 -04:00 
			
		
		
		
	patch 9.1.1303: missing out-of-memory check in linematch.c
Problem:  missing out-of-memory check in linematch.c
Solution: return early in case of memory allocation failure, move the
          pow() calculation ouside of the for() loop
          (John Marriott)
closes: #17118
Signed-off-by: John Marriott <basilisk@internode.on.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							d2079cff48
						
					
				
				
					commit
					2137710b43
				
			| @@ -410,12 +410,16 @@ linematch_nbuffers( | |||||||
|  |  | ||||||
|     // create the flattened path matrix |     // create the flattened path matrix | ||||||
|     diffcmppath_T *diffcmppath = lalloc(sizeof(diffcmppath_T) * memsize, TRUE); |     diffcmppath_T *diffcmppath = lalloc(sizeof(diffcmppath_T) * memsize, TRUE); | ||||||
|  |     if (diffcmppath == NULL) | ||||||
|  | 	return 0; | ||||||
|  |  | ||||||
|     // allocate memory here |     // allocate memory here | ||||||
|  |     size_t n = (size_t)pow(2.0, (double)ndiffs); | ||||||
|     for (size_t i = 0; i < memsize; i++) |     for (size_t i = 0; i < memsize; i++) | ||||||
|     { |     { | ||||||
| 	diffcmppath[i].df_lev_score = 0; | 	diffcmppath[i].df_lev_score = 0; | ||||||
| 	diffcmppath[i].df_path_n = 0; | 	diffcmppath[i].df_path_n = 0; | ||||||
| 	for (size_t j = 0; j < (size_t)pow(2, (double)ndiffs); j++) | 	for (size_t j = 0; j < n; j++) | ||||||
| 	    diffcmppath[i].df_choice_mem[j] = -1; | 	    diffcmppath[i].df_choice_mem[j] = -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -428,6 +432,12 @@ linematch_nbuffers( | |||||||
|     diffcmppath_T *startNode = &diffcmppath[u]; |     diffcmppath_T *startNode = &diffcmppath[u]; | ||||||
|  |  | ||||||
|     *decisions = lalloc(sizeof(int) * memsize_decisions, TRUE); |     *decisions = lalloc(sizeof(int) * memsize_decisions, TRUE); | ||||||
|  |     if (*decisions == NULL) | ||||||
|  |     { | ||||||
|  | 	vim_free(diffcmppath); | ||||||
|  | 	return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     size_t n_optimal = 0; |     size_t n_optimal = 0; | ||||||
|     test_charmatch_paths(startNode, 0); |     test_charmatch_paths(startNode, 0); | ||||||
|     while (startNode->df_path_n > 0) |     while (startNode->df_path_n > 0) | ||||||
|   | |||||||
| @@ -704,6 +704,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     1303, | ||||||
| /**/ | /**/ | ||||||
|     1302, |     1302, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user