@@ -258,7 +258,7 @@ struct branch_info {
258258 char * push_remote_name ;
259259};
260260
261- static struct string_list branch_list = STRING_LIST_INIT_NODUP ;
261+ static struct string_list branch_list = STRING_LIST_INIT_DUP ;
262262
263263static const char * abbrev_ref (const char * name , const char * prefix )
264264{
@@ -292,8 +292,8 @@ static int config_read_branches(const char *key, const char *value,
292292 type = PUSH_REMOTE ;
293293 else
294294 return 0 ;
295- name = xmemdupz (key , key_len );
296295
296+ name = xmemdupz (key , key_len );
297297 item = string_list_insert (& branch_list , name );
298298
299299 if (!item -> util )
@@ -337,6 +337,7 @@ static int config_read_branches(const char *key, const char *value,
337337 BUG ("unexpected type=%d" , type );
338338 }
339339
340+ free (name );
340341 return 0 ;
341342}
342343
@@ -554,13 +555,16 @@ static int add_branch_for_removal(const char *refname,
554555 refspec .dst = (char * )refname ;
555556 if (remote_find_tracking (branches -> remote , & refspec ))
556557 return 0 ;
558+ free (refspec .src );
557559
558560 /* don't delete a branch if another remote also uses it */
559561 for (kr = branches -> keep -> list ; kr ; kr = kr -> next ) {
560562 memset (& refspec , 0 , sizeof (refspec ));
561563 refspec .dst = (char * )refname ;
562- if (!remote_find_tracking (kr -> remote , & refspec ))
564+ if (!remote_find_tracking (kr -> remote , & refspec )) {
565+ free (refspec .src );
563566 return 0 ;
567+ }
564568 }
565569
566570 /* don't delete non-remote-tracking refs */
@@ -667,7 +671,11 @@ static int config_read_push_default(const char *key, const char *value,
667671static void handle_push_default (const char * old_name , const char * new_name )
668672{
669673 struct push_default_info push_default = {
670- old_name , CONFIG_SCOPE_UNKNOWN , STRBUF_INIT , -1 };
674+ .old_name = old_name ,
675+ .scope = CONFIG_SCOPE_UNKNOWN ,
676+ .origin = STRBUF_INIT ,
677+ .linenr = -1 ,
678+ };
671679 git_config (config_read_push_default , & push_default );
672680 if (push_default .scope >= CONFIG_SCOPE_COMMAND )
673681 ; /* pass */
@@ -687,6 +695,8 @@ static void handle_push_default(const char* old_name, const char* new_name)
687695 push_default .origin .buf , push_default .linenr ,
688696 old_name );
689697 }
698+
699+ strbuf_release (& push_default .origin );
690700}
691701
692702
@@ -784,7 +794,7 @@ static int mv(int argc, const char **argv, const char *prefix)
784794 }
785795
786796 if (!refspec_updated )
787- return 0 ;
797+ goto out ;
788798
789799 /*
790800 * First remove symrefs, then rename the rest, finally create
@@ -850,10 +860,15 @@ static int mv(int argc, const char **argv, const char *prefix)
850860 display_progress (progress , ++ refs_renamed_nr );
851861 }
852862 stop_progress (& progress );
853- string_list_clear (& remote_branches , 1 );
854863
855864 handle_push_default (rename .old_name , rename .new_name );
856865
866+ out :
867+ string_list_clear (& remote_branches , 1 );
868+ strbuf_release (& old_remote_context );
869+ strbuf_release (& buf );
870+ strbuf_release (& buf2 );
871+ strbuf_release (& buf3 );
857872 return 0 ;
858873}
859874
@@ -944,12 +959,21 @@ static int rm(int argc, const char **argv, const char *prefix)
944959
945960 if (!result ) {
946961 strbuf_addf (& buf , "remote.%s" , remote -> name );
947- if (git_config_rename_section (buf .buf , NULL ) < 1 )
948- return error (_ ("Could not remove config section '%s'" ), buf .buf );
962+ if (git_config_rename_section (buf .buf , NULL ) < 1 ) {
963+ result = error (_ ("Could not remove config section '%s'" ), buf .buf );
964+ goto out ;
965+ }
949966
950967 handle_push_default (remote -> name , NULL );
951968 }
952969
970+ out :
971+ for (struct known_remote * r = known_remotes .list ; r ;) {
972+ struct known_remote * next = r -> next ;
973+ free (r );
974+ r = next ;
975+ }
976+ strbuf_release (& buf );
953977 return result ;
954978}
955979
@@ -982,8 +1006,10 @@ static int append_ref_to_tracked_list(const char *refname,
9821006
9831007 memset (& refspec , 0 , sizeof (refspec ));
9841008 refspec .dst = (char * )refname ;
985- if (!remote_find_tracking (states -> remote , & refspec ))
1009+ if (!remote_find_tracking (states -> remote , & refspec )) {
9861010 string_list_append (& states -> tracked , abbrev_branch (refspec .src ));
1011+ free (refspec .src );
1012+ }
9871013
9881014 return 0 ;
9891015}
0 commit comments