From 4e70a277f1a8461b30ceb1cd00bff72430815191 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 30 Jun 2016 22:30:27 +0300 Subject: [PATCH] check_wine: make report(R_FATAL, ...) a nullify the path If the level of the report() is R_FATAL then the function doesn't return. It has to be handled specially because other report levels do return. Signed-off-by: Dan Carpenter --- check_list.h | 1 + check_wine.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 check_wine.c diff --git a/check_list.h b/check_list.h index 964b24e5..0aa489ea 100644 --- a/check_list.h +++ b/check_list.h @@ -170,6 +170,7 @@ CK(register_modification_hooks_late) /* has to come after smatch_extra */ CK(register_comparison_late) /* has to come after modification_hooks_late */ CK(register_function_hooks) CK(check_kernel) /* this is overwriting stuff from smatch_extra_late */ +CK(check_wine) CK(register_returns) CK(register_db_call_marker) /* always second last */ /* diff --git a/check_wine.c b/check_wine.c new file mode 100644 index 00000000..af56b2f2 --- /dev/null +++ b/check_wine.c @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016 Oracle. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt + */ + +/* + * This is wine specific stuff for smatch_extra. + */ + +#include "scope.h" +#include "smatch.h" +#include "smatch_extra.h" + +/* report (R_FATAL, "Can't get OS version."); */ +void match_fatal_report(const char *fn, struct expression *expr, + void *unused) +{ + struct expression *arg; + sval_t sval; + + arg = get_argument_from_call_expr(expr->args, 0); + if (!get_implied_value(arg, &sval)) + return; + + /* R_FATAL is 9. */ + if (sval.value == 9) + nullify_path(); +} + + +void check_wine(int id) +{ + if (option_project != PROJ_WINE) + return; + + add_function_hook("report", &match_fatal_report, NULL); +} -- 2.11.4.GIT