Fix in-place editing functions in convert.c
* crlf_to_git and ident_to_git: Don't grow the buffer if there is enough space in the first place. As a side effect, when the editing is done "in place", we don't grow, so the buffer pointer doesn't changes, and `src' isn't invalidated anymore. Thanks to Bernt Hansen for the bug report. * apply_filter: Fix memory leak due to fake in-place editing that didn't collected the old buffer when the filter succeeds. Also a cosmetic fix. Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Lars Hjemli <hjemli@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>maint
							parent
							
								
									425b78e886
								
							
						
					
					
						commit
						90d16ec032
					
				
							
								
								
									
										17
									
								
								convert.c
								
								
								
								
							
							
						
						
									
										17
									
								
								convert.c
								
								
								
								
							|  | @ -110,7 +110,9 @@ static int crlf_to_git(const char *path, const char *src, size_t len, | ||||||
| 			return 0; | 			return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	strbuf_grow(buf, len); | 	/* only grow if not in place */ | ||||||
|  | 	if (strbuf_avail(buf) + buf->len < len) | ||||||
|  | 		strbuf_grow(buf, len - buf->len); | ||||||
| 	dst = buf->buf; | 	dst = buf->buf; | ||||||
| 	if (action == CRLF_GUESS) { | 	if (action == CRLF_GUESS) { | ||||||
| 		/* | 		/* | ||||||
|  | @ -281,20 +283,19 @@ static int apply_filter(const char *path, const char *src, size_t len, | ||||||
| 		ret = 0; | 		ret = 0; | ||||||
| 	} | 	} | ||||||
| 	if (close(pipe_feed[0])) { | 	if (close(pipe_feed[0])) { | ||||||
| 		ret = error("read from external filter %s failed", cmd); | 		error("read from external filter %s failed", cmd); | ||||||
| 		ret = 0; | 		ret = 0; | ||||||
| 	} | 	} | ||||||
| 	status = finish_command(&child_process); | 	status = finish_command(&child_process); | ||||||
| 	if (status) { | 	if (status) { | ||||||
| 		ret = error("external filter %s failed %d", cmd, -status); | 		error("external filter %s failed %d", cmd, -status); | ||||||
| 		ret = 0; | 		ret = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
| 		*dst = nbuf; | 		strbuf_swap(dst, &nbuf); | ||||||
| 	} else { |  | ||||||
| 		strbuf_release(&nbuf); |  | ||||||
| 	} | 	} | ||||||
|  | 	strbuf_release(&nbuf); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -422,7 +423,9 @@ static int ident_to_git(const char *path, const char *src, size_t len, | ||||||
| 	if (!ident || !count_ident(src, len)) | 	if (!ident || !count_ident(src, len)) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| 	strbuf_grow(buf, len); | 	/* only grow if not in place */ | ||||||
|  | 	if (strbuf_avail(buf) + buf->len < len) | ||||||
|  | 		strbuf_grow(buf, len - buf->len); | ||||||
| 	dst = buf->buf; | 	dst = buf->buf; | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
| 		dollar = memchr(src, '$', len); | 		dollar = memchr(src, '$', len); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Pierre Habouzit
						Pierre Habouzit