Several command-line tools call defer extractor.DeferClose(b) or defer extractor.DeferClose(doc) before checking if the creation call returned an error:
sites/duckduckgo/cmd/duckduckgo/main.go:76-79:
b,err:=browser.FromCommand(ctx,command)deferextractor.DeferClose(b)// deferred before error checkiferr!=nil{returnfmt.Errorf("failed to create browser: %w",err)}
sites/google/cmd/google/main.go:62-66:
b,err:=browser.FromCommand(ctx,cli)deferextractor.DeferClose(b)// deferred before error checkiferr!=nil{returnerr}
sites/wegmans/wegmans.go:63-66 and sites/aislegopher/aislegopher.go:53-56: Same pattern with b.Open().
While DeferClose nil-checks its argument, this pattern is error-prone and inconsistent with Go best practices. If a function returns both a non-nil value and an error, the defer could interact with a partially-initialized object.
Additionally, powerball and megamillions cmd tools don't call DeferClose(b) on the browser at all — the browser is leaked.
Add defer extractor.DeferClose(b) to powerball and megamillions cmd tools.
**Parent:** #1
## Description
Several command-line tools call `defer extractor.DeferClose(b)` or `defer extractor.DeferClose(doc)` before checking if the creation call returned an error:
1. **`sites/duckduckgo/cmd/duckduckgo/main.go:76-79`**:
```go
b, err := browser.FromCommand(ctx, command)
defer extractor.DeferClose(b) // deferred before error check
if err != nil {
return fmt.Errorf("failed to create browser: %w", err)
}
```
2. **`sites/google/cmd/google/main.go:62-66`**:
```go
b, err := browser.FromCommand(ctx, cli)
defer extractor.DeferClose(b) // deferred before error check
if err != nil {
return err
}
```
3. **`sites/wegmans/wegmans.go:63-66`** and **`sites/aislegopher/aislegopher.go:53-56`**: Same pattern with `b.Open()`.
While `DeferClose` nil-checks its argument, this pattern is error-prone and inconsistent with Go best practices. If a function returns both a non-nil value and an error, the defer could interact with a partially-initialized object.
Additionally, **powerball and megamillions cmd tools** don't call `DeferClose(b)` on the browser at all — the browser is leaked.
## Fix
Move defer after error check:
```go
b, err := browser.FromCommand(ctx, command)
if err != nil {
return err
}
defer extractor.DeferClose(b)
```
Add `defer extractor.DeferClose(b)` to powerball and megamillions cmd tools.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Parent: #1
Description
Several command-line tools call
defer extractor.DeferClose(b)ordefer extractor.DeferClose(doc)before checking if the creation call returned an error:sites/duckduckgo/cmd/duckduckgo/main.go:76-79:sites/google/cmd/google/main.go:62-66:sites/wegmans/wegmans.go:63-66andsites/aislegopher/aislegopher.go:53-56: Same pattern withb.Open().While
DeferClosenil-checks its argument, this pattern is error-prone and inconsistent with Go best practices. If a function returns both a non-nil value and an error, the defer could interact with a partially-initialized object.Additionally, powerball and megamillions cmd tools don't call
DeferClose(b)on the browser at all — the browser is leaked.Fix
Move defer after error check:
Add
defer extractor.DeferClose(b)to powerball and megamillions cmd tools.Starting work on this as part of PR 5 (also includes #8). Will move
defer DeferClose(x)after the error check in all 6 affected locations.Work finished. PR: #36
Moved
defer DeferClose(x)after error checks in all 6 affected locations.Resolved by PR #36 — moved all
defer DeferClose(x)calls after error checks across all affected files.