xref: /aosp_15_r20/external/mbedtls/tests/scripts/recursion.pl (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi#!/usr/bin/env perl
2*62c56f98SSadaf Ebrahimi
3*62c56f98SSadaf Ebrahimi# Find functions making recursive calls to themselves.
4*62c56f98SSadaf Ebrahimi# (Multiple recursion where a() calls b() which calls a() not covered.)
5*62c56f98SSadaf Ebrahimi#
6*62c56f98SSadaf Ebrahimi# When the recursion depth might depend on data controlled by the attacker in
7*62c56f98SSadaf Ebrahimi# an unbounded way, those functions should use iteration instead.
8*62c56f98SSadaf Ebrahimi#
9*62c56f98SSadaf Ebrahimi# Typical usage: scripts/recursion.pl library/*.c
10*62c56f98SSadaf Ebrahimi#
11*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors
12*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimiuse warnings;
15*62c56f98SSadaf Ebrahimiuse strict;
16*62c56f98SSadaf Ebrahimi
17*62c56f98SSadaf Ebrahimiuse utf8;
18*62c56f98SSadaf Ebrahimiuse open qw(:std utf8);
19*62c56f98SSadaf Ebrahimi
20*62c56f98SSadaf Ebrahimi# exclude functions that are ok:
21*62c56f98SSadaf Ebrahimi# - mpi_write_hlp: bounded by size of mbedtls_mpi, a compile-time constant
22*62c56f98SSadaf Ebrahimi# - x509_crt_verify_child: bounded by MBEDTLS_X509_MAX_INTERMEDIATE_CA
23*62c56f98SSadaf Ebrahimimy $known_ok = qr/mpi_write_hlp|x509_crt_verify_child/;
24*62c56f98SSadaf Ebrahimi
25*62c56f98SSadaf Ebrahimimy $cur_name;
26*62c56f98SSadaf Ebrahimimy $inside;
27*62c56f98SSadaf Ebrahimimy @funcs;
28*62c56f98SSadaf Ebrahimi
29*62c56f98SSadaf Ebrahimidie "Usage: $0 file.c [...]\n" unless @ARGV;
30*62c56f98SSadaf Ebrahimi
31*62c56f98SSadaf Ebrahimiwhile (<>)
32*62c56f98SSadaf Ebrahimi{
33*62c56f98SSadaf Ebrahimi    if( /^[^\/#{}\s]/ && ! /\[.*]/ ) {
34*62c56f98SSadaf Ebrahimi        chomp( $cur_name = $_ ) unless $inside;
35*62c56f98SSadaf Ebrahimi    } elsif( /^{/ && $cur_name ) {
36*62c56f98SSadaf Ebrahimi        $inside = 1;
37*62c56f98SSadaf Ebrahimi        $cur_name =~ s/.* ([^ ]*)\(.*/$1/;
38*62c56f98SSadaf Ebrahimi    } elsif( /^}/ && $inside ) {
39*62c56f98SSadaf Ebrahimi        undef $inside;
40*62c56f98SSadaf Ebrahimi        undef $cur_name;
41*62c56f98SSadaf Ebrahimi    } elsif( $inside && /\b\Q$cur_name\E\([^)]/ ) {
42*62c56f98SSadaf Ebrahimi        push @funcs, $cur_name unless /$known_ok/;
43*62c56f98SSadaf Ebrahimi    }
44*62c56f98SSadaf Ebrahimi}
45*62c56f98SSadaf Ebrahimi
46*62c56f98SSadaf Ebrahimiprint "$_\n" for @funcs;
47*62c56f98SSadaf Ebrahimiexit @funcs;
48