diff
+ static void cleanup_resources(char *sm_alternate, char *error_strategy, char *sm_gitdir, char *p, char *to_free) {
+ 	if (sm_alternate)
+ 		free(sm_alternate);
+ 	if (error_strategy)
+ 		free(error_strategy);
+ 	free(sm_gitdir);
+ 	free(p);
+ 	free(to_free);
+ }
+
  static int clone_submodule(const struct module_clone_data *clone_data,
  			   struct string_list *reference)
  {
  	/* ... rest of the code ... */
+ 	int ret = 0;
  	git_config_get_string("submodule.alternateLocation", &sm_alternate);
  	git_config_get_string("submodule.alternateErrorStrategy", &error_strategy);
  	/* ... rest of the code ... */
- 	free(sm_alternate);
- 	free(error_strategy);
- 	free(sm_gitdir);
- 	free(p);
- 	free(to_free);
+ 	cleanup_resources(sm_alternate, error_strategy, sm_gitdir, p, to_free);
+ 	return ret;
+
+ error:
+ 	ret = -1;
+ 	cleanup_resources(sm_alternate, error_strategy, sm_gitdir, p, to_free);
+ 	return ret;
  }
