Tcl Source Code

Artifact [b5b49f75aa]
Login

Artifact b5b49f75aa0da13c77f0a28c0f1d7e927be0386d:

Attachment "slaveobjcmd.patch" to ticket [479650ffff] added by patthoyts 2001-11-08 23:43:15.
This patch fixes a problem with the SlaveObjCmd procedure used within
nested interps.

It can be difficult to reproduce the problem but in tclsh 8.3.4:
% interp create a
% a alias
can give undefined results due to insufficient argument checking. In
some cases this can crash tcl due to dereferencing invalid pointers.

I added a test to check for the desired result of 'a alias' which is an
invalid args error.

Pat Thoyts.


*** generic/tclInterp.c.orig	Thu Oct  4 21:02:20 2001
--- generic/tclInterp.c	Thu Oct  4 21:15:59 2001
***************
*** 1856,1871 ****
  
      switch ((enum options) index) {
  	case OPT_ALIAS: {
! 	    if (objc == 3) {
! 		return AliasDescribe(interp, slaveInterp, objv[2]);
! 	    }
! 	    if (Tcl_GetString(objv[3])[0] == '\0') {
! 		if (objc == 4) {
! 		    return AliasDelete(interp, slaveInterp, objv[2]);
  		}
- 	    } else {
- 		return AliasCreate(interp, slaveInterp, interp, objv[2],
- 			objv[3], objc - 4, objv + 4);
  	    }
  	    Tcl_WrongNumArgs(interp, 2, objv,
  		    "aliasName ?targetName? ?args..?");
--- 1856,1873 ----
  
      switch ((enum options) index) {
  	case OPT_ALIAS: {
! 	    if (objc > 2) {
! 		if (objc == 3) {
! 		    return AliasDescribe(interp, slaveInterp, objv[2]);
! 		}
! 		if (Tcl_GetString(objv[3])[0] == '\0') {
! 		    if (objc == 4) {
! 			return AliasDelete(interp, slaveInterp, objv[2]);
! 		    }
! 		} else {
! 		    return AliasCreate(interp, slaveInterp, interp, objv[2],
! 				       objv[3], objc - 4, objv + 4);
  		}
  	    }
  	    Tcl_WrongNumArgs(interp, 2, objv,
  		    "aliasName ?targetName? ?args..?");
*** tests/interp.test.orig	Thu Oct  4 21:34:09 2001
--- tests/interp.test	Thu Oct  4 21:35:38 2001
***************
*** 271,276 ****
--- 271,281 ----
      a alias bar in_master a1 a2 a3
      a eval bar s1 s2 s3
  } {seen in master: {a1 a2 a3 s1 s2 s3}}
+ test interp-8.3 {testing basic alias invocation} {
+    catch {interp create a}
+    catch {a alias} msg
+    string match "wrong # args*" $msg
+ } {1}
  
  # Part 8: Testing aliases for non-existent targets
  test interp-9.1 {testing aliases for non-existent targets} {