Tcl Source Code

View Ticket
Login
Ticket UUID: 7cb7409e05b12cab232b4a86d297ad7bdd9c6336
Title: Tcl_ParseArgsObjv bug with TCL_ARGV_GENFUNC
Type: Bug Version: 8.7 - trunk
Submitter: emiliano Created on: 2024-04-03 20:29:51
Subsystem: 13. Index Object Assigned To: jan.nijtmans
Priority: 5 Medium Severity: Important
Status: Closed Last Modified: 2024-04-04 21:09:40
Resolution: Fixed Closed By: jan.nijtmans
    Closed on: 2024-04-04 21:09:40
Description:

Tcl_ParseArgsObjv shows a bug in the TCL_ARGV_GENFUNC case, by not properly updating both the objc and srcIndex variables, as read in

https://core.tcl-lang.org/tcl/file?ci=tip&name=generic/tclIndexObj.c&ln=1184-1188

The (integral) return value should be added to srcIndex and substracted from objc.

Attached a simple demo file parsearg-bug.c and a patch to address the issue against core-8-branch.

Compiled with

gcc -shared -o libparse.so -DUSE_TCL_STUBS -I/usr/local/include parsearg-bug.c -L/usr/local/lib -ltclstub8.7

Before the patch:

% load ./libparse.so
% parse
Color: |0|NO COLOR|, Media: |0|NO MEDIA|
% parse -color Nothing
Color: |1|Nothing|, Media: |0|NO MEDIA|
% parse -media A4
unrecognized argument "A4"
% parse -media A4 -color Somecolor
unrecognized argument "A4"
% parse -color othercolor -media Letter
unrecognized argument "Letter"
% parse -color othercolor -media Nosuchmedia
bad media "Nosuchmedia": must be A4, Legal, or Letter

After

% load ./libparse.so
% parse
Color: |0|NO COLOR|, Media: |0|NO MEDIA|
% parse -color Nothing
Color: |1|Nothing|, Media: |0|NO MEDIA|
% parse -media A4
Color: |0|NO COLOR|, Media: |1|Paper size is ISO A4|
% parse -media A4 -color Somecolor
Color: |1|Somecolor|, Media: |1|Paper size is ISO A4|
% parse -color othercolor -media Letter
Color: |1|othercolor|, Media: |1|Paper size is US Letter|
% parse -color othercolor -media Nosuchmedia
bad media "Nosuchmedia": must be A4, Legal, or Letter

There's also a bug in the documentation, which reads (after the Tcl_ArgvGenFuncProc prototype):

"The clientData is the value from the table entry, the interp is where to store any error messages, the keyStr is the name of the argument, objc and objv describe an array of all the remaining arguments, and dstPtr argument to the Tcl_ArgvGenFuncProc is the location to write the parsed value (or values) to."

Here, "...the keyStr is the name of the argument,..." is wrong as there's no such argument in the prototype.

User Comments: jan.nijtmans added on 2024-04-04 21:09:40:

Fixed in all branches now (core-8-6-branch, core-8-branch and trunk)

Many thanks!


emiliano added on 2024-04-03 22:30:37:
Indeed, the code on core-8-6-branch looks pretty much the same. It can be easily backported (just 3 lines).

jan.nijtmans added on 2024-04-03 22:23:26:

Thanks! Committed now to a bug-fix branch. I will also add some test-cases.

I wonder if 8.6 has the same bug .....


Attachments: