Skip to content

Conversation

@wing328
Copy link
Member

@wing328 wing328 commented Dec 30, 2025

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package || exit
    ./bin/generate-samples.sh ./bin/configs/*.yaml || exit
    ./bin/utils/export_docs_generators.sh || exit
    
    (For Windows users, please run the script in WSL)
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed.
  • File the PR against the correct branch: master (upcoming 7.x.0 minor release - breaking changes with fallbacks), 8.0.x (breaking changes without fallbacks)
  • If your PR solves a reported issue, reference it using GitHub's linking syntax (e.g., having "fixes #123" present in the PR description)
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

Summary by cubic

Fixes multipart file uploads in generated Go clients by closing the file after copying to the form part, preventing read-on-closed-file errors and ensuring proper resource cleanup.

  • Bug Fixes
    • Update addFile to create the form part, copy file contents, then close the file.
    • Regenerate Go sample clients to include the fix.

Written for commit 6ca94d0. Summary will update automatically on new commits.

@wing328 wing328 marked this pull request as ready for review December 30, 2025 06:56
@wing328 wing328 added this to the 7.19.0 milestone Dec 30, 2025
Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

9 issues found across 9 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="samples/openapi3/client/petstore/go/go-petstore/client.go">

<violation number="1" location="samples/openapi3/client/petstore/go/go-petstore/client.go:541">
P2: Resource leak: if `CreateFormFile` or `io.Copy` fails, the file handle is never closed. Use `defer file.Close()` immediately after opening the file to ensure cleanup in all error paths.</violation>
</file>

<file name="modules/openapi-generator/src/main/resources/go/client.mustache">

<violation number="1" location="modules/openapi-generator/src/main/resources/go/client.mustache:606">
P2: File descriptor leak on error paths. If `CreateFormFile` or `io.Copy` fails, the function returns without closing the file. Use `defer file.Close()` immediately after opening the file to ensure proper cleanup regardless of how the function exits.</violation>
</file>

<file name="samples/openapi3/client/extensions/x-auth-id-alias/go-experimental/client.go">

<violation number="1" location="samples/openapi3/client/extensions/x-auth-id-alias/go-experimental/client.go:491">
P2: File handle leak on error paths. If `CreateFormFile` or `io.Copy` fails, the function returns without closing the file. Use `defer file.Close()` immediately after opening the file to ensure proper cleanup in all code paths.</violation>
</file>

<file name="samples/client/echo_api/go-external-refs/client.go">

<violation number="1" location="samples/client/echo_api/go-external-refs/client.go:517">
P2: File handle may leak if `CreateFormFile` or `io.Copy` fails before `file.Close()` is reached. Use `defer file.Close()` immediately after the successful `os.Open()` to ensure the file is always closed regardless of error paths.</violation>
</file>

<file name="samples/openapi3/client/petstore/go-petstore-withXml/client.go">

<violation number="1" location="samples/openapi3/client/petstore/go-petstore-withXml/client.go:513">
P2: File handle will leak if `CreateFormFile` or `io.Copy` fails. Use `defer file.Close()` immediately after opening the file to ensure proper cleanup in all error paths.</violation>
</file>

<file name="samples/openapi3/client/petstore/go/go-petstore-aws-signature/client.go">

<violation number="1" location="samples/openapi3/client/petstore/go/go-petstore-aws-signature/client.go:545">
P2: File handle leak: if `CreateFormFile` or `io.Copy` fails, the function returns early without closing the opened file. Use `defer file.Close()` immediately after `os.Open()` to ensure the file is always closed.</violation>
</file>

<file name="samples/client/echo_api/go/client.go">

<violation number="1" location="samples/client/echo_api/go/client.go:517">
P2: File handle leaks if `CreateFormFile` or `io.Copy` fails. Add `defer file.Close()` immediately after opening the file to ensure the file is closed on all error paths. This is the idiomatic Go pattern for resource cleanup.</violation>
</file>

<file name="samples/client/petstore/go/go-petstore/client.go">

<violation number="1" location="samples/client/petstore/go/go-petstore/client.go:523">
P2: Resource leak: if `CreateFormFile` or `io.Copy` fails, the file handle is never closed. Use `defer file.Close()` immediately after opening the file to ensure cleanup on all error paths.</violation>
</file>

<file name="samples/openapi3/client/petstore/go-petstore-generateMarshalJSON-false/client.go">

<violation number="1" location="samples/openapi3/client/petstore/go-petstore-generateMarshalJSON-false/client.go:513">
P2: File resource leak on error paths. If `CreateFormFile` or `io.Copy` fails, the file handle is never closed. Use `defer file.Close()` immediately after opening the file to ensure cleanup on all code paths.</violation>
</file>

Reply to cubic to teach it or ask questions. Tag @cubic-dev-ai to re-run a review.

}
err = file.Close()

part, err := w.CreateFormFile(fieldName, filepath.Base(path))
Copy link

@cubic-dev-ai cubic-dev-ai bot Dec 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Resource leak: if CreateFormFile or io.Copy fails, the file handle is never closed. Use defer file.Close() immediately after opening the file to ensure cleanup on all error paths.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At samples/client/petstore/go/go-petstore/client.go, line 523:

<comment>Resource leak: if `CreateFormFile` or `io.Copy` fails, the file handle is never closed. Use `defer file.Close()` immediately after opening the file to ensure cleanup on all error paths.</comment>

<file context>
@@ -519,17 +519,18 @@ func addFile(w *multipart.Writer, fieldName, path string) error {
 	}
-	err = file.Close()
+
+	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
 	if err != nil {
 		return err
</file context>
Fix with Cubic

@wing328 wing328 changed the title Go file close [Go] defer file close Dec 30, 2025
@wing328 wing328 closed this Dec 30, 2025
@wing328 wing328 deleted the go-file-close branch December 30, 2025 08:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants