Download raw body.
gotd protected references
here's the diff to free the strings in all code paths. While here, I've noticed that there are a few other places where we forgot to free the STRING so fix them as well. There's a subtle difference between our functions: conf_new_access_rule saves the pointer internally so we only free() in the other code-path, the new conf_protect_* instead ends up building their own strings and so the caller has to free them. diff /home/op/w/gotacl commit - 919fc1f4bb6c929dbeaf76d0d29352102022f189 path + /home/op/w/gotacl blob - 44801b6de7df40ed4df2acd8f523a9ccabe7170b file + gotd/parse.y --- gotd/parse.y +++ gotd/parse.y @@ -249,36 +249,38 @@ protectflags : TAG NAMESPACE STRING { protectflags : TAG NAMESPACE STRING { if (gotd_proc_id == PROC_GOTD || gotd_proc_id == PROC_REPO_WRITE) { if (conf_protect_tag_namespace(new_repo, $3)) { free($3); YYERROR; } } + free($3); } | BRANCH NAMESPACE STRING { if (gotd_proc_id == PROC_GOTD || gotd_proc_id == PROC_REPO_WRITE) { if (conf_protect_branch_namespace(new_repo, $3)) { free($3); YYERROR; } - free($3); } + free($3); } | BRANCH STRING { if (gotd_proc_id == PROC_GOTD || gotd_proc_id == PROC_REPO_WRITE) { if (conf_protect_branch(new_repo, $2)) { free($2); YYERROR; } } + free($2); } ; repository : REPOSITORY STRING { struct gotd_repo *repo; TAILQ_FOREACH(repo, &gotd->repos, entry) { if (strcmp(repo->name, $2) == 0) { @@ -315,30 +317,33 @@ repoopts1 : PATH STRING { } } free($2); } | PERMIT RO STRING { if (gotd_proc_id == PROC_AUTH) { conf_new_access_rule(new_repo, GOTD_ACCESS_PERMITTED, GOTD_AUTH_READ, $3); - } + } else + free($3); } | PERMIT RW STRING { if (gotd_proc_id == PROC_AUTH) { conf_new_access_rule(new_repo, GOTD_ACCESS_PERMITTED, GOTD_AUTH_READ | GOTD_AUTH_WRITE, $3); - } + } else + free($3); } | DENY STRING { if (gotd_proc_id == PROC_AUTH) { conf_new_access_rule(new_repo, GOTD_ACCESS_DENIED, 0, $2); - } + } else + free($2); } | protect ; repoopts2 : repoopts2 repoopts1 nl | repoopts1 optnl ;
gotd protected references