From: Pauli Date: Wed, 25 Jun 2025 22:11:47 +0000 (+1000) Subject: params: update param parser generator script to support duplicated parameters X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=439f0243c1fae9f7067f87fc83a5de505114158c;p=thirdparty%2Fopenssl.git params: update param parser generator script to support duplicated parameters Reviewed-by: Shane Lontis Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/27923) --- diff --git a/util/perl/OpenSSL/paramnames.pm b/util/perl/OpenSSL/paramnames.pm index a22e411dc15..5395e5db7cf 100644 --- a/util/perl/OpenSSL/paramnames.pm +++ b/util/perl/OpenSSL/paramnames.pm @@ -650,9 +650,11 @@ sub generate_decoder_from_trie { my $n = shift; my $trieref = shift; my $identmap = shift; + my $concat_num = shift; my $idt = " "; my $indent0 = $idt x ($n + 3); my $indent1 = $indent0 . $idt; + my $indent2 = $indent1 . $idt; my $strcmp = $case_sensitive ? 'strcmp' : 'strcasecmp'; my $field; @@ -660,6 +662,7 @@ sub generate_decoder_from_trie { my $suf = $trieref->{'suffix'}; $field = $identmap->{$trieref->{'name'}}; + my $num = $concat_num->{$field}; printf "%sif (ossl_likely($strcmp(\"$suf\", s + $n) == 0", $indent0; if (not $case_sensitive) { $suf =~ tr/_/-/; @@ -667,9 +670,15 @@ sub generate_decoder_from_trie { if ($suf ne $trieref->{'suffix'}); } print ")) {\n"; - printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field; - printf "%s return 0;\n", $indent1; - printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field; + if (defined($num)) { + printf "%sif (ossl_unlikely(r->num_%s >= %s))\n", $indent1, $field, $num; + printf "%sreturn 0;\n", $indent2; + printf "%sr->%s[r->num_%s++] = (OSSL_PARAM *)p;\n", $indent1, $field, $field; + } else { + printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field; + printf "%sreturn 0;\n", $indent2; + printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field; + } printf "%s}\n", $indent0; return; } @@ -679,11 +688,18 @@ sub generate_decoder_from_trie { for my $l (sort keys %$trieref) { if ($l eq 'val') { $field = $identmap->{$trieref->{'val'}}; + my $num = $concat_num->{$field}; printf "%sbreak;\n", $indent1; printf "%scase '\\0':\n", $indent0; - printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field; - printf "%s return 0;\n", $indent1; - printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field; + if (defined($num)) { + printf "%sif (ossl_unlikely(r->num_%s >= %s))\n", $indent1, $field, $num; + printf "%sreturn 0;\n", $indent2; + printf "%sr->%s[r->num_%s++] = (OSSL_PARAM *)p;\n", $indent1, $field, $field; + } else { + printf "%sif (ossl_unlikely(r->%s != NULL))\n", $indent1, $field; + printf "%sreturn 0;\n", $indent2; + printf "%sr->%s = (OSSL_PARAM *)p;\n", $indent1, $field; + } } else { printf "%sbreak;\n", $indent1; printf "%scase '%s':", $indent0, $l; @@ -692,7 +708,7 @@ sub generate_decoder_from_trie { printf " case '%s':", uc $l if ($l =~ /[a-z]/); } print "\n"; - generate_decoder_from_trie($n + 1, $trieref->{$l}, $identmap); + generate_decoder_from_trie($n + 1, $trieref->{$l}, $identmap, $concat_num); } } printf "%s}\n", $indent0; @@ -766,6 +782,7 @@ sub output_param_decoder { my @params = @_; my @keys = (); my %prms = (); + my %concat_num = (); print "/* Machine generated by util/perl/OpenSSL/paramnames.pm */\n"; # Output ettable param array @@ -775,6 +792,7 @@ sub output_param_decoder { my $pname = $params[$i][0]; my $pident = $params[$i][1]; my $ptype = $params[$i][2]; + my $pnum = $params[$i][3]; print " OSSL_PARAM_$ptype(OSSL_$pname, NULL"; print ", 0" if $ptype eq "octet_string" || $ptype eq "octet_ptr" @@ -782,6 +800,7 @@ sub output_param_decoder { printf "),\n"; $prms{$pname} = $pident; + $concat_num{$pident} = $pnum if defined($pnum); } print " OSSL_PARAM_END\n};\n#endif\n\n"; @@ -789,7 +808,12 @@ sub output_param_decoder { printf "#ifndef %s_st\n", $decoder_name_base; printf "struct %s_st {\n", $decoder_name_base; foreach my $pident (sort values %prms) { - printf " OSSL_PARAM *%s;\n", $pident; + if (defined($concat_num{$pident})) { + printf " OSSL_PARAM *%s[%s];\n", $pident, $concat_num{$pident}; + printf " int num_%s;\n", $pident; + } else { + printf " OSSL_PARAM *%s;\n", $pident; + } } print "};\n#endif\n\n"; @@ -805,7 +829,7 @@ sub output_param_decoder { print " memset(r, 0, sizeof(*r));\n"; print " if (p != NULL)\n"; print " for (; (s = p->key) != NULL; p++)\n"; - generate_decoder_from_trie(0, \%t, \%prms); + generate_decoder_from_trie(0, \%t, \%prms, \%concat_num); print " return 1;\n"; print "}\n#endif\n"; print "/* End of machine generated */";