ffserver_config: improve error handling
Replace atoi with more advanced parsing routine. Set maximum port value to 65535 (not 65536). Other checks. Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
This commit is contained in:
parent
63e62cfbe2
commit
2121e3e130
@ -411,9 +411,7 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
|||||||
if (!av_strcasecmp(cmd, "Port"))
|
if (!av_strcasecmp(cmd, "Port"))
|
||||||
WARNING("Port option is deprecated, use HTTPPort instead\n");
|
WARNING("Port option is deprecated, use HTTPPort instead\n");
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
val = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid port: %s\n", arg);
|
||||||
if (val < 1 || val > 65536)
|
|
||||||
ERROR("Invalid port: %s\n", arg);
|
|
||||||
if (val < 1024)
|
if (val < 1024)
|
||||||
WARNING("Trying to use IETF assigned system port: %d\n", val);
|
WARNING("Trying to use IETF assigned system port: %d\n", val);
|
||||||
config->http_addr.sin_port = htons(val);
|
config->http_addr.sin_port = htons(val);
|
||||||
@ -422,37 +420,38 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
|||||||
WARNING("BindAddress option is deprecated, use HTTPBindAddress instead\n");
|
WARNING("BindAddress option is deprecated, use HTTPBindAddress instead\n");
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
if (resolve_host(&config->http_addr.sin_addr, arg) != 0)
|
if (resolve_host(&config->http_addr.sin_addr, arg) != 0)
|
||||||
ERROR("%s:%d: Invalid host/IP address: %s\n", arg);
|
ERROR("Invalid host/IP address: %s\n", arg);
|
||||||
} else if (!av_strcasecmp(cmd, "NoDaemon")) {
|
} else if (!av_strcasecmp(cmd, "NoDaemon")) {
|
||||||
WARNING("NoDaemon option has no effect, you should remove it\n");
|
WARNING("NoDaemon option has no effect, you should remove it\n");
|
||||||
} else if (!av_strcasecmp(cmd, "RTSPPort")) {
|
} else if (!av_strcasecmp(cmd, "RTSPPort")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
val = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid port: %s\n", arg);
|
||||||
if (val < 1 || val > 65536)
|
config->rtsp_addr.sin_port = htons(val);
|
||||||
ERROR("%s:%d: Invalid port: %s\n", arg);
|
|
||||||
config->rtsp_addr.sin_port = htons(atoi(arg));
|
|
||||||
} else if (!av_strcasecmp(cmd, "RTSPBindAddress")) {
|
} else if (!av_strcasecmp(cmd, "RTSPBindAddress")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
if (resolve_host(&config->rtsp_addr.sin_addr, arg) != 0)
|
if (resolve_host(&config->rtsp_addr.sin_addr, arg) != 0)
|
||||||
ERROR("Invalid host/IP address: %s\n", arg);
|
ERROR("Invalid host/IP address: %s\n", arg);
|
||||||
} else if (!av_strcasecmp(cmd, "MaxHTTPConnections")) {
|
} else if (!av_strcasecmp(cmd, "MaxHTTPConnections")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
val = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid MaxHTTPConnections: %s\n", arg);
|
||||||
if (val < 1 || val > 65536)
|
|
||||||
ERROR("Invalid MaxHTTPConnections: %s\n", arg);
|
|
||||||
config->nb_max_http_connections = val;
|
config->nb_max_http_connections = val;
|
||||||
|
if (config->nb_max_connections > config->nb_max_http_connections)
|
||||||
|
ERROR("Inconsistent configuration: MaxClients(%d) > MaxHTTPConnections(%d)\n",
|
||||||
|
config->nb_max_connections, config->nb_max_http_connections);
|
||||||
} else if (!av_strcasecmp(cmd, "MaxClients")) {
|
} else if (!av_strcasecmp(cmd, "MaxClients")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
val = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid MaxClients: %s\n", arg);
|
||||||
if (val < 1 || val > config->nb_max_http_connections)
|
config->nb_max_connections = val;
|
||||||
ERROR("Invalid MaxClients: %s\n", arg);
|
if (config->nb_max_connections > config->nb_max_http_connections)
|
||||||
else
|
ERROR("Inconsistent configuration: MaxClients(%d) > MaxHTTPConnections(%d)\n",
|
||||||
config->nb_max_connections = val;
|
config->nb_max_connections, config->nb_max_http_connections);
|
||||||
} else if (!av_strcasecmp(cmd, "MaxBandwidth")) {
|
} else if (!av_strcasecmp(cmd, "MaxBandwidth")) {
|
||||||
int64_t llval;
|
int64_t llval;
|
||||||
|
char *tailp;
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
llval = strtoll(arg, NULL, 10);
|
errno = 0;
|
||||||
if (llval < 10 || llval > 10000000)
|
llval = strtoll(arg, &tailp, 10);
|
||||||
|
if (llval < 10 || llval > 10000000 || tailp[0] || errno)
|
||||||
ERROR("Invalid MaxBandwidth: %s\n", arg);
|
ERROR("Invalid MaxBandwidth: %s\n", arg);
|
||||||
else
|
else
|
||||||
config->max_bandwidth = llval;
|
config->max_bandwidth = llval;
|
||||||
@ -460,7 +459,7 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
|||||||
if (!config->debug)
|
if (!config->debug)
|
||||||
ffserver_get_arg(config->logfilename, sizeof(config->logfilename), p);
|
ffserver_get_arg(config->logfilename, sizeof(config->logfilename), p);
|
||||||
} else if (!av_strcasecmp(cmd, "LoadModule")) {
|
} else if (!av_strcasecmp(cmd, "LoadModule")) {
|
||||||
ERROR("Loadable modules no longer supported\n");
|
ERROR("Loadable modules are no longer supported\n");
|
||||||
} else
|
} else
|
||||||
ERROR("Incorrect keyword: '%s'\n", cmd);
|
ERROR("Incorrect keyword: '%s'\n", cmd);
|
||||||
return 0;
|
return 0;
|
||||||
@ -555,6 +554,9 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c
|
|||||||
case 'G':
|
case 'G':
|
||||||
fsize *= 1024 * 1024 * 1024;
|
fsize *= 1024 * 1024 * 1024;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ERROR("Invalid file size: %s\n", arg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
feed->feed_max_size = (int64_t)fsize;
|
feed->feed_max_size = (int64_t)fsize;
|
||||||
if (feed->feed_max_size < FFM_PACKET_SIZE*4)
|
if (feed->feed_max_size < FFM_PACKET_SIZE*4)
|
||||||
@ -656,6 +658,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
|||||||
{
|
{
|
||||||
char arg[1024], arg2[1024];
|
char arg[1024], arg2[1024];
|
||||||
FFServerStream *stream;
|
FFServerStream *stream;
|
||||||
|
int val;
|
||||||
|
|
||||||
av_assert0(pstream);
|
av_assert0(pstream);
|
||||||
stream = *pstream;
|
stream = *pstream;
|
||||||
@ -948,10 +951,12 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
|||||||
stream->loop = 1; /* default is looping */
|
stream->loop = 1; /* default is looping */
|
||||||
} else if (!av_strcasecmp(cmd, "MulticastPort")) {
|
} else if (!av_strcasecmp(cmd, "MulticastPort")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
stream->multicast_port = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, 1, 65535, config, line_num, "Invalid MulticastPort: %s\n", arg);
|
||||||
|
stream->multicast_port = val;
|
||||||
} else if (!av_strcasecmp(cmd, "MulticastTTL")) {
|
} else if (!av_strcasecmp(cmd, "MulticastTTL")) {
|
||||||
ffserver_get_arg(arg, sizeof(arg), p);
|
ffserver_get_arg(arg, sizeof(arg), p);
|
||||||
stream->multicast_ttl = atoi(arg);
|
ffserver_set_int_param(&val, arg, 0, INT_MIN, INT_MAX, config, line_num, "Invalid MulticastTTL: %s\n", arg);
|
||||||
|
stream->multicast_ttl = val;
|
||||||
} else if (!av_strcasecmp(cmd, "NoLoop")) {
|
} else if (!av_strcasecmp(cmd, "NoLoop")) {
|
||||||
stream->loop = 0;
|
stream->loop = 0;
|
||||||
} else if (!av_strcasecmp(cmd, "</Stream>")) {
|
} else if (!av_strcasecmp(cmd, "</Stream>")) {
|
||||||
|
Loading…
Reference in New Issue
Block a user