Skip to content

Commit 2c99124

Browse files
committed
Fixed various static leaks
1 parent 9d1c3a1 commit 2c99124

File tree

4 files changed

+83
-54
lines changed

4 files changed

+83
-54
lines changed

glsl_ext.c

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,21 @@ bool ext_parse_color(const char* str, size_t elem_sz, float** results) {
105105
return true;
106106
}
107107

108+
static void free_after(struct glsl_ext* ext, void* ptr) {
109+
++ext->destruct_sz;
110+
ext->destruct = realloc(ext->destruct, sizeof(void*) * ext->destruct_sz);
111+
ext->destruct[ext->destruct_sz - 1] = ptr;
112+
}
113+
114+
static void inherit(struct glsl_ext* parent, struct glsl_ext* child) {
115+
free_after(parent, child->processed);
116+
parent->destruct = realloc(parent->destruct, sizeof(void*) * (parent->destruct_sz + child->destruct_sz));
117+
memcpy(parent->destruct + parent->destruct_sz, child->destruct, sizeof(void*) * child->destruct_sz);
118+
parent->destruct_sz += child->destruct_sz;
119+
free(child->destruct);
120+
}
121+
108122
/* handle raw arguments for #include and #request directives */
109-
/* NOTE: munmap needs to be called on the result */
110123
static struct schar directive(struct glsl_ext* ext, char** args,
111124
size_t args_sz, bool include,
112125
size_t line, const char* f) {
@@ -144,21 +157,23 @@ static struct schar directive(struct glsl_ext* ext, char** args,
144157
}
145158

146159
struct glsl_ext next = {
147-
.source = map,
148-
.source_len = st.st_size,
149-
.cd = ext->cd,
150-
.cfd = ext->cfd,
151-
.handlers = ext->handlers
160+
.source = map,
161+
.source_len = st.st_size,
162+
.cd = ext->cd,
163+
.cfd = ext->cfd,
164+
.handlers = ext->handlers
152165
};
153166

154167
/* recursively process */
155168
ext_process(&next, target);
169+
inherit(ext, &next);
170+
munmap(map, st.st_size);
156171

157172
struct schar ret = {
158173
.buf = next.processed,
159174
.sz = next.p_len
160175
};
161-
176+
162177
return ret;
163178
} else {
164179

@@ -251,6 +266,9 @@ static struct schar directive(struct glsl_ext* ext, char** args,
251266
/* state machine parser */
252267
void ext_process(struct glsl_ext* ext, const char* f) {
253268

269+
ext->destruct = malloc(1);
270+
ext->destruct_sz = 0;
271+
254272
#define LINE_START 0
255273
#define GLSL 1
256274
#define MACRO 2
@@ -272,7 +290,7 @@ void ext_process(struct glsl_ext* ext, const char* f) {
272290
size_t line = 1;
273291
bool quoted = false, arg_start;
274292
char cbuf[9];
275-
char** args = NULL;
293+
char** args = malloc(sizeof(char*));
276294
size_t args_sz = 0;
277295

278296
bool prev_slash = false, comment = false, comment_line = false, prev_asterix = false,
@@ -418,7 +436,6 @@ void ext_process(struct glsl_ext* ext, const char* f) {
418436
{
419437
arg_start_idx = t + 1;
420438
arg_start = true;
421-
args = malloc(sizeof(char*));
422439
args_sz = 0;
423440
*args = NULL;
424441
}
@@ -468,7 +485,6 @@ void ext_process(struct glsl_ext* ext, const char* f) {
468485
n_append(&sbuf, r.sz, r.buf);
469486
append(&sbuf, "\n");
470487
}
471-
munmap(r.buf, r.sz);
472488
state = LINE_START;
473489
}
474490
break;
@@ -497,10 +513,20 @@ void ext_process(struct glsl_ext* ext, const char* f) {
497513
}
498514
ext->processed = sbuf.buf;
499515
ext->p_len = sbuf.at;
500-
501-
if (args)
516+
517+
if (args) {
518+
for (t = 0; t < args_sz; ++t) {
519+
free(args[t]);
520+
}
502521
free(args);
522+
}
503523
}
524+
504525
void ext_free(struct glsl_ext* ext) {
505526
free(ext->processed);
527+
size_t t;
528+
for (t = 0; t < ext->destruct_sz; ++t) {
529+
free(ext->destruct[t]);
530+
}
531+
free(ext->destruct);
506532
}

glsl_ext.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ struct request_handler {
2121
};
2222

2323
struct glsl_ext {
24-
char* processed; /* OUT: null terminated processed source */
25-
size_t p_len; /* OUT: length of processed buffer, excluding null char */
26-
const char* source; /* IN: raw data passed via ext_process */
27-
size_t source_len; /* IN: raw source len */
28-
const char* cd; /* IN: current directory */
29-
const char* cfd; /* IN: config directory, if NULL it is assumed to cd */
24+
char* processed; /* OUT: null terminated processed source */
25+
size_t p_len; /* OUT: length of processed buffer, excluding null char */
26+
const char* source; /* IN: raw data passed via ext_process */
27+
size_t source_len; /* IN: raw source len */
28+
const char* cd; /* IN: current directory */
29+
const char* cfd; /* IN: config directory, if NULL it is assumed to cd */
30+
void** destruct; /* internal */
31+
size_t destruct_sz; /* internal */
3032

3133
/* IN: NULL (where the last element's 'name' member is NULL) terminated
3234
array of request handlers */

glx_wcb.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ static void apply_clickthrough(struct glxwin* w) {
267267
}
268268
}
269269

270-
static void* process_events(struct glxwin* w) {
270+
static void process_events(struct glxwin* w) {
271271
while (XPending(display) > 0) {
272272
XEvent ev;
273273
XNextEvent(display, &ev);
@@ -566,6 +566,7 @@ static void destroy(struct glxwin* w) {
566566
glXMakeCurrent(display, None, NULL); /* release context */
567567
glXDestroyContext(display, w->context);
568568
XDestroyWindow(display, w->w);
569+
free(w);
569570
}
570571

571572
static void terminate(void) {

render.c

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ struct gl_sampler_data {
6969
size_t sz;
7070
};
7171

72+
/* per-bind data containing the framebuffer and 1D texture to render for smoothing. */
73+
74+
struct sm_fb {
75+
GLuint fbo, tex;
76+
};
77+
7278
/* GLSL uniform bind */
7379

7480
struct gl_bind {
@@ -78,7 +84,7 @@ struct gl_bind {
7884
int src_type;
7985
void (**transformations)(struct gl_data*, void**, void* data);
8086
size_t t_sz;
81-
void* udata;
87+
struct sm_fb sm;
8288
};
8389

8490
/* GL screen framebuffer object */
@@ -112,6 +118,7 @@ struct gl_data {
112118
copy_desktop, smooth_pass, premultiply_alpha, check_fullscreen,
113119
clickthrough;
114120
void** t_data;
121+
size_t t_count;
115122
float gravity_step, target_spu, fr, ur, smooth_distance, smooth_ratio,
116123
smooth_factor, fft_scale, fft_cutoff;
117124
struct {
@@ -465,10 +472,9 @@ static struct gl_bind_src bind_sources[] = {
465472
};
466473

467474
#define window(t, sz) (0.53836 - (0.46164 * cos(TWOPI * (double) t / (double)(sz - 1))))
468-
#define ALLOC_ONCE(u, udata, ...) \
475+
#define ALLOC_ONCE(u, udata, sz) \
469476
if (*udata == NULL) { \
470-
u = malloc(sizeof(*u)); \
471-
*u = (typeof(*u)) __VA_ARGS__; \
477+
u = calloc(sz, sizeof(typeof(*u))); \
472478
*udata = u; \
473479
} else u = (typeof(u)) *udata;
474480

@@ -529,18 +535,16 @@ void transform_gravity(struct gl_data* d, void** udata, void* data) {
529535
float* b = s->buf;
530536
size_t sz = s->sz, t;
531537

532-
struct {
533-
float* applied;
534-
}* u;
535-
ALLOC_ONCE(u, udata, { .applied = calloc(sz, sizeof(float)) });
538+
float* applied;
539+
ALLOC_ONCE(applied, udata, sz);
536540

537541
float g = d->gravity_step * (1.0F / d->ur);
538542

539543
for (t = 0; t < sz; ++t) {
540-
if (b[t] >= u->applied[t]) {
541-
u->applied[t] = b[t] - g;
542-
} else u->applied[t] -= g;
543-
b[t] = u->applied[t];
544+
if (b[t] >= applied[t]) {
545+
applied[t] = b[t] - g;
546+
} else applied[t] -= g;
547+
b[t] = applied[t];
544548
}
545549
}
546550

@@ -553,20 +557,18 @@ void transform_average(struct gl_data* d, void** udata, void* data) {
553557
float v;
554558
bool use_window = d->avg_window;
555559

556-
struct {
557-
float* bufs;
558-
}* u;
559-
ALLOC_ONCE(u, udata, { .bufs = calloc(tsz, sizeof(float)) });
560+
float* bufs;
561+
ALLOC_ONCE(bufs, udata, tsz);
560562

561-
memmove(u->bufs, &u->bufs[sz], (tsz - sz) * sizeof(float));
562-
memcpy(&u->bufs[tsz - sz], b, sz * sizeof(float));
563+
memmove(bufs, &bufs[sz], (tsz - sz) * sizeof(float));
564+
memcpy(&bufs[tsz - sz], b, sz * sizeof(float));
563565

564566
#define DO_AVG(w) \
565567
do { \
566568
for (t = 0; t < sz; ++t) { \
567569
v = 0.0F; \
568570
for (f = 0; f < d->avg_frames; ++f) { \
569-
v += w * u->bufs[(f * sz) + t]; \
571+
v += w * bufs[(f * sz) + t]; \
570572
} \
571573
b[t] = v / d->avg_frames; \
572574
} \
@@ -1038,7 +1040,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
10381040
.src_type = src->src_type,
10391041
.transformations = malloc(1),
10401042
.t_sz = 0,
1041-
.udata = NULL
1043+
.sm = {}
10421044
};
10431045
})
10441046
},
@@ -1091,6 +1093,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
10911093
};
10921094

10931095
ext_process(&ext, se_buf);
1096+
ext_free(&ext);
10941097

10951098
munmap((void*) map, st.st_size);
10961099

@@ -1122,6 +1125,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
11221125

11231126
loading_presets = true;
11241127
ext_process(&ext, se_buf);
1128+
ext_free(&ext);
11251129
loading_presets = false;
11261130

11271131
munmap((void*) map, st.st_size);
@@ -1319,7 +1323,8 @@ struct renderer* rd_new(const char** paths, const char* entry,
13191323
}
13201324

13211325
{
1322-
gl->t_data = malloc(sizeof(void*) * t_count);
1326+
gl->t_data = malloc(sizeof(void*) * t_count);
1327+
gl->t_count = t_count;
13231328
size_t t;
13241329
for (t = 0; t < t_count; ++t) {
13251330
gl->t_data[t] = NULL;
@@ -1544,20 +1549,10 @@ bool rd_update(struct renderer* r, float* lb, float* rb, size_t bsz, bool modifi
15441549
setup = true;
15451550
}
15461551

1547-
/* Per-bind data containing the framebuffer and 1D texture to render to for
1548-
this smoothing step. */
1549-
1550-
struct sm_fb {
1551-
GLuint fbo, tex;
1552-
};
1553-
15541552
/* Allocate and setup our per-bind data, if needed */
15551553

1556-
struct sm_fb* sm;
1557-
if (!bind->udata) {
1558-
sm = malloc(sizeof(struct sm_fb));
1559-
bind->udata = sm;
1560-
1554+
struct sm_fb* sm = &bind->sm;
1555+
if (sm->tex == 0) {
15611556
glGenTextures(1, &sm->tex);
15621557
glGenFramebuffers(1, &sm->fbo);
15631558

@@ -1582,7 +1577,6 @@ bool rd_update(struct renderer* r, float* lb, float* rb, size_t bsz, bool modifi
15821577
}
15831578
} else {
15841579
/* Just bind our data if it was already allocated and setup */
1585-
sm = (struct sm_fb*) bind->udata;
15861580
glBindFramebuffer(GL_FRAMEBUFFER, sm->fbo);
15871581
glBindTexture(GL_TEXTURE_1D, sm->tex);
15881582
}
@@ -1716,8 +1710,14 @@ struct gl_wcb* rd_get_wcb (struct renderer* r) { return r->gl->wcb; }
17161710
void rd_destroy(struct renderer* r) {
17171711
r->gl->wcb->destroy(r->gl->w);
17181712
if (r->gl->interpolate) free(r->gl->interpolate_buf[0]);
1719-
if (r->gl->t_data) free(r->gl->t_data);
17201713
size_t t, b;
1714+
if (r->gl->t_data) {
1715+
for (t = 0; t < r->gl->t_count; ++t) {
1716+
if (r->gl->t_data[t])
1717+
free(r->gl->t_data[t]);
1718+
}
1719+
free(r->gl->t_data);
1720+
}
17211721
for (t = 0; t < r->gl->stages_sz; ++t) {
17221722
struct gl_sfbo* stage = &r->gl->stages[t];
17231723
for (b = 0; b < stage->binds_sz; ++b) {

0 commit comments

Comments
 (0)