if (!p->sslContext) {
debugs(3, DBG_CRITICAL, "ERROR: Could not initialize cache_peer " << p->name << " TLS context");
self_destruct();
+ return;
}
}
}
Config.redirectChildren.concurrency = cval;
}
- if (!strcmp(name, "log_access"))
+ if (!strcmp(name, "log_access")) {
self_destruct();
+ return;
+ }
- if (!strcmp(name, "log_icap"))
+ if (!strcmp(name, "log_icap")) {
self_destruct();
+ return;
+ }
if (!strcmp(name, "ignore_ims_on_miss")) {
// the replacement directive cache_revalidate_on_miss has opposite meanings for ON/OFF value
else {
debugs(3, DBG_CRITICAL, "ERROR: unknown directive: " << name);
self_destruct();
+ return;
}
// add the value as unquoted-string because the old values did not support whitespace
static void
parseTimeLine(time_msec_t * tptr, const char *units, bool allowMsec, bool expectMoreArguments = false)
{
- time_msec_t u;
- if ((u = parseTimeUnits(units, allowMsec)) == 0)
+ time_msec_t u = parseTimeUnits(units, allowMsec);
+ if (u == 0) {
self_destruct();
+ return;
+ }
- char *token;
- if ((token = ConfigParser::NextToken()) == NULL)
+ char *token = ConfigParser::NextToken();;
+ if (!token) {
self_destruct();
+ return;
+ }
double d = xatof(token);
} else if (!expectMoreArguments) {
self_destruct();
+ return;
} else {
token = NULL; // show default units if dying below
static void
parse_authparam(Auth::ConfigVector * config)
{
- char *type_str;
- char *param_str;
-
- if ((type_str = ConfigParser::NextToken()) == NULL)
+ char *type_str = ConfigParser::NextToken();
+ if (!type_str) {
self_destruct();
+ return;
+ }
- if ((param_str = ConfigParser::NextToken()) == NULL)
+ char *param_str = ConfigParser::NextToken();
+ if (!param_str) {
self_destruct();
+ return;
+ }
/* find a configuration for the scheme in the currently parsed configs... */
Auth::Config *schemeCfg = Auth::Config::Find(type_str);
if (theScheme == NULL) {
debugs(3, DBG_CRITICAL, "Parsing Config File: Unknown authentication scheme '" << type_str << "'.");
self_destruct();
+ return;
}
config->push_back(theScheme->createConfig());
if (schemeCfg == NULL) {
debugs(3, DBG_CRITICAL, "Parsing Config File: Corruption configuring authentication scheme '" << type_str << "'.");
self_destruct();
+ return;
}
}
static void
parse_cachedir(Store::DiskConfig *swap)
{
- char *type_str;
- char *path_str;
- RefCount<SwapDir> sd;
- int i;
- int fs;
-
- if ((type_str = ConfigParser::NextToken()) == NULL)
+ char *type_str = ConfigParser::NextToken();
+ if (!type_str) {
self_destruct();
+ return;
+ }
- if ((path_str = ConfigParser::NextToken()) == NULL)
+ char *path_str = ConfigParser::NextToken();
+ if (!path_str) {
self_destruct();
+ return;
+ }
- fs = find_fstype(type_str);
-
+ int fs = find_fstype(type_str);
if (fs < 0) {
debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "ERROR: This proxy does not support the '" << type_str << "' cache type. Ignoring.");
return;
/* reconfigure existing dir */
- for (i = 0; i < swap->n_configured; ++i) {
+ RefCount<SwapDir> sd;
+ for (int i = 0; i < swap->n_configured; ++i) {
assert (swap->swapDirs[i].getRaw());
if ((strcasecmp(path_str, dynamic_cast<SwapDir *>(swap->swapDirs[i].getRaw())->path)) == 0) {
static void
parse_peer(CachePeer ** head)
{
- char *token = NULL;
- CachePeer *p = new CachePeer;
-
- if ((token = ConfigParser::NextToken()) == NULL)
+ char *host_str = ConfigParser::NextToken();
+ if (!host_str) {
self_destruct();
+ return;
+ }
- p->host = xstrdup(token);
-
- p->name = xstrdup(token);
-
- if ((token = ConfigParser::NextToken()) == NULL)
+ char *token = ConfigParser::NextToken();
+ if (!token) {
self_destruct();
+ return;
+ }
+ CachePeer *p = new CachePeer;
+ p->host = xstrdup(host_str);
+ p->name = xstrdup(host_str);
p->type = parseNeighborType(token);
if (p->type == PEER_MULTICAST) {
p->http_port = GetTcpService();
- if (!p->http_port)
+ if (!p->http_port) {
+ delete p;
self_destruct();
+ return;
+ }
p->icp.port = GetUdpService();
static void
parse_peer_access(void)
{
- char *host = NULL;
- CachePeer *p;
-
- if (!(host = ConfigParser::NextToken()))
+ char *host = ConfigParser::NextToken();
+ if (!host) {
self_destruct();
+ return;
+ }
- if ((p = peerFindByName(host)) == NULL) {
+ CachePeer *p = peerFindByName(host);
+ if (!p) {
debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'");
return;
}
static void
parse_hostdomaintype(void)
{
- char *host = NULL;
- char *type = NULL;
- char *domain = NULL;
-
- if (!(host = ConfigParser::NextToken()))
+ char *host = ConfigParser::NextToken();
+ if (!host) {
self_destruct();
+ return;
+ }
- if (!(type = ConfigParser::NextToken()))
+ char *type = ConfigParser::NextToken();
+ if (!type) {
self_destruct();
+ return;
+ }
+ char *domain = nullptr;
while ((domain = ConfigParser::NextToken())) {
- NeighborTypeDomainList *l = NULL;
- NeighborTypeDomainList **L = NULL;
- CachePeer *p;
-
- if ((p = peerFindByName(host)) == NULL) {
+ CachePeer *p = peerFindByName(host);
+ if (!p) {
debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'");
return;
}
- l = static_cast<NeighborTypeDomainList *>(xcalloc(1, sizeof(NeighborTypeDomainList)));
+ auto *l = static_cast<NeighborTypeDomainList *>(xcalloc(1, sizeof(NeighborTypeDomainList)));
l->type = parseNeighborType(type);
l->domain = xstrdup(domain);
+ NeighborTypeDomainList **L = nullptr;
for (L = &(p->typelist); *L; L = &((*L)->next));
*L = l;
}
parse_onoff(int *var)
{
char *token = ConfigParser::NextToken();
-
- if (token == NULL)
+ if (!token) {
self_destruct();
+ return;
+ }
if (!strcmp(token, "on")) {
*var = 1;
parse_tristate(int *var)
{
char *token = ConfigParser::NextToken();
-
- if (token == NULL)
+ if (!token) {
self_destruct();
+ return;
+ }
if (!strcmp(token, "on")) {
*var = 1;
parse_pipelinePrefetch(int *var)
{
char *token = ConfigParser::PeekAtToken();
-
- if (token == NULL)
+ if (!token) {
self_destruct();
+ return;
+ }
if (!strcmp(token, "on")) {
debugs(0, DBG_PARSE_NOTE(DBG_IMPORTANT), "WARNING: 'pipeline_prefetch on' is deprecated. Please update to use 1 (or a higher number).");
static void
parse_string(char **var)
{
- char *token = ConfigParser::NextToken();
safe_free(*var);
- if (token == NULL)
+ char *token = ConfigParser::NextToken();
+ if (!token) {
self_destruct();
+ return;
+ }
*var = xstrdup(token);
}
static void
parse_TokenOrQuotedString(char **var)
{
- char *token = ConfigParser::NextQuotedToken();
safe_free(*var);
- if (token == NULL)
+ char *token = ConfigParser::NextQuotedToken();
+ if (!token){
self_destruct();
+ return;
+ }
*var = xstrdup(token);
}
parse_uri_whitespace(int *var)
{
char *token = ConfigParser::NextToken();
-
- if (token == NULL)
+ if (!token) {
self_destruct();
+ return;
+ }
if (!strcmp(token, "strip"))
*var = URI_WHITESPACE_STRIP;
parse_memcachemode(SquidConfig *)
{
char *token = ConfigParser::NextToken();
- if (!token)
+ if (!token) {
self_destruct();
+ return;
+ }
if (strcmp(token, "always") == 0) {
Config.onoff.memory_cache_first = 1;
s->s = ipa;
*head = s;
- } else
+ } else {
self_destruct();
+ return;
+ }
}
}
if (!t) {
debugs(3, DBG_CRITICAL, "FATAL: " << portType << "_port: missing ']' on IPv6 address: " << token);
self_destruct();
+ return;
}
*t = '\0';
++t;
if (*t != ':') {
debugs(3, DBG_CRITICAL, "FATAL: " << portType << "_port: missing Port in: " << token);
self_destruct();
+ return;
}
if (!Ip::EnableIpv6) {
debugs(3, DBG_CRITICAL, "FATAL: " << portType << "_port: IPv6 is not available.");
self_destruct();
+ return;
}
port = xatos(t + 1);
} else if ((t = strchr(token, ':'))) {
} else {
debugs(3, DBG_CRITICAL, "FATAL: " << portType << "_port: missing Port: " << token);
self_destruct();
+ return;
}
if (port == 0 && host != NULL) {
debugs(3, DBG_CRITICAL, "FATAL: " << portType << "_port: Port cannot be 0: " << token);
self_destruct();
+ return;
}
if (NULL == host) {
if (s->flags.isIntercepted()) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": Accelerator mode requires its own port. It cannot be shared with other modes.");
self_destruct();
+ return;
}
s->flags.accelSurrogate = true;
s->vhost = true;
if (s->flags.accelSurrogate || s->flags.tproxyIntercept) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": Intercept mode requires its own interception port. It cannot be shared with other modes.");
self_destruct();
+ return;
}
s->flags.natIntercept = true;
Ip::Interceptor.StartInterception();
if (s->flags.natIntercept || s->flags.accelSurrogate) {
debugs(3,DBG_CRITICAL, "FATAL: " << cfg_directive << ": TPROXY option requires its own interception port. It cannot be shared with other modes.");
self_destruct();
+ return;
}
s->flags.tproxyIntercept = true;
Ip::Interceptor.StartTransparency();
if (!Ip::Interceptor.ProbeForTproxy(s->s)) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": TPROXY support in the system does not work.");
self_destruct();
+ return;
}
} else if (strcmp(token, "require-proxy-header") == 0) {
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": defaultsite option requires Acceleration mode flag.");
self_destruct();
+ return;
}
safe_free(s->defaultsite);
s->defaultsite = xstrdup(token + 12);
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": vport option requires Acceleration mode flag.");
self_destruct();
+ return;
}
s->vport = -1;
} else if (strncmp(token, "vport=", 6) == 0) {
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": vport option requires Acceleration mode flag.");
self_destruct();
+ return;
}
s->vport = xatos(token + 6);
} else if (strncmp(token, "protocol=", 9) == 0) {
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": protocol option requires Acceleration mode flag.");
self_destruct();
+ return;
}
s->transport = parsePortProtocol(ToUpper(SBuf(token + 9)));
} else if (strcmp(token, "allow-direct") == 0) {
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": allow-direct option requires Acceleration mode flag.");
self_destruct();
+ return;
}
s->allow_direct = true;
} else if (strcmp(token, "act-as-origin") == 0) {
if (!s->flags.accelSurrogate) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": ignore-cc option requires Acceleration mode flag.");
self_destruct();
+ return;
}
#endif
s->ignore_cc = true;
s->disable_pmtu_discovery = DISABLE_PMTU_TRANSPARENT;
else if (!strcmp(token + 23, "always"))
s->disable_pmtu_discovery = DISABLE_PMTU_ALWAYS;
- else
+ else {
self_destruct();
+ return;
+ }
} else if (strcmp(token, "ipv4") == 0) {
if ( !s->s.setIPv4() ) {
debugs(3, DBG_CRITICAL, "FATAL: " << cfg_directive << ": IPv6 addresses cannot be used as IPv4-Only. " << s->s );
self_destruct();
+ return;
}
} else if (strcmp(token, "tcpkeepalive") == 0) {
s->tcp_keepalive.enabled = true;
if (s->flags.tunnelSslBumping && !hijacked) {
debugs(3, DBG_CRITICAL, "FATAL: ssl-bump on https_port requires tproxy/intercept which is missing.");
self_destruct();
+ return;
}
if (hijacked && !s->flags.tunnelSslBumping) {
debugs(3, DBG_CRITICAL, "FATAL: tproxy/intercept on https_port requires ssl-bump which is missing.");
self_destruct();
+ return;
}
#endif
if (s->flags.proxySurrogate) {
debugs(3,DBG_CRITICAL, "FATAL: https_port: require-proxy-header option is not supported on HTTPS ports.");
self_destruct();
+ return;
}
} else if (protoName.cmp("FTP") == 0) {
/* ftp_port does not support ssl-bump */
if (s->flags.tunnelSslBumping) {
debugs(3, DBG_CRITICAL, "FATAL: ssl-bump is not supported for ftp_port.");
self_destruct();
+ return;
}
if (s->flags.proxySurrogate) {
// Passive FTP data channel does not work without deep protocol inspection in the frontend.
debugs(3,DBG_CRITICAL, "FATAL: require-proxy-header option is not supported on ftp_port.");
self_destruct();
+ return;
}
}
debugs(3, DBG_CRITICAL, "FATAL: Squid built with no CPU affinity " <<
"support, do not set 'cpu_affinity_map'");
self_destruct();
-#endif /* HAVE_CPU_AFFINITY */
+#else /* HAVE_CPU_AFFINITY */
if (!*cpuAffinityMap)
*cpuAffinityMap = new CpuAffinityMap;
"contain numbers <= 0");
self_destruct();
}
+#endif
}
static void
if (strcmp(token,"in") != 0) {
debugs(3, DBG_CRITICAL, "expecting 'in' on'" << config_input_line << "'");
self_destruct();
+ return;
}
if ((token = ConfigParser::NextToken()) == NULL) {
self_destruct();
+ return;
}
d = static_cast<time_t> (xatoi(token));
else if ((token = ConfigParser::NextToken()) == NULL) {
debugs(3, DBG_CRITICAL, "No time-units on '" << config_input_line << "'");
self_destruct();
- } else if ((m = parseTimeUnits(token, false)) == 0)
+ return;
+ } else if ((m = parseTimeUnits(token, false)) == 0) {
self_destruct();
+ return;
+ }
cfg->oldest_service_failure = (m * d);
}
} else {
debugs(3, DBG_CRITICAL, "FATAL: unsuported \"on_timeout\" action:" << value);
self_destruct();
+ return;
}
} else if (strcasecmp(key, "response") == 0) {
config->response = xstrdup(value);
} else {
debugs(3, DBG_CRITICAL, "FATAL: unsuported option " << key);
self_destruct();
+ return;
}
}