From ac0e38a6083b4c4a43f1ed468051972c99565f60 Mon Sep 17 00:00:00 2001 From: "Vikrant Balyan (vvb)" Date: Fri, 20 Mar 2020 17:49:02 +0530 Subject: [PATCH 1/2] protects against stackoverflow when OAS spec has circular references --- .../PowerShellExperimentalClientCodegen.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java index 60e511622627..975f78790004 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java @@ -596,6 +596,7 @@ public String toParamName(String name) { public Map postProcessOperationsWithModels(Map objs, List allModels) { Map operations = (Map) objs.get("operations"); HashMap modelMaps = new HashMap(); + HashMap processedModelMaps = new HashMap(); for (Object o : allModels) { HashMap h = (HashMap) o; @@ -608,7 +609,7 @@ public Map postProcessOperationsWithModels(Map o int index = 0; for (CodegenParameter p : op.allParams) { p.vendorExtensions.put("x-powershell-data-type", getPSDataType(p)); - p.vendorExtensions.put("x-powershell-example", constructExampleCode(p, modelMaps)); + p.vendorExtensions.put("x-powershell-example", constructExampleCode(p, modelMaps, processedModelMaps)); p.vendorExtensions.put("x-index", index); index++; } @@ -622,9 +623,10 @@ public Map postProcessOperationsWithModels(Map o } } + processedModelMaps.clear(); for (CodegenOperation operation : operationList) { for (CodegenParameter cp : operation.allParams) { - cp.vendorExtensions.put("x-powershell-example", constructExampleCode(cp, modelMaps)); + cp.vendorExtensions.put("x-powershell-example", constructExampleCode(cp, modelMaps, processedModelMaps)); } } @@ -672,9 +674,9 @@ public String toVarName(String name) { return name; } - private String constructExampleCode(CodegenParameter codegenParameter, HashMap modelMaps) { + private String constructExampleCode(CodegenParameter codegenParameter, HashMap modelMaps, HashMap processedModelMap) { if (codegenParameter.isListContainer) { // array - return "@(" + constructExampleCode(codegenParameter.items, modelMaps) + ")"; + return "@(" + constructExampleCode(codegenParameter.items, modelMaps, processedModelMap) + ")"; } else if (codegenParameter.isMapContainer) { // TODO: map, file type return "\"TODO\""; } else if (languageSpecificPrimitives.contains(codegenParameter.dataType) || @@ -706,7 +708,7 @@ private String constructExampleCode(CodegenParameter codegenParameter, HashMap modelMaps) { + private String constructExampleCode(CodegenProperty codegenProperty, HashMap modelMaps, HashMap processedModelMap) { if (codegenProperty.isListContainer) { // array - return "@(" + constructExampleCode(codegenProperty.items, modelMaps) + ")"; + return "@(" + constructExampleCode(codegenProperty.items, modelMaps, processedModelMap) + ")"; } else if (codegenProperty.isMapContainer) { // map return "\"TODO\""; } else if (languageSpecificPrimitives.contains(codegenProperty.dataType) || // primitive type @@ -748,7 +750,7 @@ private String constructExampleCode(CodegenProperty codegenProperty, HashMap modelMaps) { + private String constructExampleCode(CodegenModel codegenModel, HashMap modelMaps, HashMap processedModelMap) { String example; + + // break recursion. In case a model is already processed in the current context, return. + String model = codegenModel.name; + if (processedModelMap.containsKey(model)) { + return ""; + } + processedModelMap.put(model, true); + example = "(New-" + codegenModel.name; List propertyExamples = new ArrayList<>(); for (CodegenProperty codegenProperty : codegenModel.vars) { - propertyExamples.add(" -" + codegenProperty.name + " " + constructExampleCode(codegenProperty, modelMaps)); + propertyExamples.add(" -" + codegenProperty.name + " " + constructExampleCode(codegenProperty, modelMaps, processedModelMap)); } example += StringUtils.join(propertyExamples, " "); example += ")"; From 513af1e4c2922073420de2bb159d46e4f648be2f Mon Sep 17 00:00:00 2001 From: "Vikrant Balyan (vvb)" Date: Fri, 20 Mar 2020 23:33:31 +0530 Subject: [PATCH 2/2] protects against stackoverflow when OAS spec has circular references --- .../codegen/languages/PowerShellExperimentalClientCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java index 975f78790004..13b7f88cc893 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java @@ -761,7 +761,7 @@ private String constructExampleCode(CodegenProperty codegenProperty, HashMap modelMaps, HashMap processedModelMap) { String example; - // break recursion. In case a model is already processed in the current context, return. + // break infinite recursion. Return, in case a model is already processed in the current context. String model = codegenModel.name; if (processedModelMap.containsKey(model)) { return "";