mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-19 19:42:24 +02:00
fuzzer_options_parser: add options parser fuzzing
To improve coverage of parse_commandline.c
This commit is contained in:
parent
7398e755d1
commit
938938a985
@ -23,6 +23,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <libmpv/client.h>
|
||||||
|
|
||||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
|
||||||
|
|
||||||
#define MPV_STRINGIFY_(X) #X
|
#define MPV_STRINGIFY_(X) #X
|
||||||
|
68
fuzzers/fuzzer_options_parser.c
Normal file
68
fuzzers/fuzzer_options_parser.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of mpv.
|
||||||
|
*
|
||||||
|
* mpv is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* mpv is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
int mpv_initialize_opts(mpv_handle *ctx, char **options);
|
||||||
|
|
||||||
|
#define MAX_INPUT_SIZE (1 << 20)
|
||||||
|
#define MAX_OPTS_NUM 10000
|
||||||
|
|
||||||
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
char buff[MAX_INPUT_SIZE + 2];
|
||||||
|
|
||||||
|
if (!size || size > MAX_INPUT_SIZE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy(buff, data, size);
|
||||||
|
buff[size] = '\0';
|
||||||
|
buff[size + 1] = '\0';
|
||||||
|
|
||||||
|
char *opts[MAX_OPTS_NUM + 1];
|
||||||
|
char *opt = buff;
|
||||||
|
int count = 0;
|
||||||
|
while (*opt && count < MAX_OPTS_NUM) {
|
||||||
|
opts[count] = opt;
|
||||||
|
|
||||||
|
while (*opt && !isspace(*opt))
|
||||||
|
opt++;
|
||||||
|
|
||||||
|
*opt = '\0';
|
||||||
|
opt++;
|
||||||
|
|
||||||
|
while (*opt && isspace(*opt))
|
||||||
|
opt++;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
opts[count] = NULL;
|
||||||
|
|
||||||
|
mpv_handle *ctx = mpv_create();
|
||||||
|
if (!ctx)
|
||||||
|
exit(1);
|
||||||
|
|
||||||
|
mpv_initialize_opts(ctx, opts);
|
||||||
|
|
||||||
|
mpv_terminate_destroy(ctx);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -71,4 +71,9 @@ foreach cmd : ['file', '-config-file', '-input-conf']
|
|||||||
link_with: libmpv)
|
link_with: libmpv)
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
|
fuzzers += executable('fuzzer_options_parser', 'fuzzer_options_parser.c',
|
||||||
|
link_language: 'cpp', include_directories: incdir,
|
||||||
|
objects: libmpv.extract_all_objects(recursive: true),
|
||||||
|
dependencies: dependencies)
|
||||||
|
|
||||||
alias_target('fuzzers', fuzzers)
|
alias_target('fuzzers', fuzzers)
|
||||||
|
@ -649,15 +649,25 @@ mpv_handle *mpv_create_weak_client(mpv_handle *ctx, const char *name)
|
|||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mpv_initialize(mpv_handle *ctx)
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
|
int mpv_initialize_opts(mpv_handle *ctx, char **options);
|
||||||
|
#else
|
||||||
|
static
|
||||||
|
#endif
|
||||||
|
int mpv_initialize_opts(mpv_handle *ctx, char **options)
|
||||||
{
|
{
|
||||||
lock_core(ctx);
|
lock_core(ctx);
|
||||||
int res = mp_initialize(ctx->mpctx, NULL) ? MPV_ERROR_INVALID_PARAMETER : 0;
|
int res = mp_initialize(ctx->mpctx, options) ? MPV_ERROR_INVALID_PARAMETER : 0;
|
||||||
mp_wakeup_core(ctx->mpctx);
|
mp_wakeup_core(ctx->mpctx);
|
||||||
unlock_core(ctx);
|
unlock_core(ctx);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mpv_initialize(mpv_handle *ctx)
|
||||||
|
{
|
||||||
|
return mpv_initialize_opts(ctx, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// set ev->data to a new copy of the original data
|
// set ev->data to a new copy of the original data
|
||||||
// (done only for message types that are broadcast)
|
// (done only for message types that are broadcast)
|
||||||
static void dup_event_data(struct mpv_event *ev)
|
static void dup_event_data(struct mpv_event *ev)
|
||||||
|
Loading…
Reference in New Issue
Block a user