]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
params: update param parser generator script to support duplicated parameters
authorPauli <ppzgs1@gmail.com>
Wed, 25 Jun 2025 22:11:47 +0000 (08:11 +1000)
committerTomas Mraz <tomas@openssl.org>
Thu, 31 Jul 2025 18:20:48 +0000 (20:20 +0200)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27923)

util/perl/OpenSSL/paramnames.pm

index a22e411dc15743dac0d7d3c00ca5506eed2b8c84..5395e5db7cf7dd3f42f72cf64e29920d4326d9ec 100644 (file)
@@ -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 */";