Remco van de Meent writes:
Remco> I got an error report from a debian user of the scli package Remco> stating that it segfaults on the command 'set' without Remco> arguments.
Remco> Turns out to be something simple:
[...]
Remco> argv[1] with argv=0.. I guess there should be a test for Remco> argc==2 just before that line.
Yes. And the set command should not be recursive in the first place. There are however more set/create/delete commands that should have the not recursive flag set. (They don't crash but it just does not make sense to recurse them.) Here is the full patch which I just checked into the CVS.
/js Index: 3com.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/3com.c,v retrieving revision 1.12 diff -u -r1.12 3com.c --- 3com.c 2002/06/26 06:39:47 1.12 +++ 3com.c 2002/06/26 09:18:41 @@ -586,7 +586,7 @@ { "create 3com bridge vlan", "<vlanid> <name>", "The `create 3com bridge vlan' command is used to create a\n" "new virtual LAN with the given <vlanid> and <name>.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_3com_bridge_vlan }, @@ -595,14 +595,14 @@ "virtual LANs. The regular expression <regexp> is matched\n" "against the virtual LAN names to select the vlans that should\n" "be deleted.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_3com_bridge_vlan },
{ "set 3com bridge vlan name", "<vlanid> <name>", "The `set 3com bridge vlan name' command changes the name of\n" "a virtual LAN.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_3com_bridge_vlan_name },
@@ -613,7 +613,7 @@ "should be modified. The <ports> argument contains a comma\n" "separated list of port numbers or port number ranges, e.g.\n" "1,5,7-8.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_3com_bridge_vlan_ports },
Index: cmds.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/cmds.c,v retrieving revision 1.48 diff -u -r1.48 cmds.c --- cmds.c 2002/06/26 06:39:47 1.48 +++ cmds.c 2002/06/26 09:18:41 @@ -919,7 +919,7 @@ GSnmpEnum const *dft; regex_t _regex_flags, *regex_flags = NULL;
- if (argc > 2) { + if (argc < 1 || argc > 2) { return SCLI_SYNTAX_NUMARGS; }
@@ -927,7 +927,7 @@ interp->regex_flags = 0; return SCLI_OK; } - + regex_flags = &_regex_flags; if (regcomp(regex_flags, argv[1], interp->regex_flags) != 0) { g_string_assign(interp->result, argv[1]); @@ -957,7 +957,7 @@
g_return_val_if_fail(interp, SCLI_ERROR);
- if (argc > 2) { + if (argc < 1 || argc > 2) { return SCLI_SYNTAX_NUMARGS; }
@@ -1217,14 +1217,14 @@ "extend scli with modules coming from other sources. Dynamic\n" "loadable modules also simplify the development and management\n" "of site-specific modules.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, cmd_scli_load },
{ "delete scli plugin", "<module>", "The `delete scli plugin' command removes a previously loaded\n" "modules from a running scli process.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, cmd_scli_unload },
@@ -1255,7 +1255,7 @@ "scli command (fragment) <value>. If the alias <name> already\n" "exists, then the new <value> will be assigned to the existing\n" "alias.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_scli_alias }, @@ -1264,14 +1264,14 @@ "aliases from the scli interpreter. The regular expression\n" "<regexp> is matched against all alias names in order to\n" "select the aliases that are deleted.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_scli_alias }, { "create scli interp", "<name>", "The `create scli interp' command creates a new internal scli\n" "interpreter with the name <name>.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_scli_interp }, @@ -1280,7 +1280,7 @@ "scli interpreters from the main scli interpreter. The regular\n" "expression <regexp> is matched against all alias names in order\n" "to select the interpreter(s) to be removed.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_scli_interp }, @@ -1294,7 +1294,7 @@ "options off. The currently defined regular expression options\n" "are "extended" for POSIX extended regular expressions and\n" ""case-insensitive" for case insensitive matches.", - SCLI_CMD_FLAG_XML, + SCLI_CMD_FLAG_XML | SCLI_CMD_FLAG_NORECURSE, "", NULL, set_scli_regex }, @@ -1309,7 +1309,7 @@ "layer, "request" for the SNMP request handling layer, \n" ""transport" for the SNMP transport layer, "packet" for\n" "the SNMP packet layer, and "asn1" for the ASN.1 coding layer.", - SCLI_CMD_FLAG_XML, + SCLI_CMD_FLAG_XML | SCLI_CMD_FLAG_NORECURSE, "", NULL, set_scli_debugging }, @@ -1318,7 +1318,7 @@ "used as a pager if the output produced by an scli command does\n" "not fit on a single screen. The output is passed to the <pager>\n" "shell command via its standard input stream.", - 0, + SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_scli_pager }, @@ -1328,7 +1328,7 @@ ""scli" and "xml". The "scli" format is the default output\n" "format and described in this documentation. The "xml" output\n" "format is experimental and therefore not described here.", - SCLI_CMD_FLAG_XML, + SCLI_CMD_FLAG_XML | SCLI_CMD_FLAG_NORECURSE, "", NULL, set_scli_format }, Index: disman.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/disman.c,v retrieving revision 1.40 diff -u -r1.40 disman.c --- disman.c 2002/06/26 06:39:47 1.40 +++ disman.c 2002/06/26 09:18:41 @@ -1617,13 +1617,13 @@
{ "create disman script", "<owner> <name> <description>", "...", - SCLI_CMD_FLAG_NEED_PEER, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_disman_script },
{ "create disman run", "<owner> <name> <args>", "...", - SCLI_CMD_FLAG_NEED_PEER, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_disman_run },
Index: interface.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/interface.c,v retrieving revision 1.72 diff -u -r1.72 interface.c --- interface.c 2002/06/26 06:39:47 1.72 +++ interface.c 2002/06/26 09:18:41 @@ -1525,13 +1525,13 @@
{ "create interface stack", "<lower-regexp> <higher-regexp>", "", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_interface_stack },
{ "delete interface stack", "<lower-regexp> <higher-regexp>", "", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_interface_stack },
@@ -1541,7 +1541,7 @@ "<regexp> is matched against the interface descriptions to\n" "select the interfaces of interest. The <value> parameter must\n" "be one of the strings "up", "down", or "testing".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_interface_status },
@@ -1552,7 +1552,7 @@ "applications to better identify interfaces. The regular\n" "expression <regexp> is matched against the interface\n" "descriptions to select the interfaces.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_interface_alias },
@@ -1562,7 +1562,7 @@ "The regular expression <regexp> is matched against the interface\n" "descriptions to select the interfaces. The <value> parameter\n" "must be one of the strings "enabled" or "disabled".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_interface_notifications },
@@ -1572,7 +1572,7 @@ "regular expression <regexp> is matched against the interface\n" "descriptions to select the interfaces. The <bool> parameter\n" "must be one of the strings "true" or "false".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_interface_promiscuous },
Index: ip.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/ip.c,v retrieving revision 1.38 diff -u -r1.38 ip.c --- ip.c 2002/06/26 06:39:47 1.38 +++ ip.c 2002/06/26 09:18:41 @@ -672,7 +672,7 @@ "The set ip forwarding command controls whether the IP protocol\n" "engine forwards IP datagrams or not. The <value> parameter must\n" "be one of the strings "enabled" or "disabled".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_ip_forwarding }, @@ -680,7 +680,7 @@ "The set ip ttl command can be used to change the default\n" "time to live (TTL) value used by the IP protocol engine. The\n" "<number> parameter must be a number between 1 and 255 inclusive.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_ip_ttl }, Index: netsnmp.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/netsnmp.c,v retrieving revision 1.5 diff -u -r1.5 netsnmp.c --- netsnmp.c 2002/06/26 06:39:47 1.5 +++ netsnmp.c 2002/06/26 09:18:41 @@ -386,13 +386,13 @@ "The `set netsnmp debugging' command controls whether the agent\n" "generates debug messages or not. The <value> parameter must\n" "be one of the strings "enabled" or "disabled".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_netsnmp_debugging }, { "set netsnmp restart", NULL, "The `set netsnmp restart' command restarts the agent.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_netsnmp_restart }, Index: nortel.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/nortel.c,v retrieving revision 1.32 diff -u -r1.32 nortel.c --- nortel.c 2002/06/26 06:39:47 1.32 +++ nortel.c 2002/06/26 09:18:42 @@ -977,7 +977,7 @@ { "create nortel bridge vlan", "<vlanid> <name>", "The `create nortel bridge vlan' command is used to create a\n" "new virtual LAN with the given <vlanid> and <name>.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_nortel_bridge_vlan },
@@ -986,14 +986,14 @@ "virtual LANs. The regular expression <regexp> is matched\n" "against the virtual LAN names to select the vlans that should\n" "be deleted.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_nortel_bridge_vlan },
{ "set nortel bridge vlan name", "<vlanid> <name>", "The `set nortel bridge vlan name' command changes the name of\n" "a virtual LAN.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_nortel_bridge_vlan_name },
@@ -1004,7 +1004,7 @@ "should be modified. The <ports> argument contains a comma\n" "separated list of port numbers or port number ranges, e.g.\n" "1,5,7-8.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_nortel_bridge_vlan_ports },
@@ -1014,7 +1014,7 @@ "against the vlan names to select the vlan. The <ports> argument\n" "contains a comma separated list of port numbers or port number\n" "ranges, e.g. 1,5,7-8.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_nortel_bridge_vlan_default },
Index: snmp.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/snmp.c,v retrieving revision 1.29 diff -u -r1.29 snmp.c --- snmp.c 2002/06/26 06:39:47 1.29 +++ snmp.c 2002/06/26 09:18:42 @@ -1206,7 +1206,7 @@ "The `create snmp vacm member' commands can be used to assign\n" "new members (security names) to vacm groups. New groups are\n" "created if they do not exist.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_snmp_vacm_member },
@@ -1214,14 +1214,14 @@ "The `delete snmp vacm member' commands can be used to delete\n" "members (security names) from vacm groups. Groups are deleted\n" "if the last member is deleted.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, delete_snmp_vacm_member },
{ "create snmp usm user", "<name> <template>", "The `create snmp usm user' commands can be used to create a\n" "new user by cloning an existing template.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, create_snmp_usm_user },
@@ -1230,7 +1230,7 @@ "SNMP engine generates authentication failure notifications.\n" "The <value> parameter must be one of the strings "enabled"\n" "or "disabled".", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_snmp_authentication_traps },
Index: system.c =================================================================== RCS file: /usr/home/schoenw/CVS/scli/scli/system.c,v retrieving revision 1.69 diff -u -r1.69 system.c --- system.c 2002/06/26 06:39:47 1.69 +++ system.c 2002/06/26 09:18:42 @@ -1460,21 +1460,21 @@ "The set system contact command configures the system contact\n" "information. The <string> argument should include information\n" "on how to contact a person who is responsible for this system.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_system_contact },
{ "set system name", "<string>", "The set system name command configures the name of the system.\n" "By convention, this is the fully-qualified domain name.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_system_name },
{ "set system location", "<string>", "The set system location command configures the physical\n" "location of the system.", - SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY, + SCLI_CMD_FLAG_NEED_PEER | SCLI_CMD_FLAG_DRY | SCLI_CMD_FLAG_NORECURSE, NULL, NULL, set_system_location },