aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-01-28 21:42:55 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-01-28 21:42:55 -0500
commit7c2b1baad8434f9f7b19efe48719942cb3bce4cd (patch)
tree79666a768eb3392ddea57a78c57531d00a145769 /src
parent8b06e3e66a4cf26c02f9e0175263e1a561186c1b (diff)
downloadspmc-7c2b1baad8434f9f7b19efe48719942cb3bce4cd.tar.gz
Fix more memory leaks:
Add ability to free ManifestPackage structure Fix bug: manifest_search pointer got free()ed accidentally.
Diffstat (limited to 'src')
-rw-r--r--src/config_global.c9
-rw-r--r--src/manifest.c22
-rw-r--r--src/mirrors.c12
-rw-r--r--src/spm.c6
-rw-r--r--src/strings.c4
5 files changed, 39 insertions, 14 deletions
diff --git a/src/config_global.c b/src/config_global.c
index 5ef6faa..bda63d6 100644
--- a/src/config_global.c
+++ b/src/config_global.c
@@ -292,6 +292,15 @@ void free_global_config(void) {
if (SPM_GLOBAL.config) {
config_free(SPM_GLOBAL.config);
}
+ if (SPM_GLOBAL.repo_target) {
+ free(SPM_GLOBAL.repo_target);
+ }
+ if (SPM_GLOBAL.mirror_config) {
+ free(SPM_GLOBAL.mirror_config);
+ }
+ if (SPM_GLOBAL.mirror_list) {
+ mirror_list_free(SPM_GLOBAL.mirror_list);
+ }
}
/**
diff --git a/src/manifest.c b/src/manifest.c
index 9926fa5..90c8087 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -100,19 +100,25 @@ Manifest *manifest_from(const char *package_dir) {
*/
void manifest_free(Manifest *info) {
for (size_t i = 0; i < info->records; i++) {
- if (info->packages[i]->requirements != NULL) {
- for (int j = 0; info->packages[i]->requirements[j] != NULL; j++) {
- free(info->packages[i]->requirements[j]);
- }
- free(info->packages[i]->requirements);
- }
- free(info->packages[i]);
+ manifest_package_free(info->packages[i]);
}
free(info->packages);
free(info);
}
/**
+ * Free a `ManifestPackage` structure
+ * @param info `ManifestPackage`
+ */
+void manifest_package_free(ManifestPackage *info) {
+ for (size_t i = 0; i < info->requirements_records; i++) {
+ free(info->requirements[i]);
+ }
+ free(info->requirements);
+ free(info);
+}
+
+/**
* Write a `Manifest` to the configuration directory
* @param info
* @param outfile
@@ -219,7 +225,7 @@ int fetch(const char *url, const char *dest) {
handle = url_fopen(url, "r");
if(!handle) {
- printf("couldn't url_fopen() %s\n", url);
+ fprintf(stderr, "couldn't url_fopen() %s\n", url);
return 2;
}
diff --git a/src/mirrors.c b/src/mirrors.c
index d551842..2275be4 100644
--- a/src/mirrors.c
+++ b/src/mirrors.c
@@ -70,6 +70,16 @@ char **mirror_list(const char *filename) {
return result;
}
+void mirror_list_free(char **m) {
+ if (m == NULL) {
+ return;
+ }
+ for (size_t i = 0; m[i] != NULL; i++) {
+ free(m[i]);
+ }
+ free(m);
+}
+
void mirror_clone(Manifest *info, char *_dest) {
char *dest = NULL;
if (endswith(_dest, SPM_GLOBAL.repo_target) != 0) {
@@ -96,7 +106,7 @@ void mirror_clone(Manifest *info, char *_dest) {
char *checksum = sha256sum(path);
if (strcmp(checksum, info->packages[i]->checksum_sha256) == 0) {
printf("Skipped: %s\n", archive);
- //free(checksum);
+ free(checksum);
free(archive);
free(path);
continue;
diff --git a/src/spm.c b/src/spm.c
index 806cbcd..d3aa962 100644
--- a/src/spm.c
+++ b/src/spm.c
@@ -277,7 +277,7 @@ int main(int argc, char *argv[], char *arge[]) {
runtime_free(rt);
exit(errno);
}
- free(match);
+ manifest_free(manifest);
}
dep_free(&deps);
}
@@ -347,10 +347,10 @@ int main(int argc, char *argv[], char *arge[]) {
}
}
- runtime_free(rt);
- exit(0);
+ manifest_free(info);
}
+ runtime_free(rt);
free_global_config();
return 0;
}
diff --git a/src/strings.c b/src/strings.c
index 46ef9ea..29d5b65 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -451,12 +451,12 @@ char *lstrip(char *sptr) {
* @return truncated string
*/
char *strip(char *sptr) {
- size_t len = strlen(sptr);
+ size_t len = strlen(sptr) - 1;
if (len < 1) {
*sptr = '\0';
return sptr;
}
- for (size_t i = len - 1; ; i--) {
+ for (size_t i = len; ; i--) {
if (isspace(sptr[i]) || isblank(sptr[i])) {
sptr[i] = '\0';
}