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:
Lukasz Marek 2014-11-01 02:09:44 +01:00
parent 63e62cfbe2
commit 2121e3e130
1 changed files with 26 additions and 21 deletions

View File

@ -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>")) {