commit ef0e4bb1432607e0e06379a134100052514e992a
parent 76236b8d9bdb5eb16fb32e725fd436349d21fcfa
Author: nibo <nibo@relim.de>
Date: Tue, 15 Jul 2025 15:53:05 +0200
Free memory in case of error in src/chord_diagram.c
Diffstat:
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/src/chord_diagram.c b/src/chord_diagram.c
@@ -346,10 +346,10 @@ string_diagram_copy_all_but_name(struct StringDiagram *diagram)
struct StringDiagram *copy = emalloc(sizeof(struct StringDiagram));
copy->base_fret = diagram->base_fret;
int i;
- for (i = 0; i<12; i++) {
+ for (i = 0; i<MAX_STRINGS; i++) {
copy->frets[i] = diagram->frets[i];
}
- for (i = 0; i<12; i++) {
+ for (i = 0; i<MAX_STRINGS; i++) {
copy->fingers[i] = diagram->fingers[i];
}
return copy;
@@ -383,7 +383,7 @@ static size_t
string_diagram_fret_count(struct StringDiagram *d)
{
int i;
- for (i = 0; d->frets[i] != -2 && i < 12; i++);
+ for (i = 0; d->frets[i] != -2 && i < MAX_STRINGS; i++);
return i;
}
@@ -587,6 +587,8 @@ chord_diagram_copy_all_but_name(struct ChordDiagram *diagram)
break;
default:
util_log(NULL, 0, LOG_ERR, "Invalid ChordDiagram type '%d'", diagram->type);
+ free(copy->color);
+ free(copy);
return NULL;
}
return copy;
@@ -733,7 +735,10 @@ chord_diagrams_create(
int d = 0;
size_t i;
char **names = NULL;
- char *chord_name, *parsed_chord_name, *common_chord_name;
+ char *chord_name = NULL;
+ char *common_chord_name = NULL;
+ char *parsed_chord_name;
+
switch (config->output->diagram->instrument) {
case INSTRUMENT_GUITAR:
for (c = *chords; *c; c++) {
@@ -741,10 +746,6 @@ chord_diagrams_create(
parsed_chord_name = (*c)->name;
common_chord_name = cho_chord_name_generate_common(*c, config);
chord_name = cho_chord_name_generate(*c);
- if (!common_chord_name) {
- LOG_DEBUG("cho_chord_name_generate_common failed.");
- return NULL;
- }
for (cd = custom_diagrams; *cd; cd++) {
if (
(*cd)->type == CHORD_DIAGRAM_CONTENT_STRING &&
@@ -757,7 +758,7 @@ chord_diagrams_create(
diagrams[d] = chord_diagram_copy_all_but_name(*cd);
if (!diagrams[d]) {
LOG_DEBUG("chord_diagram_copy_all_but_name failed.");
- return NULL;
+ goto ERR;
}
diagrams[d]->u.sd->name = strdup(chord_name);
d++;
@@ -779,9 +780,11 @@ chord_diagrams_create(
break;
}
}
- NEXT_CHORD: ;
+ NEXT_CHORD:
free(common_chord_name);
free(chord_name);
+ common_chord_name = NULL;
+ chord_name = NULL;
}
break;
case INSTRUMENT_KEYBOARD:
@@ -797,6 +800,15 @@ chord_diagrams_create(
diagrams[d] = NULL;
strs_free(names);
return diagrams;
+ ERR:
+ free(chord_name);
+ free(common_chord_name);
+ strs_free(names);
+ for (int k = 0; k<d; k++) {
+ chord_diagram_free(diagrams[k]);
+ }
+ free(diagrams);
+ return NULL;
}
bool