Skip to content

Commit ce1bb84

Browse files
committed
testsuite: reshuffle preload env. variable handling
Get the existing LD_PRELOAD early and do a two pass on the rest. Effectively calculate the total length, allocate and copy... Instead of the existing recalc, realloc, copy. Fewer allocations (failure points), while also being a bit simpler and shorter code. v2: - append existing ldpreload v3: - revert to prepending, do so only as needed Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
1 parent 53517e3 commit ce1bb84

1 file changed

Lines changed: 32 additions & 35 deletions

File tree

testsuite/testsuite.c

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -168,55 +168,52 @@ int test_spawn_prog(const char *prog, const char *const args[])
168168

169169
static void test_export_environ(const struct test *t)
170170
{
171-
_cleanup_free_ char *preload = NULL;
172-
size_t preloadlen = 0;
173-
size_t i;
171+
const char *existing_preload = getenv("LD_PRELOAD");
172+
size_t existing_preload_len = existing_preload ? strlen(existing_preload) : 0;
173+
size_t total_len = existing_preload_len;
174174
const struct keyval *env;
175+
size_t i;
175176

176177
for (i = 0; i < _TC_LAST; i++) {
177-
const char *ldpreload;
178-
size_t ldpreloadlen;
179-
char *tmp;
180-
181178
if (t->config[i] == NULL)
182179
continue;
183180

184-
ldpreload = env_config[i].ldpreload;
185-
ldpreloadlen = strlen(ldpreload);
186-
tmp = realloc(preload, preloadlen + 2 + ldpreloadlen);
187-
if (tmp == NULL) {
181+
/* Don't worry if we overallocate one strlen(" ") too many. */
182+
total_len += strlen(" ") + strlen(env_config[i].ldpreload);
183+
}
184+
185+
/* Do nothing, if we have no local ldpreload. */
186+
if (total_len && total_len != existing_preload_len) {
187+
char *preload;
188+
size_t len = 0;
189+
190+
preload = malloc(total_len + sizeof(char));
191+
if (preload == NULL) {
188192
ERR("oom: test_export_environ()\n");
189193
return;
190194
}
191-
preload = tmp;
192195

193-
if (preloadlen > 0)
194-
preload[preloadlen++] = ' ';
195-
memcpy(preload + preloadlen, ldpreload, ldpreloadlen);
196-
preloadlen += ldpreloadlen;
197-
preload[preloadlen] = '\0';
198-
}
196+
memcpy(preload, existing_preload, existing_preload_len);
197+
len += existing_preload_len;
199198

200-
if (preload != NULL) {
201-
const char *existing_preload = getenv("LD_PRELOAD");
202-
if (existing_preload) {
203-
char *tmp;
204-
size_t len = strlen(existing_preload);
199+
for (i = 0; i < _TC_LAST; i++) {
200+
const char *ldpreload;
201+
size_t ldpreloadlen;
205202

206-
tmp = malloc(preloadlen + 2 + len);
207-
if (tmp == NULL) {
208-
ERR("oom: test_export_environ()\n");
209-
return;
210-
}
211-
memcpy(tmp, existing_preload, len);
212-
tmp[len++] = ' ';
213-
memcpy(tmp + len, preload, preloadlen);
214-
preloadlen += len;
215-
tmp[preloadlen] = '\0';
216-
free(preload);
217-
preload = tmp;
203+
if (t->config[i] == NULL)
204+
continue;
205+
206+
ldpreload = env_config[i].ldpreload;
207+
ldpreloadlen = strlen(ldpreload);
208+
209+
preload[len++] = ' ';
210+
memcpy(preload + len, ldpreload, ldpreloadlen);
211+
len += ldpreloadlen;
218212
}
213+
preload[len] = '\0';
214+
219215
setenv("LD_PRELOAD", preload, 1);
216+
free(preload);
220217
}
221218

222219
for (i = 0; i < _TC_LAST; i++) {

0 commit comments

Comments
 (0)