ref-filter: free item->value and item->value->s
Release item->value. Initialize item->value->s dynamically and then release its resources. Release some local variables. Final goal of this patch is to reduce number of memory leaks. Signed-off-by: Olga Telezhnaia <olyatelezhnaya@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									deec6b8e0f
								
							
						
					
					
						commit
						f0062d3b74
					
				
							
								
								
									
										96
									
								
								ref-filter.c
								
								
								
								
							
							
						
						
									
										96
									
								
								ref-filter.c
								
								
								
								
							|  | @ -875,7 +875,7 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_ | ||||||
| 		if (deref) | 		if (deref) | ||||||
| 			name++; | 			name++; | ||||||
| 		if (!strcmp(name, "objecttype")) | 		if (!strcmp(name, "objecttype")) | ||||||
| 			v->s = type_name(oi->type); | 			v->s = xstrdup(type_name(oi->type)); | ||||||
| 		else if (!strcmp(name, "objectsize")) { | 		else if (!strcmp(name, "objectsize")) { | ||||||
| 			v->value = oi->size; | 			v->value = oi->size; | ||||||
| 			v->s = xstrfmt("%lu", oi->size); | 			v->s = xstrfmt("%lu", oi->size); | ||||||
|  | @ -899,9 +899,9 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob | ||||||
| 		if (deref) | 		if (deref) | ||||||
| 			name++; | 			name++; | ||||||
| 		if (!strcmp(name, "tag")) | 		if (!strcmp(name, "tag")) | ||||||
| 			v->s = tag->tag; | 			v->s = xstrdup(tag->tag); | ||||||
| 		else if (!strcmp(name, "type") && tag->tagged) | 		else if (!strcmp(name, "type") && tag->tagged) | ||||||
| 			v->s = type_name(tag->tagged->type); | 			v->s = xstrdup(type_name(tag->tagged->type)); | ||||||
| 		else if (!strcmp(name, "object") && tag->tagged) | 		else if (!strcmp(name, "object") && tag->tagged) | ||||||
| 			v->s = xstrdup(oid_to_hex(&tag->tagged->oid)); | 			v->s = xstrdup(oid_to_hex(&tag->tagged->oid)); | ||||||
| 	} | 	} | ||||||
|  | @ -1032,7 +1032,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam | ||||||
| 	v->value = timestamp; | 	v->value = timestamp; | ||||||
| 	return; | 	return; | ||||||
|  bad: |  bad: | ||||||
| 	v->s = ""; | 	v->s = xstrdup(""); | ||||||
| 	v->value = 0; | 	v->value = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1227,7 +1227,7 @@ static void fill_missing_values(struct atom_value *val) | ||||||
| 	for (i = 0; i < used_atom_cnt; i++) { | 	for (i = 0; i < used_atom_cnt; i++) { | ||||||
| 		struct atom_value *v = &val[i]; | 		struct atom_value *v = &val[i]; | ||||||
| 		if (v->s == NULL) | 		if (v->s == NULL) | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1273,7 +1273,8 @@ static inline char *copy_advance(char *dst, const char *src) | ||||||
| static const char *lstrip_ref_components(const char *refname, int len) | static const char *lstrip_ref_components(const char *refname, int len) | ||||||
| { | { | ||||||
| 	long remaining = len; | 	long remaining = len; | ||||||
| 	const char *start = refname; | 	const char *start = xstrdup(refname); | ||||||
|  | 	const char *to_free = start; | ||||||
|  |  | ||||||
| 	if (len < 0) { | 	if (len < 0) { | ||||||
| 		int i; | 		int i; | ||||||
|  | @ -1294,20 +1295,24 @@ static const char *lstrip_ref_components(const char *refname, int len) | ||||||
| 	while (remaining > 0) { | 	while (remaining > 0) { | ||||||
| 		switch (*start++) { | 		switch (*start++) { | ||||||
| 		case '\0': | 		case '\0': | ||||||
| 			return ""; | 			free((char *)to_free); | ||||||
|  | 			return xstrdup(""); | ||||||
| 		case '/': | 		case '/': | ||||||
| 			remaining--; | 			remaining--; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	start = xstrdup(start); | ||||||
|  | 	free((char *)to_free); | ||||||
| 	return start; | 	return start; | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char *rstrip_ref_components(const char *refname, int len) | static const char *rstrip_ref_components(const char *refname, int len) | ||||||
| { | { | ||||||
| 	long remaining = len; | 	long remaining = len; | ||||||
| 	char *start = xstrdup(refname); | 	const char *start = xstrdup(refname); | ||||||
|  | 	const char *to_free = start; | ||||||
|  |  | ||||||
| 	if (len < 0) { | 	if (len < 0) { | ||||||
| 		int i; | 		int i; | ||||||
|  | @ -1327,9 +1332,10 @@ static const char *rstrip_ref_components(const char *refname, int len) | ||||||
|  |  | ||||||
| 	while (remaining-- > 0) { | 	while (remaining-- > 0) { | ||||||
| 		char *p = strrchr(start, '/'); | 		char *p = strrchr(start, '/'); | ||||||
| 		if (p == NULL) | 		if (p == NULL) { | ||||||
| 			return ""; | 			free((char *)to_free); | ||||||
| 		else | 			return xstrdup(""); | ||||||
|  | 		} else | ||||||
| 			p[0] = '\0'; | 			p[0] = '\0'; | ||||||
| 	} | 	} | ||||||
| 	return start; | 	return start; | ||||||
|  | @ -1344,7 +1350,7 @@ static const char *show_ref(struct refname_atom *atom, const char *refname) | ||||||
| 	else if (atom->option == R_RSTRIP) | 	else if (atom->option == R_RSTRIP) | ||||||
| 		return rstrip_ref_components(refname, atom->rstrip); | 		return rstrip_ref_components(refname, atom->rstrip); | ||||||
| 	else | 	else | ||||||
| 		return refname; | 		return xstrdup(refname); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void fill_remote_ref_details(struct used_atom *atom, const char *refname, | static void fill_remote_ref_details(struct used_atom *atom, const char *refname, | ||||||
|  | @ -1358,7 +1364,7 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname, | ||||||
| 				       NULL, AHEAD_BEHIND_FULL) < 0) { | 				       NULL, AHEAD_BEHIND_FULL) < 0) { | ||||||
| 			*s = xstrdup(msgs.gone); | 			*s = xstrdup(msgs.gone); | ||||||
| 		} else if (!num_ours && !num_theirs) | 		} else if (!num_ours && !num_theirs) | ||||||
| 			*s = ""; | 			*s = xstrdup(""); | ||||||
| 		else if (!num_ours) | 		else if (!num_ours) | ||||||
| 			*s = xstrfmt(msgs.behind, num_theirs); | 			*s = xstrfmt(msgs.behind, num_theirs); | ||||||
| 		else if (!num_theirs) | 		else if (!num_theirs) | ||||||
|  | @ -1373,36 +1379,31 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname, | ||||||
| 		} | 		} | ||||||
| 	} else if (atom->u.remote_ref.option == RR_TRACKSHORT) { | 	} else if (atom->u.remote_ref.option == RR_TRACKSHORT) { | ||||||
| 		if (stat_tracking_info(branch, &num_ours, &num_theirs, | 		if (stat_tracking_info(branch, &num_ours, &num_theirs, | ||||||
| 				       NULL, AHEAD_BEHIND_FULL) < 0) | 				       NULL, AHEAD_BEHIND_FULL) < 0) { | ||||||
|  | 			*s = xstrdup(""); | ||||||
| 			return; | 			return; | ||||||
|  | 		} | ||||||
| 		if (!num_ours && !num_theirs) | 		if (!num_ours && !num_theirs) | ||||||
| 			*s = "="; | 			*s = xstrdup("="); | ||||||
| 		else if (!num_ours) | 		else if (!num_ours) | ||||||
| 			*s = "<"; | 			*s = xstrdup("<"); | ||||||
| 		else if (!num_theirs) | 		else if (!num_theirs) | ||||||
| 			*s = ">"; | 			*s = xstrdup(">"); | ||||||
| 		else | 		else | ||||||
| 			*s = "<>"; | 			*s = xstrdup("<>"); | ||||||
| 	} else if (atom->u.remote_ref.option == RR_REMOTE_NAME) { | 	} else if (atom->u.remote_ref.option == RR_REMOTE_NAME) { | ||||||
| 		int explicit; | 		int explicit; | ||||||
| 		const char *remote = atom->u.remote_ref.push ? | 		const char *remote = atom->u.remote_ref.push ? | ||||||
| 			pushremote_for_branch(branch, &explicit) : | 			pushremote_for_branch(branch, &explicit) : | ||||||
| 			remote_for_branch(branch, &explicit); | 			remote_for_branch(branch, &explicit); | ||||||
| 		if (explicit) | 		*s = xstrdup(explicit ? remote : ""); | ||||||
| 			*s = xstrdup(remote); |  | ||||||
| 		else |  | ||||||
| 			*s = ""; |  | ||||||
| 	} else if (atom->u.remote_ref.option == RR_REMOTE_REF) { | 	} else if (atom->u.remote_ref.option == RR_REMOTE_REF) { | ||||||
| 		int explicit; | 		int explicit; | ||||||
| 		const char *merge; | 		const char *merge; | ||||||
|  |  | ||||||
| 		merge = remote_ref_for_branch(branch, atom->u.remote_ref.push, | 		merge = remote_ref_for_branch(branch, atom->u.remote_ref.push, | ||||||
| 					      &explicit); | 					      &explicit); | ||||||
| 		if (explicit) | 		*s = xstrdup(explicit ? merge : ""); | ||||||
| 			*s = xstrdup(merge); |  | ||||||
| 		else |  | ||||||
| 			*s = ""; |  | ||||||
| 	} else | 	} else | ||||||
| 		BUG("unhandled RR_* enum"); | 		BUG("unhandled RR_* enum"); | ||||||
| } | } | ||||||
|  | @ -1451,7 +1452,7 @@ char *get_head_description(void) | ||||||
| static const char *get_symref(struct used_atom *atom, struct ref_array_item *ref) | static const char *get_symref(struct used_atom *atom, struct ref_array_item *ref) | ||||||
| { | { | ||||||
| 	if (!ref->symref) | 	if (!ref->symref) | ||||||
| 		return ""; | 		return xstrdup(""); | ||||||
| 	else | 	else | ||||||
| 		return show_ref(&atom->u.refname, ref->symref); | 		return show_ref(&atom->u.refname, ref->symref); | ||||||
| } | } | ||||||
|  | @ -1510,7 +1511,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) | ||||||
| 		ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING, | 		ref->symref = resolve_refdup(ref->refname, RESOLVE_REF_READING, | ||||||
| 					     NULL, NULL); | 					     NULL, NULL); | ||||||
| 		if (!ref->symref) | 		if (!ref->symref) | ||||||
| 			ref->symref = ""; | 			ref->symref = xstrdup(""); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Fill in specials first */ | 	/* Fill in specials first */ | ||||||
|  | @ -1536,20 +1537,23 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) | ||||||
| 			refname = get_symref(atom, ref); | 			refname = get_symref(atom, ref); | ||||||
| 		else if (starts_with(name, "upstream")) { | 		else if (starts_with(name, "upstream")) { | ||||||
| 			const char *branch_name; | 			const char *branch_name; | ||||||
| 			v->s = ""; |  | ||||||
| 			/* only local branches may have an upstream */ | 			/* only local branches may have an upstream */ | ||||||
| 			if (!skip_prefix(ref->refname, "refs/heads/", | 			if (!skip_prefix(ref->refname, "refs/heads/", | ||||||
| 					 &branch_name)) | 					 &branch_name)) { | ||||||
|  | 				v->s = xstrdup(""); | ||||||
| 				continue; | 				continue; | ||||||
|  | 			} | ||||||
| 			branch = branch_get(branch_name); | 			branch = branch_get(branch_name); | ||||||
|  |  | ||||||
| 			refname = branch_get_upstream(branch, NULL); | 			refname = branch_get_upstream(branch, NULL); | ||||||
| 			if (refname) | 			if (refname) | ||||||
| 				fill_remote_ref_details(atom, refname, branch, &v->s); | 				fill_remote_ref_details(atom, refname, branch, &v->s); | ||||||
|  | 			else | ||||||
|  | 				v->s = xstrdup(""); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (atom->u.remote_ref.push) { | 		} else if (atom->u.remote_ref.push) { | ||||||
| 			const char *branch_name; | 			const char *branch_name; | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 			if (!skip_prefix(ref->refname, "refs/heads/", | 			if (!skip_prefix(ref->refname, "refs/heads/", | ||||||
| 					 &branch_name)) | 					 &branch_name)) | ||||||
| 				continue; | 				continue; | ||||||
|  | @ -1562,10 +1566,12 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) | ||||||
| 				if (!refname) | 				if (!refname) | ||||||
| 					continue; | 					continue; | ||||||
| 			} | 			} | ||||||
|  | 			/* We will definitely re-init v->s on the next line. */ | ||||||
|  | 			free((char *)v->s); | ||||||
| 			fill_remote_ref_details(atom, refname, branch, &v->s); | 			fill_remote_ref_details(atom, refname, branch, &v->s); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (starts_with(name, "color:")) { | 		} else if (starts_with(name, "color:")) { | ||||||
| 			v->s = atom->u.color; | 			v->s = xstrdup(atom->u.color); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (!strcmp(name, "flag")) { | 		} else if (!strcmp(name, "flag")) { | ||||||
| 			char buf[256], *cp = buf; | 			char buf[256], *cp = buf; | ||||||
|  | @ -1574,7 +1580,7 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) | ||||||
| 			if (ref->flag & REF_ISPACKED) | 			if (ref->flag & REF_ISPACKED) | ||||||
| 				cp = copy_advance(cp, ",packed"); | 				cp = copy_advance(cp, ",packed"); | ||||||
| 			if (cp == buf) | 			if (cp == buf) | ||||||
| 				v->s = ""; | 				v->s = xstrdup(""); | ||||||
| 			else { | 			else { | ||||||
| 				*cp = '\0'; | 				*cp = '\0'; | ||||||
| 				v->s = xstrdup(buf + 1); | 				v->s = xstrdup(buf + 1); | ||||||
|  | @ -1584,40 +1590,42 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (!strcmp(name, "HEAD")) { | 		} else if (!strcmp(name, "HEAD")) { | ||||||
| 			if (atom->u.head && !strcmp(ref->refname, atom->u.head)) | 			if (atom->u.head && !strcmp(ref->refname, atom->u.head)) | ||||||
| 				v->s = "*"; | 				v->s = xstrdup("*"); | ||||||
| 			else | 			else | ||||||
| 				v->s = " "; | 				v->s = xstrdup(" "); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (starts_with(name, "align")) { | 		} else if (starts_with(name, "align")) { | ||||||
| 			v->handler = align_atom_handler; | 			v->handler = align_atom_handler; | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (!strcmp(name, "end")) { | 		} else if (!strcmp(name, "end")) { | ||||||
| 			v->handler = end_atom_handler; | 			v->handler = end_atom_handler; | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (starts_with(name, "if")) { | 		} else if (starts_with(name, "if")) { | ||||||
| 			const char *s; | 			const char *s; | ||||||
| 			v->s = ""; |  | ||||||
| 			if (skip_prefix(name, "if:", &s)) | 			if (skip_prefix(name, "if:", &s)) | ||||||
| 				v->s = xstrdup(s); | 				v->s = xstrdup(s); | ||||||
|  | 			else | ||||||
|  | 				v->s = xstrdup(""); | ||||||
| 			v->handler = if_atom_handler; | 			v->handler = if_atom_handler; | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (!strcmp(name, "then")) { | 		} else if (!strcmp(name, "then")) { | ||||||
| 			v->handler = then_atom_handler; | 			v->handler = then_atom_handler; | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else if (!strcmp(name, "else")) { | 		} else if (!strcmp(name, "else")) { | ||||||
| 			v->handler = else_atom_handler; | 			v->handler = else_atom_handler; | ||||||
| 			v->s = ""; | 			v->s = xstrdup(""); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else | 		} else | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		if (!deref) | 		if (!deref) | ||||||
| 			v->s = refname; | 			v->s = xstrdup(refname); | ||||||
| 		else | 		else | ||||||
| 			v->s = xstrfmt("%s^{}", refname); | 			v->s = xstrfmt("%s^{}", refname); | ||||||
|  | 		free((char *)refname); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (i = 0; i < used_atom_cnt; i++) { | 	for (i = 0; i < used_atom_cnt; i++) { | ||||||
|  | @ -1988,6 +1996,10 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid, | ||||||
| static void free_array_item(struct ref_array_item *item) | static void free_array_item(struct ref_array_item *item) | ||||||
| { | { | ||||||
| 	free((char *)item->symref); | 	free((char *)item->symref); | ||||||
|  | 	if (item->value) { | ||||||
|  | 		free((char *)item->value->s); | ||||||
|  | 		free(item->value); | ||||||
|  | 	} | ||||||
| 	free(item); | 	free(item); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Olga Telezhnaya
						Olga Telezhnaya