| // Find and fix trivial use-after-free of Error objects | 
 | // | 
 | // Copyright (c) 2020 Virtuozzo International GmbH. | 
 | // | 
 | // 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/licenses/>. | 
 | // | 
 | // How to use: | 
 | // spatch --sp-file scripts/coccinelle/error-use-after-free.cocci \ | 
 | //  --macro-file scripts/cocci-macro-file.h --in-place \ | 
 | //  --no-show-diff ( FILES... | --use-gitgrep . ) | 
 |  | 
 | @ exists@ | 
 | identifier fn, fn2; | 
 | expression err; | 
 | @@ | 
 |  | 
 |  fn(...) | 
 |  { | 
 |      <... | 
 | ( | 
 |      error_free(err); | 
 | +    err = NULL; | 
 | | | 
 |      error_report_err(err); | 
 | +    err = NULL; | 
 | | | 
 |      error_reportf_err(err, ...); | 
 | +    err = NULL; | 
 | | | 
 |      warn_report_err(err); | 
 | +    err = NULL; | 
 | | | 
 |      warn_reportf_err(err, ...); | 
 | +    err = NULL; | 
 | ) | 
 |      ... when != err = NULL | 
 |          when != exit(...) | 
 |      fn2(..., err, ...) | 
 |      ...> | 
 |  } |