summaryrefslogtreecommitdiff
path: root/ffserver.c
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@stoeckmann.org>2017-01-06 23:33:16 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2017-01-08 03:50:56 +0100
commit95d9a85ca3e662388d5fa7ef1937d1c3fbe2dcd5 (patch)
treeb871fcae903881d5fa4db8a8c3519928a5a89fa2 /ffserver.c
parentfd010406c03923065ff9b835472f3f174e1c722d (diff)
downloadffmpeg-95d9a85ca3e662388d5fa7ef1937d1c3fbe2dcd5.tar.gz
ffserver: local OOB write with custom program name
When the command line for children is created, it is assumed that my_program_name always ends with "ffserver", which doesn't have to be true if ffserver is called through a symbolic link. In such a case, it could be that not enough space for "ffmpeg" is available at the end, leading to a buffer overflow. One example would be: $ ln -s /usr/bin/ffserver ~/f; ~/f As this is only a local buffer overflow, i.e. is based on a weird program call, this has NO security impact. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'ffserver.c')
-rw-r--r--ffserver.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/ffserver.c b/ffserver.c
index 02a583464b..8b819b6934 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -495,20 +495,22 @@ static void start_children(FFServerStream *feed)
return;
}
- pathname = av_strdup (my_program_name);
+ slash = strrchr(my_program_name, '/');
+ if (!slash) {
+ pathname = av_mallocz(sizeof("ffmpeg"));
+ } else {
+ pathname = av_mallocz(slash - my_program_name + sizeof("ffmpeg"));
+ if (pathname != NULL) {
+ memcpy(pathname, my_program_name, slash - my_program_name);
+ }
+ }
if (!pathname) {
http_log("Could not allocate memory for children cmd line\n");
return;
}
- /* replace "ffserver" with "ffmpeg" in the path of current
- * program. Ignore user provided path */
+ /* use "ffmpeg" in the path of current program. Ignore user provided path */
- slash = strrchr(pathname, '/');
- if (!slash)
- slash = pathname;
- else
- slash++;
- strcpy(slash, "ffmpeg");
+ strcat(pathname, "ffmpeg");
for (; feed; feed = feed->next) {