Commit 3cb0bec6 authored by Lukasz Marek's avatar Lukasz Marek

ffserver: dont leak child arguments

Signed-off-by: 's avatarLukasz Marek <lukasz.m.luki2@gmail.com>
parent ec6e035b
...@@ -3663,7 +3663,7 @@ static void handle_child_exit(int sig) ...@@ -3663,7 +3663,7 @@ static void handle_child_exit(int sig)
if (uptime < 30) if (uptime < 30)
/* Turn off any more restarts */ /* Turn off any more restarts */
feed->child_argv = 0; ffserver_free_child_args(&feed->child_argv);
} }
} }
} }
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#include "cmdutils.h" #include "cmdutils.h"
#include "ffserver_config.h" #include "ffserver_config.h"
#define MAX_CHILD_ARGS 64
static int ffserver_save_avoption(const char *opt, const char *arg, int type, static int ffserver_save_avoption(const char *opt, const char *arg, int type,
FFServerConfig *config); FFServerConfig *config);
static void vreport_config_error(const char *filename, int line_num, int log_level, static void vreport_config_error(const char *filename, int line_num, int log_level,
...@@ -691,10 +693,10 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c ...@@ -691,10 +693,10 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c
if (!av_strcasecmp(cmd, "Launch")) { if (!av_strcasecmp(cmd, "Launch")) {
int i; int i;
feed->child_argv = av_mallocz(64 * sizeof(char *)); feed->child_argv = av_mallocz_array(MAX_CHILD_ARGS, sizeof(char *));
if (!feed->child_argv) if (!feed->child_argv)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
for (i = 0; i < 62; i++) { for (i = 0; i < MAX_CHILD_ARGS - 2; i++) {
ffserver_get_arg(arg, sizeof(arg), p); ffserver_get_arg(arg, sizeof(arg), p);
if (!arg[0]) if (!arg[0])
break; break;
...@@ -1255,3 +1257,17 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config) ...@@ -1255,3 +1257,17 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
#undef ERROR #undef ERROR
#undef WARNING #undef WARNING
void ffserver_free_child_args(void *argsp)
{
int i;
char **args;
if (!argsp)
return;
args = *(char ***)argsp;
if (!args)
return;
for (i = 0; i < MAX_CHILD_ARGS; i++)
av_free(args[i]);
av_freep(argsp);
}
...@@ -128,4 +128,6 @@ void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed, ...@@ -128,4 +128,6 @@ void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config); int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
void ffserver_free_child_args(void *argsp);
#endif /* FFSERVER_CONFIG_H */ #endif /* FFSERVER_CONFIG_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment