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