Skip to content

Empty argument with '=' uses next argument as value #2223

@jvilhuber

Description

@jvilhuber

My urfave/cli version is

github.com/urfave/cli/v3 v3.6.0

Checklist

  • [ X] Are you running the latest v3 release? The list of releases is here.
  • [ X] Did you check the manual for your release? The v3 manual is here
  • [ X] Did you perform a search about this problem? Here's the GitHub guide about searching.

Dependency Management

  • My project is using go modules.

Describe the bug

I have two String arguments: --value1=foo and --value2=bar. If I leave off the foo, and pass in

--value1= --value2=bar

then the parsed value for the value1 argument will be --value2=bar (and obviously --value2 will never be parsed).

I suspect the problem is somewhere here in func (cmd *Command) parseFlags() (Args, error) :

		if index := strings.Index(flagName, "="); index != -1 {
			flagVal = flagName[index+1:]
			flagName = flagName[:index]
		}

Here we split off the = from the value1 flag, at which point flagVal is empty.

Later we have

			// not a bool flag so need to get the next arg
			if flagVal == "" {
				if len(rargs) == 1 {
					return &stringSliceArgs{posArgs}, fmt.Errorf("%s%s", argumentNotProvidedErrMsg, firstArg)
				}
				flagVal = rargs[1]
				rargs = rargs[1:]
			}

but we didn't remember that we already got the =, so that we should NOT get the next rargs: We should just use whatever was after the = (which is empty).

To reproduce

See above

Observed behavior

Second argument-value becomes the value of the first argument.

Expected behavior

First argument should remain empty, and the second argument should be normally parsed.

Additional context

This worked in v2. I don't know if it worked prior to v3.6.0, since I'm just porting over my v2 code.

Want to fix this yourself?

No time.

Run go version and paste its output here

go version go1.25.4 darwin/arm64
AR='ar'
CC='cc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='c++'
GCCGO='gccgo'
GO111MODULE=''
GOARCH='arm64'
GOARM64='v8.0'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/Users/jvilhuber/Library/Caches/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/Users/jvilhuber/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/s5/8qspwhrs4438zmz3q_yh6kh80000gs/T/go-build124383343=/tmp/go-build -gno-record-gcc-switches -fno-common'
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMOD='/Users/jvilhuber/src/my-service/go.mod'
GOMODCACHE='/Users/jvilhuber/go/pkg/mod'
GOOS='darwin'
GOPATH='/Users/jvilhuber/go'
GOROOT='/opt/homebrew/Cellar/go/1.25.4/libexec'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/Users/jvilhuber/Library/Application Support/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.25.4/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.25.4'
GOWORK=''
PKG_CONFIG='pkg-config'

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/v3relates to / is being considered for v3kind/bugdescribes or fixes a bugstatus/triagemaintainers still need to look into this

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions