]> granicus.if.org Git - sudo/commitdiff
Add support for preloading a shared object containing a dummy execve()
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 5 Jan 2004 02:48:09 +0000 (02:48 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 5 Jan 2004 02:48:09 +0000 (02:48 +0000)
function that just sets error and returns -1.  This adds a
"noexec_file" option to load the filename as well as a "noexec" flag
to enable it unconditionally.  There is also a NOEXEC tag that can
be attached to specific commands and an EXEC tag to disable it.

13 files changed:
def_data.c
def_data.h
def_data.in
env.c
lex.yy.c
parse.c
parse.h
parse.lex
parse.yacc
sudo.c
sudo.h
sudo.tab.c
sudo.tab.h

index 135df092e871e02118d011a2955eb95b45d31cd4..d95ba3cef07a93bcb206360e6132d6f2df1c5e37 100644 (file)
@@ -190,6 +190,12 @@ struct sudo_defs_types sudo_defs_table[] = {
        "verifypw", T_TUPLE|T_BOOL,
        "When to require a password for 'verify' pseudocommand: %s",
        def_data_verifypw,
+    }, {
+       "noexec", T_FLAG,
+       "Preload the dummy execve() function contained in 'noexec_file'",
+    }, {
+       "noexec_file", T_STR|T_PATH,
+       "Path to a file containing a dummy execve() function: %s",
     }, {
        NULL, 0, NULL
     }
index 3ed1a2f73bc349a550cf444fd69367e651949097..7aa83f6c50a0142215e9edf897ccb61b4a096bde 100644 (file)
 #define I_LISTPW                53
 #define def_verifypw            (sudo_defs_table[54].sd_un.tuple)
 #define I_VERIFYPW              54
+#define def_noexec              (sudo_defs_table[55].sd_un.flag)
+#define I_NOEXEC                55
+#define def_noexec_file         (sudo_defs_table[56].sd_un.str)
+#define I_NOEXEC_FILE           56
 
 enum def_tupple {
        never,
index eadb803585f226cdaefd5cb4a331bea0b25acee3..053cdbf47ce5f6ee6156d803d7fc874a231d62d9 100644 (file)
@@ -175,3 +175,9 @@ verifypw
        T_TUPLE|T_BOOL
        "When to require a password for 'verify' pseudocommand: %s"
        never any all always
+noexec
+       T_FLAG
+       "Preload the dummy execve() function contained in 'noexec_file'"
+noexec_file
+       T_STR|T_PATH
+       "Path to a file containing a dummy execve() function: %s"
diff --git a/env.c b/env.c
index 156aecb05ae9cfc67bddcbe950d4477c1fd02b98..0c05e443a902857583d78708f28f3a02870c9af8 100644 (file)
--- a/env.c
+++ b/env.c
@@ -92,7 +92,7 @@ static const char rcsid[] = "$Sudo$";
 /*
  * Prototypes
  */
-char **rebuild_env             __P((int, char **));
+char **rebuild_env             __P((char **, int, int));
 char **zero_env                        __P((char **));
 static void insert_env         __P((char *, int));
 static char *format_env                __P((char *, char *));
@@ -279,9 +279,10 @@ insert_env(str, dupcheck)
  * Also adds sudo-specific variables (SUDO_*).
  */
 char **
-rebuild_env(sudo_mode, envp)
-    int sudo_mode;
+rebuild_env(envp, reset_home, noexec)
     char **envp;
+    int reset_home;
+    int noexec;
 {
     char **ep, *cp, *ps1;
     int okvar, iswild, didvar;
@@ -433,9 +434,14 @@ rebuild_env(sudo_mode, envp)
     }
 
     /* Set $HOME for `sudo -H'.  Only valid at PERM_RUNAS. */
-    if ((sudo_mode & MODE_RESET_HOME) && runas_pw->pw_dir)
+    if (reset_home && runas_pw->pw_dir)
        insert_env(format_env("HOME", runas_pw->pw_dir), 1);
 
+    /* Point LD_PRELOAD to noexec_file? */
+    /* XXX - what to use for HP-UX and AIX? */
+    if (noexec)
+       insert_env(format_env("LD_PRELOAD", def_noexec_file), 1);
+
     /* Set PS1 if SUDO_PS1 is set. */
     if (ps1)
        insert_env(ps1, 1);
index 21a8916245ab2005f23d1c0ef92a974af24fd8bf..1a08e58be9c4da437f87fefd1536e62014780199 100644 (file)
--- a/lex.yy.c
+++ b/lex.yy.c
@@ -285,43 +285,45 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 35
-#define YY_END_OF_BUFFER 36
-static yyconst short int yy_accept[299] =
+#define YY_NUM_RULES 37
+#define YY_END_OF_BUFFER 38
+static yyconst short int yy_accept[319] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   36,   25,   31,   30,   29,   34,   25,   20,
-       34,   25,   26,   25,   25,   25,   25,   28,   27,   21,
-       21,   21,   34,   21,   21,   21,   21,   21,   22,   34,
-       22,   23,   22,   22,   22,   22,   22,   21,   21,   21,
-       34,    1,   11,   10,   11,   10,   10,   34,   34,    2,
-        8,    8,    8,    3,    8,    4,   34,   25,    0,   31,
-       29,    0,   33,   17,    0,   16,    0,   24,   24,    0,
-       25,   25,   25,   25,   25,   21,   21,   21,   25,   32,
-       25,   25,   25,   25,   25,   22,    0,   22,   17,    0,
-
-       16,    0,   22,    0,   22,   22,   22,   22,   22,   21,
-       21,   21,   22,    1,   11,   11,    9,    9,    0,    2,
-        8,    0,    8,    0,    0,    5,    6,    8,    8,    0,
-       25,   25,   25,   21,   21,   25,   25,   25,   25,   25,
-       22,   22,   22,   21,   21,    7,    7,    0,    7,    8,
-       25,   25,   25,   25,   25,   21,   21,   25,   25,   25,
-       22,   22,   22,   22,   22,   21,   21,    7,   25,   25,
-       25,   21,   21,   25,   25,   22,   22,   22,   21,   21,
-       25,   25,   25,   25,   25,   21,   21,   25,   25,   22,
-       22,   22,   22,   22,   21,   21,   18,   18,   18,   21,
-
-        0,   15,   25,   25,   18,   18,   18,   21,   25,   18,
-       18,   18,   18,   21,   25,   12,   22,   18,   18,   18,
-       18,   21,   25,   19,   19,   19,    0,   14,   25,   12,
-       22,   19,   19,   19,   25,   25,   19,   19,   19,   19,
-       19,   13,   22,   22,   19,   19,   19,   19,   19,   25,
-       25,   25,   19,   19,   22,   22,   22,   19,   19,   25,
-       25,   25,   25,   25,   22,   22,   22,   22,   22,   25,
-       25,   25,   22,   22,   22,   25,   25,   25,   25,   25,
-       22,   22,   22,   22,   22,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,    0
-
+        0,    0,   38,   27,   33,   32,   31,   36,   27,   22,
+       36,   27,   28,   27,   27,   27,   27,   30,   29,   23,
+       23,   23,   23,   36,   23,   23,   23,   23,   23,   24,
+       36,   24,   25,   24,   24,   24,   24,   24,   23,   23,
+       23,   23,   36,    1,   11,   10,   11,   10,   10,   36,
+       36,    2,    8,    8,    8,    3,    8,    4,   36,   27,
+        0,   33,   31,    0,   35,   19,    0,   18,    0,   26,
+       26,    0,   27,   27,   27,   27,   27,   23,   23,   23,
+       23,   27,   34,   27,   27,   27,   27,   27,   24,    0,
+
+       24,   19,    0,   18,    0,   24,    0,   24,   24,   24,
+       24,   24,   23,   23,   23,   23,   24,    1,   11,   11,
+        9,    9,    0,    2,    8,    0,    8,    0,    0,    5,
+        6,    8,    8,    0,   27,   27,   27,   23,   23,   23,
+       23,   27,   27,   27,   27,   27,   24,   24,   24,   23,
+       23,   23,   23,    7,    7,    0,    7,    8,   27,   27,
+       27,   27,   27,   23,   23,   23,   23,   27,   27,   27,
+       24,   24,   24,   24,   24,   23,   23,   23,   23,    7,
+       27,   27,   27,    0,   17,   23,   23,   23,   27,   27,
+       24,   24,   24,   23,   23,   23,   27,   27,   27,   27,
+
+       27,   23,   23,   23,   27,   27,   24,   24,   24,   24,
+       24,   23,   23,   23,   20,   20,   20,    0,   16,   23,
+        0,   15,   27,   27,   20,   20,   20,   23,   27,   20,
+       20,   20,   20,   23,   27,   12,   24,   20,   20,   20,
+       20,   23,   27,   21,   21,   21,    0,   14,   27,   12,
+       24,   21,   21,   21,   27,   27,   21,   21,   21,   21,
+       21,   13,   24,   24,   21,   21,   21,   21,   21,   27,
+       27,   27,   21,   21,   24,   24,   24,   21,   21,   27,
+       27,   27,   27,   27,   24,   24,   24,   24,   24,   27,
+       27,   27,   24,   24,   24,   27,   27,   27,   27,   27,
+
+       24,   24,   24,   24,   24,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -332,14 +334,14 @@ static yyconst int yy_ec[256] =
         1,    2,    4,    5,    6,    1,    7,    1,    1,    8,
         9,    1,   10,   11,   12,   13,   14,   15,   16,   17,
        18,   19,   20,   21,   21,   21,   21,   22,    1,    1,
-       23,   24,    1,   24,   25,   26,   27,   28,   26,   26,
-       26,   29,   26,   26,   26,   26,   26,   30,   31,   32,
-       26,   33,   34,   26,   35,   26,   36,   26,   26,   26,
-        1,   37,    1,    1,   38,    1,   39,   40,   40,   41,
-
-       42,   43,   40,   40,   44,   40,   40,   45,   46,   47,
-       48,   40,   40,   49,   50,   51,   52,   40,   40,   40,
-       40,   40,    1,    1,    1,    1,    1,    1,    1,    1,
+       23,   24,    1,   24,   25,   26,   27,   28,   29,   26,
+       26,   30,   26,   26,   26,   26,   26,   31,   32,   33,
+       26,   34,   35,   26,   36,   26,   37,   38,   26,   26,
+        1,   39,    1,    1,   40,    1,   41,   42,   42,   43,
+
+       44,   45,   42,   42,   46,   42,   42,   47,   48,   49,
+       50,   42,   42,   51,   52,   53,   54,   42,   42,   42,
+       42,   42,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -356,508 +358,486 @@ static yyconst int yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst int yy_meta[53] =
+static yyconst int yy_meta[55] =
     {   0,
         1,    2,    2,    3,    1,    4,    1,    3,    3,    1,
-        2,    5,    1,    1,    5,    5,    5,    5,    5,    5,
-        5,    6,    4,    3,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    7,    8,    8,    8,
-        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8
+        2,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    5,    4,    3,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    6,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+        7,    7,    7,    7
     } ;
 
-static yyconst short int yy_base[319] =
+static yyconst short int yy_base[338] =
     {   0,
-        0,   26,   61,    0,  112,  113,  120,  156,  192,  243,
-      294,  330,  627,  589,  623, 1808,  619,  619,  584, 1808,
-     1808,  583, 1808,  124,  355,  119,  134, 1808, 1808,  380,
-      586,  579,  417,  557,  558,  551,  546,  545,  556,    0,
-      553, 1808,  551,  160,  429,  155,  170,  454,  555,  545,
-      491,  565,    0, 1808,  561,    0, 1808,  307,   54,    0,
-      526,  343,   93, 1808,  104, 1808,  142,  521,  514,  555,
-      552,  544, 1808,  507,  537,  505,  560,  315,  503,  583,
-      593,  143,    0,    0,  503,    0,  489,  485,  144, 1808,
-      118,  140,  154,  145,  163,  480,  629,    0,  475,  652,
-
-      474,  675,  353,  698,  708,  186,    0,    0,  489,    0,
-      477,  467,  211,  496,    0,  492,  199, 1808,  204,    0,
-      431,  248,  380,  214,  215, 1808, 1808,  427,  219,  251,
-      733,  742,  751,  438,  428,   88,   21,  166,  171,  175,
-      760,  769,  778,  436,  421,  416, 1808,  221,  454,  613,
-      785,  242,  810,  819,  828,  409,  386,  178,  223,  226,
-      837,  264,  846,  855,  864,  360,  345,  265,  873,  882,
-      891,  335,  328,  241,  224,  900,  909,  918,  321,  323,
-      925,  290,  950,  959,  968,  311,  306,  227,  174,  977,
-      301,  986,  995, 1004,  285,  341, 1012,  414,  488,  288,
-
-      356, 1808,  278,  270, 1037,  511,  534,  283, 1044,  323,
-        0,    0,  247,  357,  228,  365, 1068,  351,    0,    0,
-      207,  362, 1077, 1086, 1095, 1104,  402, 1808,  275, 1808,
-     1113, 1122, 1131, 1140, 1147,  313, 1172, 1181, 1190, 1199,
-      559,  190, 1208,  414, 1217, 1226, 1235, 1244,  564, 1253,
-     1262, 1271, 1280,  421, 1289, 1298, 1307, 1316,  518, 1323,
-      439, 1348, 1357, 1366, 1373,  441, 1398, 1407, 1416, 1425,
-     1434, 1443, 1452, 1461, 1470, 1479,  560, 1488, 1497, 1506,
-     1515,  565, 1524, 1533, 1542, 1551, 1560, 1569, 1578, 1587,
-     1596,  172, 1603,  627,  129, 1626,  650, 1808, 1663, 1671,
-
-     1679, 1687, 1695, 1703, 1711, 1719, 1727,  158, 1735, 1743,
-     1751, 1759,  109, 1767, 1775, 1783, 1791, 1799
+        0,   28,   64,    0,   55,  117,  118,  124,  162,  215,
+      268,  306, 1086, 1046, 1079, 1680, 1068, 1053, 1008, 1680,
+     1680,  999, 1680,  128,  333,  154,  161, 1680, 1680,  372,
+      989,  986,  965,  425,  909,  912,  905,  900,  873,  877,
+      170,  868, 1680,  859,  280,  437,  177,  207,  476,  851,
+      832,  823,  529,  837,    0, 1680,  826,    0, 1680,  291,
+       57,    0,  782,  320,  110, 1680,  111, 1680,  136,  773,
+      552,  801,  790,  782, 1680,  737,  575,  694,  598,  297,
+      681,  621,  213,  145,    0,    0,  697,    0,  681,  115,
+      674,  197, 1680,  104,  106,  103,  196,  115,  665,  644,
+
+      345,  658,  667,  656,  690,  331,  713,  422,  207,    0,
+        0,  672,    0,  657,  127,  646,  236,  672,    0,  668,
+      159, 1680,  238,    0,  631,  275,  461,  237,  244, 1680,
+     1680,  624,  248,  372,  526,  549,  572,  622,  609,  617,
+      605,  205,  251,  243,  293,  264,  595,  618,  641,  601,
+      588,  599,  570,  564, 1680,  294,  677,  700,  710,  328,
+      725,  735,  744,  298,  572,  561,  557,  288,  317,  285,
+      753,  329,  762,  771,  780,  336,  551,  543,  534,  342,
+      789,  798,  807,  374, 1680,  532,  515,  521,  405,  412,
+      816,  825,  834,  458,  435,  441,  841,  432,  850,  866,
+
+      875,  458,  398,  460,  426,  393,  884,  638,  893,  902,
+      911,  476,  343,  477,  919,  857,  926,  662, 1680,  347,
+      663, 1680,  429,  435,  946,  932,  953,  267,  959,  330,
+        0,    0,  264,  685,  495,  533,  967,  534,    0,    0,
+      232,  745,  976,  986,  995, 1004, 1007, 1680,  543, 1680,
+     1015, 1024, 1033, 1042, 1049,  695, 1058, 1074, 1083, 1092,
+     1067,  204, 1101,  719, 1110, 1119, 1128, 1137, 1146, 1151,
+     1160, 1171, 1180,  602, 1189, 1198, 1207, 1216, 1223, 1226,
+      987, 1235, 1251, 1260, 1267, 1250, 1277, 1292, 1301, 1310,
+     1319, 1328, 1337, 1346, 1355, 1364, 1261, 1373, 1382, 1391,
+
+     1400, 1383, 1410, 1419, 1428, 1437, 1446, 1455, 1464, 1473,
+     1482,  198, 1489, 1496,  144, 1502, 1514, 1680, 1553, 1560,
+     1567, 1574, 1581, 1588, 1595, 1602, 1609, 1616, 1623, 1630,
+     1637,  124, 1644, 1651, 1658, 1665, 1672
     } ;
 
-static yyconst short int yy_def[319] =
+static yyconst short int yy_def[338] =
     {   0,
-      298,    1,  298,    3,    1,    1,  299,  299,  300,  300,
-      301,  301,  298,  302,  298,  298,  298,  303,  304,  298,
-      298,  305,  298,  306,  302,   25,   25,  298,  298,   25,
-       30,   30,  302,   30,   30,   30,   30,   30,  307,  308,
-      309,  298,  310,  311,  307,   45,   45,   45,   48,   48,
-      307,  298,  312,  298,  312,  312,  298,  298,  298,  313,
-      314,  315,  314,  298,  314,  298,  316,  302,  302,  298,
-      298,  303,  298,  304,  304,  305,  305,  306,  317,  302,
-      302,  302,   25,   25,   25,   30,   30,   30,  302,  298,
-      302,  302,  302,  302,  302,  307,  307,  308,  309,  309,
-
-      310,  310,  311,  307,  307,  307,   45,   45,   45,   48,
-       48,   48,  307,  298,  312,  312,  298,  298,  298,  313,
-      314,  314,  315,  318,  315,  298,  298,  314,  314,  298,
-       25,   25,   25,   30,   30,  302,  302,  302,  302,  302,
-       45,   45,   45,   48,   48,  314,  298,  318,  315,  315,
-      302,  302,   25,   25,   25,   30,   30,  302,  302,  302,
-       45,  307,   45,   45,   45,   48,   48,  318,   25,   25,
-       25,   30,   30,  302,  302,   45,   45,   45,   48,   48,
-      302,  302,   25,   25,   25,   30,   30,  302,  302,   45,
-      307,   45,   45,   45,   48,   48,  302,  197,  197,   30,
-
-      298,  298,  302,  302,   45,  205,  205,   48,  302,  302,
-      197,  197,  197,   30,  302,  302,  205,  307,  205,  205,
-      205,   48,   25,   25,   25,   25,  298,  298,  302,  298,
-       45,   45,   45,   45,  302,  302,   25,   25,   25,   25,
-      302,  302,   45,  307,   45,   45,   45,   45,  307,   25,
-       25,   25,   25,  302,   45,   45,   45,   45,  307,  302,
-      302,   25,   25,   25,  307,  307,   45,   45,   45,   25,
-       25,   25,   45,   45,   45,   25,  302,   25,   25,   25,
-       45,  307,   45,   45,   45,   25,   25,   25,   45,   45,
-       45,  302,  302,  302,  307,  307,  307,    0,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298
+      318,    1,  318,    3,    1,    1,  319,  319,  320,  320,
+      321,  321,  318,  322,  318,  318,  318,  323,  324,  318,
+      318,  325,  318,  326,  322,   25,   25,  318,  318,  318,
+       30,   30,   30,  322,   30,   30,   30,   30,   30,  327,
+      318,  328,  318,  329,  330,  327,   46,   46,  318,   49,
+       49,   49,  327,  318,  331,  318,  331,  331,  318,  318,
+      318,  332,  333,  334,  333,  318,  333,  318,  335,  322,
+      322,  318,  318,  323,  318,  324,  324,  325,  325,  326,
+      336,  322,  322,  322,   25,   25,   25,   30,   30,   30,
+       30,  322,  318,  322,  322,  322,  322,  322,  327,  327,
+
+      318,  328,  328,  329,  329,  330,  327,  327,  327,   46,
+       46,   46,   49,   49,   49,   49,  327,  318,  331,  331,
+      318,  318,  318,  332,  333,  333,  334,  337,  334,  318,
+      318,  333,  333,  318,   25,   25,   25,   30,   30,   30,
+       30,  322,  322,  322,  322,  322,   46,   46,   46,   49,
+       49,   49,   49,  333,  318,  337,  334,  334,  322,  322,
+       25,   25,   25,   30,   30,   30,   30,  322,  322,  322,
+       46,  327,   46,   46,   46,   49,   49,   49,   49,  337,
+       25,   25,   25,  318,  318,   30,   30,   30,  322,  322,
+       46,   46,   46,   49,   49,   49,  322,  322,   25,   25,
+
+       25,   30,   30,   30,  322,  322,   46,  327,   46,   46,
+       46,   49,   49,   49,  322,  215,  215,  318,  318,   30,
+      318,  318,  322,  322,   46,  225,  225,   49,  322,  322,
+      215,  215,  215,   30,  322,  322,  225,  327,  225,  225,
+      225,   49,   25,   25,   25,   25,  318,  318,  322,  318,
+       46,   46,   46,   46,  322,  322,   25,   25,   25,   25,
+      322,  322,   46,  327,   46,   46,   46,   46,  327,   25,
+       25,   25,   25,  322,   46,   46,   46,   46,  327,  322,
+      322,   25,   25,   25,  327,  327,   46,   46,   46,   25,
+       25,   25,   46,   46,   46,   25,  322,   25,   25,   25,
+
+       46,  327,   46,   46,   46,   25,   25,   25,   46,   46,
+       46,  322,  322,  322,  327,  327,  327,    0,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318
     } ;
 
-static yyconst short int yy_nxt[1861] =
+static yyconst short int yy_nxt[1735] =
     {   0,
        14,   15,   16,   17,   14,   18,   19,   20,   21,   22,
        23,   14,   14,   24,   25,   26,   27,   25,   25,   25,
-       25,   28,   29,   21,   30,   30,   30,   30,   30,   31,
-       30,   32,   30,   30,   30,   30,   33,   14,   14,   14,
+       25,   28,   29,   21,   30,   30,   30,   30,   31,   30,
+       32,   30,   33,   30,   30,   30,   30,   30,   34,   14,
        14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
-       14,   14,   34,   35,   36,  119,   90,   69,   37,  159,
-       38,   39,   15,   16,   17,   39,   40,   41,   21,   42,
-       43,   23,   39,   39,   44,   45,   46,   47,   45,   45,
-       45,   45,   28,   29,   21,   48,   48,   48,   48,   48,
-       49,   48,   50,   48,   48,   48,   48,   51,   39,   39,
-
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   52,   52,  126,  120,   21,   21,   21,
-       21,   15,   54,   55,   69,   56,  127,   79,  158,  122,
-       57,   79,   79,   83,   83,   83,   83,   83,   83,   83,
-      122,   57,   56,  129,   90,  119,   90,   79,   84,   84,
-       84,   84,   84,   85,   69,   81,   58,   15,   54,   55,
-       80,   56,   98,   79,  136,   97,   57,   79,   79,  107,
-      107,  107,  107,  107,  107,  107,   69,   57,   56,   69,
-       69,   69,  137,   79,  108,  108,  108,  108,  108,  109,
-       69,  139,   58,   15,   16,   17,  104,   18,  105,   69,
-
-      119,   90,   69,  138,  140,  119,   90,   69,   69,  160,
-       69,   69,  119,   90,   69,  174,  158,  124,  147,  149,
-      119,   90,   97,  158,  204,  168,   69,   96,   59,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   15,   16,   17,   97,   18,  121,
-      148,  150,   79,  121,  151,  122,   79,  148,  121,   69,
-       69,   79,   69,   69,   69,  188,  229,   68,  189,  147,
-      121,  203,   79,   79,  175,  158,  161,   69,   69,   59,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   15,   16,   17,   62,   18,
-
-       97,  148,  181,   63,   64,   65,   69,  201,  117,   90,
-      222,   69,  118,  190,   69,  214,   66,  118,   79,  216,
-      208,  215,   79,   79,  242,  235,   69,  202,  118,  118,
-       67,   15,   16,   17,   62,   18,  209,   97,   79,   63,
-       64,   65,  201,  118,  124,  124,  200,  121,  124,   69,
-      196,   80,   66,  124,  195,  187,   79,  201,  227,   69,
-       79,   79,  202,  227,  217,  124,   67,   81,  186,   82,
-       82,   82,   82,   82,   82,   82,   79,  202,  228,  125,
-      180,  124,  124,  228,  146,  124,  230,   97,  230,  104,
-      124,   69,   68,  179,   86,   86,   86,   86,   86,   86,
-
-       86,   69,  124,  227,   86,   86,   86,   86,   86,   86,
-       86,   86,   86,   86,   86,   86,  125,   86,   89,   90,
-       68,  173,   68,  228,   68,   68,  243,   68,  211,  211,
-      211,  211,  211,  211,  211,  254,  254,  254,   68,   68,
-       68,  105,  172,  106,  106,  106,  106,  106,  106,  106,
-       97,  260,  122,  265,  167,  124,  124,   69,  146,  124,
-      166,  157,  156,  122,  124,   97,   96,  122,  110,  110,
-      110,  110,  110,  110,  110,   69,  124,   97,  110,  110,
-      110,  110,  110,  110,  110,  110,  110,  110,  110,  110,
-      125,  110,  113,   90,   96,  116,   96,  114,   96,   96,
-
-      145,   96,  212,  212,  212,  212,  212,  213,  144,   96,
-      102,  100,   96,   96,   96,   68,   97,   68,  135,   68,
-      134,   68,   68,   68,   68,  219,  219,  219,  219,  219,
-      219,  219,  259,  259,  259,   68,   68,   68,   74,  130,
-       74,   77,   74,   75,   74,   74,   73,   74,  220,  220,
-      220,  220,  220,  221,   97,   71,   70,   69,   74,   74,
-       74,   76,  122,   76,  116,   76,  114,   76,   76,  112,
-       76,  235,  276,  254,  254,  254,  243,  281,  259,  259,
-      259,   76,   76,   76,   78,  111,   68,  102,   78,  100,
-       68,   68,   97,   78,   95,   69,   69,   94,   93,   92,
-
-       97,   97,   91,   88,   78,   78,   68,  131,  132,  133,
-      131,  131,  131,  131,  124,  124,   87,  149,  124,   77,
-       75,   73,   71,  124,   70,   69,  298,  298,  298,   69,
-       96,  298,   96,  298,   96,  124,   96,   96,  298,   96,
-      298,  292,  292,  292,  292,  292,  292,  298,  298,  125,
-       96,   96,   96,   99,  298,   99,  298,   99,  298,   99,
-       99,  298,   99,   69,  295,  295,  295,  295,  295,  295,
-      298,  298,  298,   99,   99,   99,  101,  298,  101,  298,
-      101,  298,  101,  101,  298,  101,   97,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  101,  101,  101,  103,
-
-      298,   96,  298,  103,  298,   96,   96,  298,  103,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  103,
-      103,   96,  141,  142,  143,  141,  141,  141,  141,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,   97,  151,  298,  152,  152,  152,
-      152,  152,  152,  152,  151,  298,  153,  153,  153,  153,
-      153,  153,  153,  151,  298,  154,  154,  154,  154,  154,
-      155,  152,  161,  298,  162,  162,  162,  162,  162,  162,
-      162,  161,  298,  163,  163,  163,  163,  163,  163,  163,
-      161,  298,  164,  164,  164,  164,  164,  165,  162,  169,
-
-      170,  171,  169,  169,  169,  169,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,   69,  151,  298,  152,  152,  152,  152,  152,  152,
-      152,  151,  298,  152,  152,  152,  152,  152,  152,  152,
-      151,  298,  152,  152,  152,  152,  152,  152,   68,   96,
-      298,  176,  177,  178,  176,  176,  176,  176,  161,  298,
-      162,  162,  162,  162,  162,  162,  162,  161,  298,  162,
-      162,  162,  162,  162,  162,  162,  161,  298,  162,  162,
-      162,  162,  162,  162,   96,  181,  298,  182,  182,  182,
-      182,  182,  182,  182,  181,  298,  183,  183,  183,  183,
-
-      183,  183,  183,  181,  298,  184,  184,  184,  184,  184,
-      185,  182,  190,  298,  191,  191,  191,  191,  191,  191,
-      191,  190,  298,  192,  192,  192,  192,  192,  192,  192,
-      190,  298,  193,  193,  193,  193,  193,  194,  191,  197,
-      198,  199,  197,  197,  197,  197,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,   69,  181,  298,  182,  182,  182,  182,  182,  182,
-      182,  181,  298,  182,  182,  182,  182,  182,  182,  182,
-      181,  298,  182,  182,  182,  182,  182,  182,   68,   96,
-      298,  205,  206,  207,  205,  205,  205,  205,  190,  298,
-
-      191,  191,  191,  191,  191,  191,  191,  190,  298,  191,
-      191,  191,  191,  191,  191,  191,  190,  298,  191,  191,
-      191,  191,  191,  191,   96,  209,  210,  210,  210,  210,
-      210,  210,  210,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,   69,   96,
-      217,  218,  218,  218,  218,  218,  218,  218,  223,  224,
-      225,  226,  223,  223,  223,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-       69,   96,  231,  232,  233,  234,  231,  231,  231,  235,
-      298,  236,  236,  236,  236,  236,  236,  236,  235,  298,
-
-      237,  237,  237,  237,  237,  237,  237,  235,  298,  238,
-      238,  238,  238,  238,  239,  240,  235,  298,  241,  241,
-      241,  236,  236,  236,  236,  243,  298,  244,  244,  244,
-      244,  244,  244,  244,  243,  298,  245,  245,  245,  245,
-      245,  245,  245,  243,  298,  246,  246,  246,  246,  246,
-      247,  248,  243,  298,  249,  249,  249,  244,  244,  244,
-      244,  250,  251,  252,  250,  250,  250,  250,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,   69,  235,  298,  240,  240,  240,  240,
-      240,  240,  240,  235,  298,  240,  240,  240,  240,  240,
-
-      240,  240,  235,  298,  240,  240,  240,  240,  240,  240,
-      253,  235,  298,  253,  253,  253,  253,  253,  253,  253,
-       96,  298,  255,  256,  257,  255,  255,  255,  255,  243,
-      298,  248,  248,  248,  248,  248,  248,  248,  243,  298,
-      248,  248,  248,  248,  248,  248,  248,  243,  298,  248,
-      248,  248,  248,  248,  248,  258,  243,  298,  258,  258,
-      258,  258,  258,  258,  258,  260,  298,  261,  261,  261,
-      261,  261,  261,  261,  260,  298,  262,  262,  262,  262,
-      262,  262,  262,  260,  298,  263,  263,  263,  263,  263,
-      264,  261,   68,  298,  253,  253,  253,  253,  253,  253,
-
-      253,  265,  298,  266,  266,  266,  266,  266,  266,  266,
-      265,  298,  267,  267,  267,  267,  267,  267,  267,  265,
-      298,  268,  268,  268,  268,  268,  269,  266,   96,  298,
-      258,  258,  258,  258,  258,  258,  258,  270,  271,  272,
-      270,  270,  270,  270,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   69,
-      260,  298,  261,  261,  261,  261,  261,  261,  261,  260,
-      298,  261,  261,  261,  261,  261,  261,  261,  260,  298,
-      261,  261,  261,  261,  261,  261,   68,  273,  274,  275,
-      273,  273,  273,  273,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   97,
-      265,  298,  266,  266,  266,  266,  266,  266,  266,  265,
-      298,  266,  266,  266,  266,  266,  266,  266,  265,  298,
-      266,  266,  266,  266,  266,  266,   96,  276,  298,  277,
-      277,  277,  277,  277,  277,  277,  276,  298,  278,  278,
-      278,  278,  278,  278,  278,  276,  298,  279,  279,  279,
-      279,  279,  280,  277,  281,  298,  282,  282,  282,  282,
-      282,  282,  282,  281,  298,  283,  283,  283,  283,  283,
-      283,  283,  281,  298,  284,  284,  284,  284,  284,  285,
-      282,   68,  298,  286,  287,  288,  286,  286,  286,  286,
-
-      276,  298,  277,  277,  277,  277,  277,  277,  277,  276,
-      298,  277,  277,  277,  277,  277,  277,  277,  276,  298,
-      277,  277,  277,  277,  277,  277,   68,   96,  298,  289,
-      290,  291,  289,  289,  289,  289,  281,  298,  282,  282,
-      282,  282,  282,  282,  282,  281,  298,  282,  282,  282,
-      282,  282,  282,  282,  281,  298,  282,  282,  282,  282,
-      282,  282,   96,   68,  298,  292,  292,  292,  292,  292,
-      292,  292,   68,  298,  286,  286,  286,  286,  286,  286,
-      286,   68,  298,  293,  293,  293,  293,  293,  294,  292,
-       96,  298,  295,  295,  295,  295,  295,  295,  295,   96,
-
-      298,  289,  289,  289,  289,  289,  289,  289,   96,  298,
-      296,  296,  296,  296,  296,  297,  295,  292,  292,  292,
-      292,  292,  292,  292,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   69,
-      295,  295,  295,  295,  295,  295,  295,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,   97,   53,   53,   53,   53,   53,   53,   53,
-       53,   21,   21,   21,   21,   21,   21,   21,   21,   61,
-       61,   61,   61,   61,   61,   61,   61,   68,  298,  298,
-      298,   68,  298,   68,   68,   72,   72,   72,   72,   72,
-
-       72,   72,   72,   74,  298,  298,  298,   74,  298,   74,
-       74,   76,  298,  298,  298,   76,  298,   76,   76,   78,
-      298,   78,  298,   78,  298,   78,   78,   96,  298,  298,
-      298,   96,  298,   96,   96,   99,  298,  298,  298,   99,
-      298,   99,   99,  101,  298,  298,  298,  101,  298,  101,
-      101,  103,  298,  103,  298,  103,  298,  103,  103,  115,
-      298,  115,  115,  115,  298,  298,  115,  121,  298,  121,
-      298,  121,  121,  121,  121,  123,  123,  123,  123,  123,
-      123,  123,  123,  128,  128,  128,  128,  128,  128,  128,
-      128,   79,  298,   79,  298,   79,  298,   79,   79,  124,
-
-      124,  124,  124,  124,  124,  124,  124,   13,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298
+       14,   14,   14,   14,   35,   36,   54,   37,  123,   93,
+       21,   38,   21,   39,   40,   15,   16,   17,   40,   41,
+       42,   21,   43,   44,   23,   40,   40,   45,   46,   47,
+       48,   46,   46,   46,   46,   28,   29,   21,   49,   49,
+       49,   49,   50,   49,   51,   49,   52,   49,   49,   49,
+
+       49,   49,   53,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   54,   15,
+       56,   57,   21,   58,   21,   15,   56,   57,   59,   58,
+      124,   81,  130,  131,   59,   81,   81,  133,   93,   59,
+       58,   71,   71,  139,   71,   59,   58,  140,  126,  126,
+      143,   81,  142,   71,  144,  151,   60,   83,  146,  152,
+      123,   93,   60,   15,   16,   17,   82,   18,   85,   85,
+       85,   85,   85,   85,   85,   86,   86,   86,   86,   86,
+       87,  101,  100,   71,  101,  101,  101,  101,  101,  101,
+      101,  110,  110,  110,  110,  110,  110,  110,  123,   93,
+
+       61,   62,   62,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   15,   16,   17,  108,
+       18,  111,  111,  111,  111,  111,  112,  135,  136,  137,
+      135,  135,  135,  135,   71,   71,   71,  123,   93,  123,
+       93,  155,   71,   71,  145,  100,  128,  168,  157,  123,
+       93,   71,   99,   61,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,   62,   15,
+       16,   17,   64,   18,  100,  156,  125,   65,   66,   67,
+      125,   71,  158,   81,   70,  125,  126,   81,   81,   71,
+       68,  169,  121,   93,  242,  168,  122,  125,  180,  184,
+
+       81,  122,   71,   81,   81,   81,   69,   15,   16,   17,
+       64,   18,  122,  122,  168,   65,   66,   67,  107,  185,
+       81,  128,  128,   71,  125,  128,   71,  189,   68,  122,
+      128,   71,  156,  170,   81,   82,  168,  184,   81,   81,
+      159,  171,  128,  229,   69,   83,  155,   84,   84,   84,
+       84,   84,   84,   84,   81,   71,  101,  185,  129,  101,
+      101,  101,  101,  101,  101,  101,   71,  100,   71,  107,
+      190,   71,   70,   81,  234,  184,   70,   81,   70,  228,
+      156,   70,   81,   70,   70,   70,   88,   88,   88,   88,
+       88,   88,   88,   81,   81,  185,   88,   88,   88,   88,
+
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       71,   88,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   92,   93,   70,  205,
+       70,   71,   70,   70,  220,   70,  147,  148,  149,  147,
+      147,  147,  147,   71,  197,  224,   70,   70,   70,  108,
+       71,  109,  109,  109,  109,  109,  109,  109,  206,  218,
+      100,  221,  128,  128,   71,  154,  128,   71,  214,  213,
+       71,  128,  223,   71,  235,  100,   99,  218,  221,  219,
+       99,  222,   99,  128,  212,   99,  236,   99,   99,   99,
+      113,  113,  113,  113,  113,  113,  113,  219,  222,  129,
+
+      113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
+      113,  113,  113,  113,  100,  113,   99,   99,   99,   99,
+       99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
+      117,   93,   99,   71,   99,  249,   99,   99,  159,   99,
+      160,  160,  160,  160,  160,  160,  160,  237,  204,  203,
+       99,   99,   99,   70,  250,   70,  250,   70,  202,   70,
+       70,  159,   70,  161,  161,  161,  161,  161,  161,  161,
+      196,   71,  100,   70,   70,   70,   76,  195,   76,  194,
+       76,   71,   76,   76,  159,   76,  162,  162,  162,  162,
+      162,  163,  160,  188,  262,  187,   76,   76,   76,   78,
+
+      186,   78,  126,   78,  179,   78,   78,  171,   78,  172,
+      172,  172,  172,  172,  172,  172,  274,  274,  274,   78,
+       78,   78,   80,  178,   70,  177,   80,  176,   70,   70,
+      171,   80,  173,  173,  173,  173,  173,  173,  173,  167,
+       71,  166,   80,   80,   70,   99,  165,   99,  164,   99,
+      207,   99,   99,  171,   99,  174,  174,  174,  174,  174,
+      175,  172,  126,  218,  221,   99,   99,   99,  102,  126,
+      102,  120,  102,  118,  102,  102,  100,  102,  128,  128,
+      153,  154,  128,  219,  222,  150,  247,  128,  102,  102,
+      102,  104,   99,  104,  105,  104,  103,  104,  104,  128,
+
+      104,  128,  128,  100,  157,  128,  248,  255,  141,  138,
+      128,  104,  104,  104,  106,  129,   99,   70,  106,  134,
+       99,   99,  128,  106,  181,  182,  183,  181,  181,  181,
+      181,  263,   79,   71,  106,  106,   99,  159,  129,  160,
+      160,  160,  160,  160,  160,  160,  247,  159,   71,  160,
+      160,  160,  160,  160,  160,  160,  159,  100,  160,  160,
+      160,  160,  160,  160,   70,   99,  248,  191,  192,  193,
+      191,  191,  191,  191,  171,   77,  172,  172,  172,  172,
+      172,  172,  172,  171,   75,  172,  172,  172,  172,  172,
+      172,  172,  171,   73,  172,  172,  172,  172,  172,  172,
+
+       99,  197,   72,  198,  198,  198,  198,  198,  198,  198,
+      197,   71,  199,  199,  199,  199,  199,  199,  199,  197,
+      126,  200,  200,  200,  200,  200,  201,  198,  207,  120,
+      208,  208,  208,  208,  208,  208,  208,  207,  118,  209,
+      209,  209,  209,  209,  209,  209,  207,  116,  210,  210,
+      210,  210,  210,  211,  208,  215,  216,  217,  215,  215,
+      215,  215,  197,  115,  198,  198,  198,  198,  198,  198,
+      198,  231,  231,  231,  231,  231,  231,  231,  197,   71,
+      198,  198,  198,  198,  198,  198,  198,  197,  114,  198,
+      198,  198,  198,  198,  198,   70,   99,  105,  225,  226,
+
+      227,  225,  225,  225,  225,  207,  103,  208,  208,  208,
+      208,  208,  208,  208,  207,  100,  208,  208,  208,  208,
+      208,  208,  208,  207,   98,  208,  208,  208,  208,  208,
+      208,   99,  229,  230,  230,  230,  230,  230,  230,  230,
+      232,  232,  232,  232,  232,  233,  239,  239,  239,  239,
+      239,  239,  239,   97,   96,   95,   94,   71,   99,  237,
+      238,  238,  238,  238,  238,  238,  238,  240,  240,  240,
+      240,  240,  241,  243,  244,  245,  246,  243,  243,  243,
+       99,  251,  252,  253,  254,  251,  251,  251,  255,   91,
+      256,  256,  256,  256,  256,  256,  256,   71,  255,  280,
+
+      257,  257,  257,  257,  257,  257,  257,  255,  247,  258,
+      258,  258,  258,  258,  259,  260,  255,   90,  261,  261,
+      261,  256,  256,  256,  256,   71,   89,  263,  248,  264,
+      264,  264,  264,  264,  264,  264,  263,   79,  265,  265,
+      265,  265,  265,  265,  265,  263,   77,  266,  266,  266,
+      266,  266,  267,  268,  263,   75,  269,  269,  269,  264,
+      264,  264,  264,  270,  271,  272,  270,  270,  270,  270,
+      255,   73,  260,  260,  260,  260,  260,  260,  260,  255,
+       72,  274,  274,  274,   71,  318,  255,   71,  260,  260,
+      260,  260,  260,  260,  260,  255,  318,  260,  260,  260,
+
+      260,  260,  260,  273,  255,   71,  273,  273,  273,  273,
+      273,  273,  273,   99,  318,  275,  276,  277,  275,  275,
+      275,  275,  263,  318,  268,  268,  268,  268,  268,  268,
+      268,  263,  318,  268,  268,  268,  268,  268,  268,  268,
+      263,  318,  268,  268,  268,  268,  268,  268,  278,  263,
+      318,  278,  278,  278,  278,  278,  278,  278,  263,  318,
+      279,  279,  279,  280,  318,  281,  281,  281,  281,  281,
+      281,  281,  280,  318,  282,  282,  282,  282,  282,  282,
+      282,  318,  318,  280,  100,  283,  283,  283,  283,  283,
+      284,  281,   70,  318,  273,  273,  273,  273,  273,  273,
+
+      273,  285,  318,  286,  286,  286,  286,  286,  286,  286,
+      285,  318,  287,  287,  287,  287,  287,  287,  287,  285,
+      318,  288,  288,  288,  288,  288,  289,  286,   99,  318,
+      278,  278,  278,  278,  278,  278,  278,  279,  279,  279,
+      290,  291,  292,  290,  290,  290,  290,  280,  318,  281,
+      281,  281,  281,  281,  281,  281,  318,  318,  318,  318,
+      318,  100,  285,  280,   71,  281,  281,  281,  281,  281,
+      281,  281,  280,  296,  281,  281,  281,  281,  281,  281,
+       70,  293,  294,  295,  293,  293,  293,  293,  100,  285,
+      318,  286,  286,  286,  286,  286,  286,  286,  318,   71,
+
+      318,  318,  318,  318,  285,  100,  286,  286,  286,  286,
+      286,  286,  286,  285,  318,  286,  286,  286,  286,  286,
+      286,   99,  296,  318,  297,  297,  297,  297,  297,  297,
+      297,  296,  318,  298,  298,  298,  298,  298,  298,  298,
+      296,  318,  299,  299,  299,  299,  299,  300,  297,  301,
+      318,  302,  302,  302,  302,  302,  302,  302,  301,  318,
+      303,  303,  303,  303,  303,  303,  303,  301,  318,  304,
+      304,  304,  304,  304,  305,  302,   70,  318,  306,  307,
+      308,  306,  306,  306,  306,  296,  318,  297,  297,  297,
+      297,  297,  297,  297,  296,  301,  297,  297,  297,  297,
+
+      297,  297,  297,  296,  318,  297,  297,  297,  297,  297,
+      297,   70,   99,  318,  309,  310,  311,  309,  309,  309,
+      309,  100,  301,  318,  302,  302,  302,  302,  302,  302,
+      302,  301,  318,  302,  302,  302,  302,  302,  302,  302,
+      301,  318,  302,  302,  302,  302,  302,  302,   99,   70,
+      318,  312,  312,  312,  312,  312,  312,  312,   70,  318,
+      306,  306,  306,  306,  306,  306,  306,   70,  318,  313,
+      313,  313,  313,  313,  314,  312,   99,  318,  315,  315,
+      315,  315,  315,  315,  315,   99,  318,  309,  309,  309,
+      309,  309,  309,  309,   99,  318,  316,  316,  316,  316,
+
+      316,  317,  315,  312,  312,  312,  312,  312,  312,  312,
+      312,  312,  312,  312,  312,  312,  315,  315,  315,  315,
+      315,  315,  315,  318,  318,  318,  318,   71,  315,  315,
+      315,  315,  315,  315,   71,  318,  318,  318,  318,  318,
+      100,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  100,   55,   55,   55,   55,   55,   55,   55,
+       21,   21,   21,   21,   21,   21,   21,   63,   63,   63,
+       63,   63,   63,   63,   70,  318,  318,  318,  318,   70,
+       70,   74,   74,   74,   74,   74,   74,   74,   76,  318,
+      318,  318,  318,   76,   76,   78,  318,  318,  318,  318,
+
+       78,   78,   80,  318,   80,  318,  318,   80,   80,   99,
+      318,  318,  318,  318,   99,   99,  102,  318,  318,  318,
+      318,  102,  102,  104,  318,  318,  318,  318,  104,  104,
+      106,  318,  106,  318,  318,  106,  106,  119,  318,  119,
+      119,  318,  318,  119,  125,  318,  125,  318,  125,  125,
+      125,  127,  127,  127,  127,  127,  127,  127,  132,  132,
+      132,  132,  132,  132,  132,   81,  318,   81,  318,  318,
+       81,   81,  128,  128,  128,  128,  128,  128,  128,   13,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318
     } ;
 
-static yyconst short int yy_chk[1861] =
+static yyconst short int yy_chk[1735] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    2,    2,    2,   59,   59,  137,    2,  137,
-        2,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        1,    1,    1,    1,    2,    2,    5,    2,   61,   61,
+        5,    2,    5,    2,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
 
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    5,    6,   63,  313,    5,    6,    5,
-        6,    7,    7,    7,  136,    7,   65,   24,  136,   63,
-        7,   24,   24,   26,   26,   26,   26,   26,   26,   26,
-       65,    7,    7,   67,   67,   89,   89,   24,   27,   27,
-       27,   27,   27,   27,   91,   82,    7,    8,    8,    8,
-       24,    8,  308,   44,   91,  295,    8,   44,   44,   46,
-       46,   46,   46,   46,   46,   46,   92,    8,    8,   82,
-       89,   94,   92,   44,   47,   47,   47,   47,   47,   47,
-       93,   94,    8,    9,    9,    9,   44,    9,  106,   95,
-
-      117,  117,  138,   93,   95,  119,  119,  139,  292,  139,
-      189,  140,  113,  113,  158,  158,  138,  125,  124,  125,
-      129,  129,  106,  140,  189,  148,  242,  221,    9,    9,
+        3,    3,    3,    3,    3,    3,    3,    3,    6,    7,
+        7,    7,    6,    7,    6,    8,    8,    8,    7,    8,
+      332,   24,   65,   67,    8,   24,   24,   69,   69,    7,
+        7,   96,   94,   90,   95,    8,    8,   90,   65,   67,
+       95,   24,   94,   98,   96,  115,    7,   84,   98,  115,
+      121,  121,    8,    9,    9,    9,   24,    9,   26,   26,
+       26,   26,   26,   26,   26,   27,   27,   27,   27,   27,
+       27,   41,  315,   84,   41,   41,   41,   41,   41,   41,
+       41,   47,   47,   47,   47,   47,   47,   47,   92,   92,
+
         9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
-        9,    9,    9,    9,   10,   10,   10,  113,   10,  122,
-      124,  125,  130,  122,  152,  129,  130,  148,  122,  159,
-      175,  130,  160,  188,  215,  174,  215,  213,  175,  168,
-      122,  188,  130,  130,  159,  160,  162,  174,  152,   10,
-       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
-       10,   10,   10,   10,   10,   11,   11,   11,   11,   11,
-
-      162,  168,  182,   11,   11,   11,  204,  187,   58,   58,
-      208,  229,   58,  191,  203,  200,   11,   58,   78,  204,
-      195,  203,   78,   78,  229,  236,  182,  187,   58,   58,
-       11,   12,   12,   12,   12,   12,  210,  191,   78,   12,
-       12,   12,  196,   58,   62,   62,  186,   62,   62,  236,
-      180,   78,   12,   62,  179,  173,  103,  201,  214,  210,
-      103,  103,  196,  222,  218,   62,   12,   25,  172,   25,
-       25,   25,   25,   25,   25,   25,  103,  201,  214,   62,
-      167,  123,  123,  222,  123,  123,  216,  218,  216,  103,
-      123,   25,   30,  166,   30,   30,   30,   30,   30,   30,
-
-       30,  216,  123,  227,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,  123,   30,   33,   33,
-       33,  157,   33,  227,   33,   33,  244,   33,  198,  198,
-      198,  198,  198,  198,  198,  254,  254,  254,   33,   33,
-       33,   45,  156,   45,   45,   45,   45,   45,   45,   45,
-      244,  261,  146,  266,  145,  149,  149,  254,  149,  149,
-      144,  135,  134,  128,  149,   45,   48,  121,   48,   48,
-       48,   48,   48,   48,   48,  261,  149,  266,   48,   48,
-       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
-      149,   48,   51,   51,   51,  116,   51,  114,   51,   51,
-
-      112,   51,  199,  199,  199,  199,  199,  199,  111,  109,
-      101,   99,   51,   51,   51,   69,   96,   69,   88,   69,
-       87,   69,   69,   85,   69,  206,  206,  206,  206,  206,
-      206,  206,  259,  259,  259,   69,   69,   69,   75,   79,
-       75,   76,   75,   74,   75,   75,   72,   75,  207,  207,
-      207,  207,  207,  207,  259,   71,   70,   68,   75,   75,
-       75,   77,   61,   77,   55,   77,   52,   77,   77,   50,
-       77,  241,  277,  241,  241,  241,  249,  282,  249,  249,
-      249,   77,   77,   77,   80,   49,   80,   43,   80,   41,
-       80,   80,   39,   80,   38,  241,  277,   37,   36,   35,
-
-      249,  282,   34,   32,   80,   80,   80,   81,   81,   81,
-       81,   81,   81,   81,  150,  150,   31,  150,  150,   22,
-       19,   18,   17,  150,   15,   14,   13,    0,    0,   81,
-       97,    0,   97,    0,   97,  150,   97,   97,    0,   97,
-        0,  294,  294,  294,  294,  294,  294,    0,    0,  150,
-       97,   97,   97,  100,    0,  100,    0,  100,    0,  100,
-      100,    0,  100,  294,  297,  297,  297,  297,  297,  297,
-        0,    0,    0,  100,  100,  100,  102,    0,  102,    0,
-      102,    0,  102,  102,    0,  102,  297,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  102,  102,  102,  104,
-
-        0,  104,    0,  104,    0,  104,  104,    0,  104,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  104,
-      104,  104,  105,  105,  105,  105,  105,  105,  105,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  105,  131,    0,  131,  131,  131,
-      131,  131,  131,  131,  132,    0,  132,  132,  132,  132,
-      132,  132,  132,  133,    0,  133,  133,  133,  133,  133,
-      133,  133,  141,    0,  141,  141,  141,  141,  141,  141,
-      141,  142,    0,  142,  142,  142,  142,  142,  142,  142,
-      143,    0,  143,  143,  143,  143,  143,  143,  143,  151,
-
-      151,  151,  151,  151,  151,  151,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  151,  153,    0,  153,  153,  153,  153,  153,  153,
-      153,  154,    0,  154,  154,  154,  154,  154,  154,  154,
-      155,    0,  155,  155,  155,  155,  155,  155,  155,  161,
-        0,  161,  161,  161,  161,  161,  161,  161,  163,    0,
-      163,  163,  163,  163,  163,  163,  163,  164,    0,  164,
-      164,  164,  164,  164,  164,  164,  165,    0,  165,  165,
-      165,  165,  165,  165,  165,  169,    0,  169,  169,  169,
-      169,  169,  169,  169,  170,    0,  170,  170,  170,  170,
-
-      170,  170,  170,  171,    0,  171,  171,  171,  171,  171,
-      171,  171,  176,    0,  176,  176,  176,  176,  176,  176,
-      176,  177,    0,  177,  177,  177,  177,  177,  177,  177,
-      178,    0,  178,  178,  178,  178,  178,  178,  178,  181,
-      181,  181,  181,  181,  181,  181,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  181,  183,    0,  183,  183,  183,  183,  183,  183,
-      183,  184,    0,  184,  184,  184,  184,  184,  184,  184,
-      185,    0,  185,  185,  185,  185,  185,  185,  185,  190,
-        0,  190,  190,  190,  190,  190,  190,  190,  192,    0,
-
-      192,  192,  192,  192,  192,  192,  192,  193,    0,  193,
-      193,  193,  193,  193,  193,  193,  194,    0,  194,  194,
-      194,  194,  194,  194,  194,  197,  197,  197,  197,  197,
-      197,  197,  197,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  197,  205,
-      205,  205,  205,  205,  205,  205,  205,  205,  209,  209,
-      209,  209,  209,  209,  209,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      209,  217,  217,  217,  217,  217,  217,  217,  217,  223,
-        0,  223,  223,  223,  223,  223,  223,  223,  224,    0,
-
-      224,  224,  224,  224,  224,  224,  224,  225,    0,  225,
-      225,  225,  225,  225,  225,  225,  226,    0,  226,  226,
-      226,  226,  226,  226,  226,  231,    0,  231,  231,  231,
-      231,  231,  231,  231,  232,    0,  232,  232,  232,  232,
-      232,  232,  232,  233,    0,  233,  233,  233,  233,  233,
-      233,  233,  234,    0,  234,  234,  234,  234,  234,  234,
-      234,  235,  235,  235,  235,  235,  235,  235,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  235,  237,    0,  237,  237,  237,  237,
-      237,  237,  237,  238,    0,  238,  238,  238,  238,  238,
-
-      238,  238,  239,    0,  239,  239,  239,  239,  239,  239,
-      239,  240,    0,  240,  240,  240,  240,  240,  240,  240,
-      243,    0,  243,  243,  243,  243,  243,  243,  243,  245,
-        0,  245,  245,  245,  245,  245,  245,  245,  246,    0,
-      246,  246,  246,  246,  246,  246,  246,  247,    0,  247,
-      247,  247,  247,  247,  247,  247,  248,    0,  248,  248,
-      248,  248,  248,  248,  248,  250,    0,  250,  250,  250,
-      250,  250,  250,  250,  251,    0,  251,  251,  251,  251,
-      251,  251,  251,  252,    0,  252,  252,  252,  252,  252,
-      252,  252,  253,    0,  253,  253,  253,  253,  253,  253,
-
-      253,  255,    0,  255,  255,  255,  255,  255,  255,  255,
-      256,    0,  256,  256,  256,  256,  256,  256,  256,  257,
-        0,  257,  257,  257,  257,  257,  257,  257,  258,    0,
-      258,  258,  258,  258,  258,  258,  258,  260,  260,  260,
-      260,  260,  260,  260,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  260,
-      262,    0,  262,  262,  262,  262,  262,  262,  262,  263,
-        0,  263,  263,  263,  263,  263,  263,  263,  264,    0,
-      264,  264,  264,  264,  264,  264,  264,  265,  265,  265,
-      265,  265,  265,  265,    0,    0,    0,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  265,
+        9,    9,    9,    9,    9,    9,   10,   10,   10,  109,
+       10,   48,   48,   48,   48,   48,   48,   83,   83,   83,
+       83,   83,   83,   83,   97,   92,  312,  117,  117,  123,
+      123,  128,  262,  142,   97,  109,  129,  142,  129,  133,
+      133,   83,  241,   10,   10,   10,   10,   10,   10,   10,
+       10,   10,   10,   10,   10,   10,   10,   10,   10,   11,
+       11,   11,   11,   11,  117,  128,  126,   11,   11,   11,
+      126,  144,  129,   45,  233,  126,  133,   45,   45,  143,
+       11,  143,   60,   60,  228,  144,   60,  126,  156,  164,
+
+       80,   60,  146,   45,   80,   80,   11,   12,   12,   12,
+       12,   12,   60,   60,  146,   12,   12,   12,   45,  164,
+       80,   64,   64,  170,   64,   64,  168,  168,   12,   60,
+       64,  145,  156,  145,  106,   80,  170,  176,  106,  106,
+      160,  172,   64,  230,   12,   25,  180,   25,   25,   25,
+       25,   25,   25,   25,  106,  169,  101,  176,   64,  101,
+      101,  101,  101,  101,  101,  101,  160,  172,  230,  106,
+      169,   25,   30,  134,  220,  184,   30,  134,   30,  213,
+      180,   30,  134,   30,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,  134,  134,  184,   30,   30,   30,   30,
+
+       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   30,   34,   34,   34,  189,
+       34,  206,   34,   34,  203,   34,  108,  108,  108,  108,
+      108,  108,  108,  189,  198,  206,   34,   34,   34,   46,
+      190,   46,   46,   46,   46,   46,   46,   46,  190,  202,
+      108,  204,  127,  127,  205,  127,  127,  223,  196,  195,
+      198,  127,  205,  224,  223,   46,   49,  212,  214,  202,
+       49,  204,   49,  127,  194,   49,  224,   49,   49,   49,
+       49,   49,   49,   49,   49,   49,   49,  212,  214,  127,
+
+       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+       49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
+       53,   53,   53,  235,   53,  235,   53,   53,  135,   53,
+      135,  135,  135,  135,  135,  135,  135,  238,  188,  187,
+       53,   53,   53,   71,  236,   71,  236,   71,  186,   71,
+       71,  136,   71,  136,  136,  136,  136,  136,  136,  136,
+      179,  236,  238,   71,   71,   71,   77,  178,   77,  177,
+       77,  249,   77,   77,  137,   77,  137,  137,  137,  137,
+      137,  137,  137,  167,  249,  166,   77,   77,   77,   79,
+
+      165,   79,  154,   79,  153,   79,   79,  147,   79,  147,
+      147,  147,  147,  147,  147,  147,  274,  274,  274,   79,
+       79,   79,   82,  152,   82,  151,   82,  150,   82,   82,
+      148,   82,  148,  148,  148,  148,  148,  148,  148,  141,
+      274,  140,   82,   82,   82,  100,  139,  100,  138,  100,
+      208,  100,  100,  149,  100,  149,  149,  149,  149,  149,
+      149,  149,  132,  218,  221,  100,  100,  100,  103,  125,
+      103,  120,  103,  118,  103,  103,  208,  103,  157,  157,
+      116,  157,  157,  218,  221,  114,  234,  157,  103,  103,
+      103,  105,  112,  105,  104,  105,  102,  105,  105,  157,
+
+      105,  158,  158,   99,  158,  158,  234,  256,   91,   89,
+      158,  105,  105,  105,  107,  157,  107,   87,  107,   81,
+      107,  107,  158,  107,  159,  159,  159,  159,  159,  159,
+      159,  264,   78,  256,  107,  107,  107,  161,  158,  161,
+      161,  161,  161,  161,  161,  161,  242,  162,  159,  162,
+      162,  162,  162,  162,  162,  162,  163,  264,  163,  163,
+      163,  163,  163,  163,  163,  171,  242,  171,  171,  171,
+      171,  171,  171,  171,  173,   76,  173,  173,  173,  173,
+      173,  173,  173,  174,   74,  174,  174,  174,  174,  174,
+      174,  174,  175,   73,  175,  175,  175,  175,  175,  175,
+
+      175,  181,   72,  181,  181,  181,  181,  181,  181,  181,
+      182,   70,  182,  182,  182,  182,  182,  182,  182,  183,
+       63,  183,  183,  183,  183,  183,  183,  183,  191,   57,
+      191,  191,  191,  191,  191,  191,  191,  192,   54,  192,
+      192,  192,  192,  192,  192,  192,  193,   52,  193,  193,
+      193,  193,  193,  193,  193,  197,  197,  197,  197,  197,
+      197,  197,  199,   51,  199,  199,  199,  199,  199,  199,
+      199,  216,  216,  216,  216,  216,  216,  216,  200,  197,
+      200,  200,  200,  200,  200,  200,  200,  201,   50,  201,
+      201,  201,  201,  201,  201,  201,  207,   44,  207,  207,
+
+      207,  207,  207,  207,  207,  209,   42,  209,  209,  209,
+      209,  209,  209,  209,  210,   40,  210,  210,  210,  210,
+      210,  210,  210,  211,   39,  211,  211,  211,  211,  211,
+      211,  211,  215,  215,  215,  215,  215,  215,  215,  215,
+      217,  217,  217,  217,  217,  217,  226,  226,  226,  226,
+      226,  226,  226,   38,   37,   36,   35,  215,  225,  225,
+      225,  225,  225,  225,  225,  225,  225,  227,  227,  227,
+      227,  227,  227,  229,  229,  229,  229,  229,  229,  229,
+      237,  237,  237,  237,  237,  237,  237,  237,  243,   33,
+      243,  243,  243,  243,  243,  243,  243,  229,  244,  281,
+
+      244,  244,  244,  244,  244,  244,  244,  245,  247,  245,
+      245,  245,  245,  245,  245,  245,  246,   32,  246,  246,
+      246,  246,  246,  246,  246,  281,   31,  251,  247,  251,
+      251,  251,  251,  251,  251,  251,  252,   22,  252,  252,
+      252,  252,  252,  252,  252,  253,   19,  253,  253,  253,
+      253,  253,  253,  253,  254,   18,  254,  254,  254,  254,
+      254,  254,  254,  255,  255,  255,  255,  255,  255,  255,
+      257,   17,  257,  257,  257,  257,  257,  257,  257,  261,
+       15,  261,  261,  261,   14,   13,  258,  255,  258,  258,
+      258,  258,  258,  258,  258,  259,    0,  259,  259,  259,
+
+      259,  259,  259,  259,  260,  261,  260,  260,  260,  260,
+      260,  260,  260,  263,    0,  263,  263,  263,  263,  263,
+      263,  263,  265,    0,  265,  265,  265,  265,  265,  265,
+      265,  266,    0,  266,  266,  266,  266,  266,  266,  266,
       267,    0,  267,  267,  267,  267,  267,  267,  267,  268,
         0,  268,  268,  268,  268,  268,  268,  268,  269,    0,
-      269,  269,  269,  269,  269,  269,  269,  270,    0,  270,
-      270,  270,  270,  270,  270,  270,  271,    0,  271,  271,
-      271,  271,  271,  271,  271,  272,    0,  272,  272,  272,
-      272,  272,  272,  272,  273,    0,  273,  273,  273,  273,
-      273,  273,  273,  274,    0,  274,  274,  274,  274,  274,
-      274,  274,  275,    0,  275,  275,  275,  275,  275,  275,
-      275,  276,    0,  276,  276,  276,  276,  276,  276,  276,
-
-      278,    0,  278,  278,  278,  278,  278,  278,  278,  279,
-        0,  279,  279,  279,  279,  279,  279,  279,  280,    0,
-      280,  280,  280,  280,  280,  280,  280,  281,    0,  281,
-      281,  281,  281,  281,  281,  281,  283,    0,  283,  283,
-      283,  283,  283,  283,  283,  284,    0,  284,  284,  284,
-      284,  284,  284,  284,  285,    0,  285,  285,  285,  285,
-      285,  285,  285,  286,    0,  286,  286,  286,  286,  286,
-      286,  286,  287,    0,  287,  287,  287,  287,  287,  287,
-      287,  288,    0,  288,  288,  288,  288,  288,  288,  288,
-      289,    0,  289,  289,  289,  289,  289,  289,  289,  290,
-
-        0,  290,  290,  290,  290,  290,  290,  290,  291,    0,
-      291,  291,  291,  291,  291,  291,  291,  293,  293,  293,
-      293,  293,  293,  293,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  293,
-      296,  296,  296,  296,  296,  296,  296,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  296,  299,  299,  299,  299,  299,  299,  299,
-      299,  300,  300,  300,  300,  300,  300,  300,  300,  301,
-      301,  301,  301,  301,  301,  301,  301,  302,    0,    0,
-        0,  302,    0,  302,  302,  303,  303,  303,  303,  303,
-
-      303,  303,  303,  304,    0,    0,    0,  304,    0,  304,
-      304,  305,    0,    0,    0,  305,    0,  305,  305,  306,
-        0,  306,    0,  306,    0,  306,  306,  307,    0,    0,
-        0,  307,    0,  307,  307,  309,    0,    0,    0,  309,
-        0,  309,  309,  310,    0,    0,    0,  310,    0,  310,
-      310,  311,    0,  311,    0,  311,    0,  311,  311,  312,
-        0,  312,  312,  312,    0,    0,  312,  314,    0,  314,
-        0,  314,  314,  314,  314,  315,  315,  315,  315,  315,
-      315,  315,  315,  316,  316,  316,  316,  316,  316,  316,
-      316,  317,    0,  317,    0,  317,    0,  317,  317,  318,
-
-      318,  318,  318,  318,  318,  318,  318,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298
+      269,  269,  269,  270,    0,  270,  270,  270,  270,  270,
+      270,  270,  271,    0,  271,  271,  271,  271,  271,  271,
+      271,    0,    0,  272,  269,  272,  272,  272,  272,  272,
+      272,  272,  273,    0,  273,  273,  273,  273,  273,  273,
+
+      273,  275,    0,  275,  275,  275,  275,  275,  275,  275,
+      276,    0,  276,  276,  276,  276,  276,  276,  276,  277,
+        0,  277,  277,  277,  277,  277,  277,  277,  278,    0,
+      278,  278,  278,  278,  278,  278,  278,  279,  279,  279,
+      280,  280,  280,  280,  280,  280,  280,  282,    0,  282,
+      282,  282,  282,  282,  282,  282,    0,    0,    0,    0,
+        0,  279,  286,  283,  280,  283,  283,  283,  283,  283,
+      283,  283,  284,  297,  284,  284,  284,  284,  284,  284,
+      284,  285,  285,  285,  285,  285,  285,  285,  286,  287,
+        0,  287,  287,  287,  287,  287,  287,  287,    0,  297,
+
+        0,    0,    0,    0,  288,  285,  288,  288,  288,  288,
+      288,  288,  288,  289,    0,  289,  289,  289,  289,  289,
+      289,  289,  290,    0,  290,  290,  290,  290,  290,  290,
+      290,  291,    0,  291,  291,  291,  291,  291,  291,  291,
+      292,    0,  292,  292,  292,  292,  292,  292,  292,  293,
+        0,  293,  293,  293,  293,  293,  293,  293,  294,    0,
+      294,  294,  294,  294,  294,  294,  294,  295,    0,  295,
+      295,  295,  295,  295,  295,  295,  296,    0,  296,  296,
+      296,  296,  296,  296,  296,  298,    0,  298,  298,  298,
+      298,  298,  298,  298,  299,  302,  299,  299,  299,  299,
+
+      299,  299,  299,  300,    0,  300,  300,  300,  300,  300,
+      300,  300,  301,    0,  301,  301,  301,  301,  301,  301,
+      301,  302,  303,    0,  303,  303,  303,  303,  303,  303,
+      303,  304,    0,  304,  304,  304,  304,  304,  304,  304,
+      305,    0,  305,  305,  305,  305,  305,  305,  305,  306,
+        0,  306,  306,  306,  306,  306,  306,  306,  307,    0,
+      307,  307,  307,  307,  307,  307,  307,  308,    0,  308,
+      308,  308,  308,  308,  308,  308,  309,    0,  309,  309,
+      309,  309,  309,  309,  309,  310,    0,  310,  310,  310,
+      310,  310,  310,  310,  311,    0,  311,  311,  311,  311,
+
+      311,  311,  311,  313,  313,  313,  313,  313,  313,  313,
+      314,  314,  314,  314,  314,  314,  316,  316,  316,  316,
+      316,  316,  316,    0,    0,    0,    0,  313,  317,  317,
+      317,  317,  317,  317,  314,    0,    0,    0,    0,    0,
+      316,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  317,  319,  319,  319,  319,  319,  319,  319,
+      320,  320,  320,  320,  320,  320,  320,  321,  321,  321,
+      321,  321,  321,  321,  322,    0,    0,    0,    0,  322,
+      322,  323,  323,  323,  323,  323,  323,  323,  324,    0,
+        0,    0,    0,  324,  324,  325,    0,    0,    0,    0,
+
+      325,  325,  326,    0,  326,    0,    0,  326,  326,  327,
+        0,    0,    0,    0,  327,  327,  328,    0,    0,    0,
+        0,  328,  328,  329,    0,    0,    0,    0,  329,  329,
+      330,    0,  330,    0,    0,  330,  330,  331,    0,  331,
+      331,    0,    0,  331,  333,    0,  333,    0,  333,  333,
+      333,  334,  334,  334,  334,  334,  334,  334,  335,  335,
+      335,  335,  335,  335,  335,  336,    0,  336,    0,    0,
+      336,  336,  337,  337,  337,  337,  337,  337,  337,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318,  318,  318,  318,  318,  318,  318,
+      318,  318,  318,  318
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -875,7 +855,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "parse.lex"
 /*
- * Copyright (c) 1996, 1998-2001 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1996, 1998-2003 Todd C. Miller <Todd.Miller@courtesan.com>
  * All rights reserved.
  *
  * This code is derived from software contributed by Chris Jepeway.
@@ -909,6 +889,10 @@ char *yytext;
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
  */
 
 #include "config.h"
@@ -980,7 +964,7 @@ extern void yyerror         __P((char *));
 
 #define INDEFS 5
 
-#line 984 "lex.yy.c"
+#line 968 "lex.yy.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1134,9 +1118,9 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 113 "parse.lex"
+#line 117 "parse.lex"
 
-#line 1140 "lex.yy.c"
+#line 1124 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -1188,13 +1172,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 299 )
+                               if ( yy_current_state >= 319 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 1808 );
+               while ( yy_base[yy_current_state] != 1680 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1222,12 +1206,12 @@ do_action:      /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 114 "parse.lex"
+#line 118 "parse.lex"
 BEGIN STARTDEFS;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 116 "parse.lex"
+#line 120 "parse.lex"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -1238,7 +1222,7 @@ YY_RULE_SETUP
 
 case 3:
 YY_RULE_SETUP
-#line 124 "parse.lex"
+#line 128 "parse.lex"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -1247,7 +1231,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 130 "parse.lex"
+#line 134 "parse.lex"
 {
                            LEXTRACE("= ");
                            return('=');
@@ -1255,7 +1239,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 135 "parse.lex"
+#line 139 "parse.lex"
 {
                            LEXTRACE("+= ");
                            return('+');
@@ -1263,7 +1247,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 140 "parse.lex"
+#line 144 "parse.lex"
 {
                            LEXTRACE("-= ");
                            return('-');
@@ -1271,7 +1255,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 145 "parse.lex"
+#line 149 "parse.lex"
 {
                            LEXTRACE("WORD(1) ");
                            fill(yytext + 1, yyleng - 2);
@@ -1280,7 +1264,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 151 "parse.lex"
+#line 155 "parse.lex"
 {
                            LEXTRACE("WORD(2) ");
                            fill(yytext, yyleng);
@@ -1291,7 +1275,7 @@ YY_RULE_SETUP
 
 case 9:
 YY_RULE_SETUP
-#line 159 "parse.lex"
+#line 163 "parse.lex"
 {
                            LEXTRACE("QUOTEDCHAR ");
                            fill_args(yytext + 1, 1, sawspace);
@@ -1300,7 +1284,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 165 "parse.lex"
+#line 169 "parse.lex"
 {
                            BEGIN INITIAL;
                            unput(*yytext);
@@ -1309,7 +1293,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 171 "parse.lex"
+#line 175 "parse.lex"
 {
                            LEXTRACE("ARG ");
                            fill_args(yytext, yyleng, sawspace);
@@ -1319,7 +1303,7 @@ YY_RULE_SETUP
 
 case 12:
 YY_RULE_SETUP
-#line 178 "parse.lex"
+#line 182 "parse.lex"
 {
                            BEGIN GOTDEFS;
                            switch (yytext[8]) {
@@ -1340,7 +1324,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 196 "parse.lex"
+#line 200 "parse.lex"
 {
                            fill(yytext, yyleng);
                            switch (*yytext) {
@@ -1362,7 +1346,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 215 "parse.lex"
+#line 219 "parse.lex"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
@@ -1371,7 +1355,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 221 "parse.lex"
+#line 225 "parse.lex"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
@@ -1380,7 +1364,23 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 227 "parse.lex"
+#line 231 "parse.lex"
+{
+                               LEXTRACE("NOEXEC ");
+                               return(NOEXEC);
+                       }
+       YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 236 "parse.lex"
+{
+                               LEXTRACE("EXEC ");
+                               return(EXEC);
+                       }
+       YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 241 "parse.lex"
 {
                            /* netgroup */
                            fill(yytext, yyleng);
@@ -1388,9 +1388,9 @@ YY_RULE_SETUP
                            return(NETGROUP);
                        }
        YY_BREAK
-case 17:
+case 19:
 YY_RULE_SETUP
-#line 234 "parse.lex"
+#line 248 "parse.lex"
 {
                            /* UN*X group */
                            fill(yytext, yyleng);
@@ -1398,36 +1398,36 @@ YY_RULE_SETUP
                            return(USERGROUP);
                        }
        YY_BREAK
-case 18:
+case 20:
 YY_RULE_SETUP
-#line 241 "parse.lex"
+#line 255 "parse.lex"
 {
                            fill(yytext, yyleng);
                            LEXTRACE("NTWKADDR ");
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 19:
+case 21:
 YY_RULE_SETUP
-#line 247 "parse.lex"
+#line 261 "parse.lex"
 {
                            fill(yytext, yyleng);
                            LEXTRACE("NTWKADDR ");
                            return(NTWKADDR);
                        }
        YY_BREAK
-case 20:
+case 22:
 YY_RULE_SETUP
-#line 253 "parse.lex"
+#line 267 "parse.lex"
 {
                                BEGIN GOTRUNAS;
                                LEXTRACE("RUNAS ");
                                return (RUNAS);
                        }
        YY_BREAK
-case 21:
+case 23:
 YY_RULE_SETUP
-#line 259 "parse.lex"
+#line 273 "parse.lex"
 {
                            if (strcmp(yytext, "ALL") == 0) {
                                LEXTRACE("ALL ");
@@ -1439,9 +1439,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 22:
+case 24:
 YY_RULE_SETUP
-#line 270 "parse.lex"
+#line 284 "parse.lex"
 {
                            /* username/uid that user can run command as */
                            fill(yytext, yyleng);
@@ -1449,16 +1449,16 @@ YY_RULE_SETUP
                            return(WORD);
                        }
        YY_BREAK
-case 23:
+case 25:
 YY_RULE_SETUP
-#line 277 "parse.lex"
+#line 291 "parse.lex"
 {
                            BEGIN INITIAL;
                        }
        YY_BREAK
-case 24:
+case 26:
 YY_RULE_SETUP
-#line 281 "parse.lex"
+#line 295 "parse.lex"
 {
                            /* directories can't have args... */
                            if (yytext[yyleng - 1] == '/') {
@@ -1472,9 +1472,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 25:
+case 27:
 YY_RULE_SETUP
-#line 294 "parse.lex"
+#line 308 "parse.lex"
 {
                            /* a word */
                            fill(yytext, yyleng);
@@ -1482,41 +1482,41 @@ YY_RULE_SETUP
                            return(WORD);
                        }
        YY_BREAK
-case 26:
+case 28:
 YY_RULE_SETUP
-#line 301 "parse.lex"
+#line 315 "parse.lex"
 {
                            LEXTRACE(", ");
                            return(',');
                        }                       /* return ',' */
        YY_BREAK
-case 27:
+case 29:
 YY_RULE_SETUP
-#line 306 "parse.lex"
+#line 320 "parse.lex"
 {
                            LEXTRACE("= ");
                            return('=');
                        }                       /* return '=' */
        YY_BREAK
-case 28:
+case 30:
 YY_RULE_SETUP
-#line 311 "parse.lex"
+#line 325 "parse.lex"
 {
                            LEXTRACE(": ");
                            return(':');
                        }                       /* return ':' */
        YY_BREAK
-case 29:
+case 31:
 YY_RULE_SETUP
-#line 316 "parse.lex"
+#line 330 "parse.lex"
 {
                            if (yyleng % 2 == 1)
                                return('!');    /* return '!' */
                        }
        YY_BREAK
-case 30:
+case 32:
 YY_RULE_SETUP
-#line 321 "parse.lex"
+#line 335 "parse.lex"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -1524,25 +1524,25 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 31:
+case 33:
 YY_RULE_SETUP
-#line 328 "parse.lex"
+#line 342 "parse.lex"
 {                      /* throw away space/tabs */
                            sawspace = TRUE;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 32:
+case 34:
 YY_RULE_SETUP
-#line 332 "parse.lex"
+#line 346 "parse.lex"
 {
                            sawspace = TRUE;    /* remember for fill_args */
                            ++sudolineno;
                            LEXTRACE("\n\t");
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 33:
+case 35:
 YY_RULE_SETUP
-#line 338 "parse.lex"
+#line 352 "parse.lex"
 {
                            BEGIN INITIAL;
                            ++sudolineno;
@@ -1550,9 +1550,9 @@ YY_RULE_SETUP
                            return(COMMENT);
                        }                       /* return comments */
        YY_BREAK
-case 34:
+case 36:
 YY_RULE_SETUP
-#line 345 "parse.lex"
+#line 359 "parse.lex"
 {
                            LEXTRACE("ERROR ");
                            return(ERROR);
@@ -1564,7 +1564,7 @@ case YY_STATE_EOF(GOTDEFS):
 case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
-#line 350 "parse.lex"
+#line 364 "parse.lex"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -1574,9 +1574,9 @@ case YY_STATE_EOF(INDEFS):
                            yyterminate();
                        }
        YY_BREAK
-case 35:
+case 37:
 YY_RULE_SETUP
-#line 359 "parse.lex"
+#line 373 "parse.lex"
 ECHO;
        YY_BREAK
 #line 1583 "lex.yy.c"
@@ -1870,7 +1870,7 @@ static yy_state_type yy_get_previous_state()
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 299 )
+                       if ( yy_current_state >= 319 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1905,11 +1905,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 299 )
+               if ( yy_current_state >= 319 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 298);
+       yy_is_jam = (yy_current_state == 318);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -2468,7 +2468,7 @@ int main()
        return 0;
        }
 #endif
-#line 359 "parse.lex"
+#line 373 "parse.lex"
 
 static void
 fill(s, len)
diff --git a/parse.c b/parse.c
index 4ea2784216aacb7303412d89d65f8a71c4c408b3..d333b14dbaf3db228584863743466a50ec4e381d 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -215,20 +215,17 @@ sudoers_lookup(pwflag)
                    if (cmnd_matches == TRUE) {
                        /*
                         * User was granted access to cmnd on host.
-                        * If no passwd required return as such.
                         */
-                       if (no_passwd == TRUE)
-                           return(VALIDATE_OK | FLAG_NOPASS);
-                       else
-                           return(VALIDATE_OK);
+                       return(VALIDATE_OK |
+                           (no_passwd == TRUE ? FLAG_NOPASS : 0) |
+                           (no_execve == TRUE ? FLAG_NOEXEC : 0));
                    } else if (cmnd_matches == FALSE) {
                        /*
                         * User was explicitly denied access to cmnd on host.
                         */
-                       if (no_passwd == TRUE)
-                           return(VALIDATE_NOT_OK | FLAG_NOPASS);
-                       else
-                           return(VALIDATE_NOT_OK);
+                       return(VALIDATE_NOT_OK |
+                           (no_passwd == TRUE ? FLAG_NOPASS : 0) |
+                           (no_execve == TRUE ? FLAG_NOEXEC : 0));
                    }
                }
            }
@@ -237,7 +234,7 @@ sudoers_lookup(pwflag)
     }
 
     /*
-     * The user was not explicitly granted nor denied access.
+     * The user was neither explicitly granted nor denied access.
      */
     if (nopass == -1)
        nopass = 0;
diff --git a/parse.h b/parse.h
index 9d736f13b27eb9594b9ea7638ea6b14cb57bdd02..74bb9648ff49c6bf9cd5e4a270a43698122a07e4 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -50,6 +50,7 @@ struct matchstack {
        int host;
        int runas;
        int nopass;
+       int noexec;
 };
 
 /*
@@ -66,6 +67,7 @@ struct sudo_command {
 #define host_matches   (match[top-1].host)
 #define runas_matches  (match[top-1].runas)
 #define no_passwd      (match[top-1].nopass)
+#define no_execve      (match[top-1].noexec)
 
 /*
  * Structure containing command matches if "sudo -l" is used.
@@ -78,6 +80,7 @@ struct command_match {
     size_t cmnd_len;
     size_t cmnd_size;
     int nopasswd;
+    int noexecve;
 };
 
 /*
index e854e8bd38a7520d154bb54b90655e06d22c0926..e3dea3f31a78f43ec755f12e140df18477a265ff 100644 (file)
--- a/parse.lex
+++ b/parse.lex
@@ -228,6 +228,16 @@ PASSWD[[:blank:]]*:        {
                                return(PASSWD);
                        }
 
+NOEXEC[[:blank:]]*:    {
+                               LEXTRACE("NOEXEC ");
+                               return(NOEXEC);
+                       }
+
+EXEC[[:blank:]]*:      {
+                               LEXTRACE("EXEC ");
+                               return(EXEC);
+                       }
+
 \+{WORD}               {
                            /* netgroup */
                            fill(yytext, yyleng);
index bcbe21fc5fa5bdaa8745ffcaec02cc05aefdc946..93a4b7f927556f5edbe8f841cff6b6074916f938 100644 (file)
@@ -128,6 +128,7 @@ int top = 0, stacksize = 0;
        match[top].host   = -1; \
        match[top].runas  = -1; \
        match[top].nopass = def_authenticate ? -1 : TRUE; \
+       match[top].noexec = def_noexec ? TRUE : -1; \
        top++; \
     } while (0)
 
@@ -142,6 +143,7 @@ int top = 0, stacksize = 0;
        match[top].host   = match[top-1].host; \
        match[top].runas  = match[top-1].runas; \
        match[top].nopass = match[top-1].nopass; \
+       match[top].noexec = match[top-1].noexec; \
        top++; \
     } while (0)
 
@@ -237,6 +239,8 @@ yyerror(s)
 %token <tok>    RUNAS                  /* ( runas_list ) */
 %token <tok>    NOPASSWD               /* no passwd req for command */
 %token <tok>    PASSWD                 /* passwd req for command (default) */
+%token <tok>    NOEXEC                 /* preload dummy execve() for cmnd */
+%token <tok>    EXEC                   /* don't preload dummy execve() */
 %token <tok>    ALL                    /* ALL keyword */
 %token <tok>    COMMENT                /* comment and/or carriage return */
 %token <tok>    HOSTALIAS              /* Host_Alias keyword */
@@ -366,10 +370,8 @@ privilege  :       hostlist '=' cmndspeclist {
                             */
                            host_matches = -1;
                            runas_matches = -1;
-                           if (def_authenticate)
-                               no_passwd = -1;
-                           else
-                               no_passwd = TRUE;
+                           no_passwd = def_authenticate ? -1 : TRUE;
+                           no_execve = def_noexec ? TRUE : -1;
                        }
                ;
 
@@ -435,7 +437,7 @@ cmndspeclist        :       cmndspec
                |       cmndspeclist ',' cmndspec
                ;
 
-cmndspec       :       runasspec nopasswd opcmnd {
+cmndspec       :       runasspec noexec nopasswd opcmnd {
                            /*
                             * Push the entry onto the stack if it is worth
                             * saving and clear cmnd_matches for next cmnd.
@@ -640,6 +642,30 @@ nopasswd   :       /* empty */ {
                        }
                ;
 
+noexec :       /* empty */ {
+                           /* Inherit NOEXEC/EXEC status. */
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE) {
+                               if (no_execve == TRUE)
+                                   cm_list[cm_list_len].noexecve = TRUE;
+                               else
+                                   cm_list[cm_list_len].noexecve = FALSE;
+                           }
+                       }
+               |       NOEXEC {
+                           no_execve = TRUE;
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE)
+                               cm_list[cm_list_len].noexecve = TRUE;
+                       }
+               |       EXEC {
+                           no_execve = FALSE;
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE)
+                               cm_list[cm_list_len].noexecve = FALSE;
+                       }
+               ;
+
 cmnd           :       ALL {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1055,6 +1081,12 @@ list_matches()
            (void) printf("(%s) ", def_runas_default);
        }
 
+       /* Is execve(2) disabled? */
+       if (cm_list[count].noexecve == TRUE && !def_noexec)
+           (void) fputs("NOEXEC: ", stdout);
+       else if (cm_list[count].noexecve == FALSE && def_noexec)
+           (void) fputs("EXEC: ", stdout);
+
        /* Is a password required? */
        if (cm_list[count].nopasswd == TRUE && def_authenticate)
            (void) fputs("NOPASSWD: ", stdout);
@@ -1187,6 +1219,7 @@ expand_match_list()
 
     cm_list[cm_list_len].runas = cm_list[cm_list_len].cmnd = NULL;
     cm_list[cm_list_len].nopasswd = FALSE;
+    cm_list[cm_list_len].noexecve = FALSE;
 }
 
 /*
diff --git a/sudo.c b/sudo.c
index f9e347ecbb690d39a7f277f42e0e9862d8fa4cd1..5a87464ea462fb1602b43f8ef13cf397526dcc8f 100644 (file)
--- a/sudo.c
+++ b/sudo.c
@@ -122,7 +122,7 @@ static void usage                   __P((int));
 static void usage_excl                 __P((int));
 static struct passwd *get_authpw       __P((void));
 extern void list_matches               __P((void));
-extern char **rebuild_env              __P((int, char **));
+extern char **rebuild_env              __P((char **, int, int));
 extern char **zero_env                 __P((char **));
 extern struct passwd *sudo_getpwnam    __P((const char *));
 extern struct passwd *sudo_getpwuid    __P((uid_t));
@@ -360,7 +360,8 @@ main(argc, argv, envp)
        check_user(validated & FLAG_CHECK_USER);
 
     /* Build up custom environment that avoids any nasty bits. */
-    new_environ = rebuild_env(sudo_mode, envp);
+    new_environ = rebuild_env(envp, (sudo_mode & MODE_RESET_HOME),
+       (validated & FLAG_NOEXEC));
 
     if (validated & VALIDATE_OK) {
        /* Finally tell the user if the command did not exist. */
diff --git a/sudo.h b/sudo.h
index 1b6c0b3f2a51fe9e91a1c763caf1498b3a26b096..dec1f617a3535dcaeb3b4c0c18f1a540c9b1cbad 100644 (file)
--- a/sudo.h
+++ b/sudo.h
@@ -79,6 +79,7 @@ struct sudo_user {
 #define FLAG_NO_USER           0x040
 #define FLAG_NO_HOST           0x080
 #define FLAG_NO_CHECK          0x100
+#define FLAG_NOEXEC            0x200
 
 /*
  * Boolean values
index b908aa5dda52181bc97daeca35cd2ceb2f39f2e5..2fd3b62a31b797ade676729389f53de0e8d8a3d5 100644 (file)
@@ -146,6 +146,7 @@ int top = 0, stacksize = 0;
        match[top].host   = -1; \
        match[top].runas  = -1; \
        match[top].nopass = def_authenticate ? -1 : TRUE; \
+       match[top].noexec = def_noexec ? TRUE : -1; \
        top++; \
     } while (0)
 
@@ -160,6 +161,7 @@ int top = 0, stacksize = 0;
        match[top].host   = match[top-1].host; \
        match[top].runas  = match[top-1].runas; \
        match[top].nopass = match[top-1].nopass; \
+       match[top].noexec = match[top-1].noexec; \
        top++; \
     } while (0)
 
@@ -231,14 +233,14 @@ yyerror(s)
     }
     parse_error = TRUE;
 }
-#line 218 "parse.yacc"
+#line 220 "parse.yacc"
 typedef union {
     char *string;
     int BOOLEAN;
     struct sudo_command command;
     int tok;
 } YYSTYPE;
-#line 242 "sudo.tab.c"
+#line 244 "sudo.tab.c"
 #define COMMAND 257
 #define ALIAS 258
 #define DEFVAR 259
@@ -253,13 +255,15 @@ typedef union {
 #define RUNAS 268
 #define NOPASSWD 269
 #define PASSWD 270
-#define ALL 271
-#define COMMENT 272
-#define HOSTALIAS 273
-#define CMNDALIAS 274
-#define USERALIAS 275
-#define RUNASALIAS 276
-#define ERROR 277
+#define NOEXEC 271
+#define EXEC 272
+#define ALL 273
+#define COMMENT 274
+#define HOSTALIAS 275
+#define CMNDALIAS 276
+#define USERALIAS 277
+#define RUNASALIAS 278
+#define ERROR 279
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylhs[] =
@@ -270,12 +274,13 @@ short yylhs[] =
     0,    0,    7,    7,    9,    7,    7,    7,    7,    7,
     7,   15,   16,   18,   16,   19,   16,   21,   16,   17,
    17,   22,   22,   22,   22,   22,   10,   10,   23,   25,
-   25,    2,    2,    2,    2,    2,   24,   24,   26,   29,
-   30,   29,   27,   27,    5,    5,    4,   31,    4,    3,
-    3,    3,    3,    3,   28,   28,   28,    1,    1,    1,
-   12,   12,   33,   32,   20,   20,   13,   13,   35,   34,
-   36,   36,   14,   14,   38,   37,   11,   11,   40,   39,
-    8,    8,   41,   41,    6,    6,    6,    6,    6,
+   25,    2,    2,    2,    2,    2,   24,   24,   26,   30,
+   31,   30,   27,   27,    5,    5,    4,   32,    4,    3,
+    3,    3,    3,    3,   29,   29,   29,   28,   28,   28,
+    1,    1,    1,   12,   12,   34,   33,   20,   20,   13,
+   13,   36,   35,   37,   37,   14,   14,   39,   38,   11,
+   11,   41,   40,    8,    8,   42,   42,    6,    6,    6,
+    6,    6,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yylen[] =
@@ -286,12 +291,13 @@ short yylen[] =
     1,    2,    1,    2,    0,    3,    2,    2,    2,    2,
     1,    2,    1,    0,    3,    0,    3,    0,    3,    1,
     3,    1,    2,    3,    3,    3,    1,    3,    3,    1,
-    2,    1,    1,    1,    1,    1,    1,    3,    3,    1,
+    2,    1,    1,    1,    1,    1,    1,    3,    4,    1,
     0,    3,    0,    2,    1,    3,    1,    0,    3,    1,
-    1,    1,    1,    1,    0,    1,    1,    1,    1,    1,
-    1,    3,    0,    4,    1,    3,    1,    3,    0,    4,
-    1,    3,    1,    3,    0,    4,    1,    3,    0,    4,
-    1,    3,    1,    2,    1,    1,    1,    1,    1,
+    1,    1,    1,    1,    0,    1,    1,    0,    1,    1,
+    1,    1,    1,    1,    3,    0,    4,    1,    3,    1,
+    3,    0,    4,    1,    3,    1,    3,    0,    4,    1,
+    3,    0,    4,    1,    3,    1,    2,    1,    1,    1,
+    1,    1,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yydefred[] =
@@ -300,18 +306,19 @@ short yydefred[] =
 #endif
        {                                      0,
     0,   13,   18,   14,   16,    3,    0,    0,    0,    0,
-    0,    1,    0,   11,    0,    4,    0,    0,    0,   63,
-    0,   61,   69,    0,   67,   79,    0,   77,   75,    0,
-   73,    2,   88,   87,   86,   85,   89,    0,   83,    0,
-   81,    0,    0,   12,    0,   36,   33,   34,   35,   32,
-    0,   30,    0,   65,    0,   53,   52,   51,   50,   54,
+    0,    1,    0,   11,    0,    4,    0,    0,    0,   66,
+    0,   64,   72,    0,   70,   82,    0,   80,   78,    0,
+   76,    2,   91,   90,   89,   88,   92,    0,   86,    0,
+   84,    0,    0,   12,    0,   36,   33,   34,   35,   32,
+    0,   30,    0,   68,    0,   53,   52,   51,   50,   54,
    48,   47,   45,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   84,    0,    0,    0,   27,    0,    0,    0,
-   23,    0,   31,    0,    0,    0,    0,   62,    0,   68,
-    0,   78,    0,   74,   82,    0,    0,   24,   25,   26,
-   21,   66,   49,   46,    0,   60,   59,   58,   41,   40,
-   71,    0,    0,    0,   28,    0,    0,   37,    0,    0,
-    0,    0,    0,   56,   57,    0,   42,   72,   38,   39,
+    0,    0,   87,    0,    0,    0,   27,    0,    0,    0,
+   23,    0,   31,    0,    0,    0,    0,   65,    0,   71,
+    0,   81,    0,   77,   85,    0,    0,   24,   25,   26,
+   21,   69,   49,   46,    0,   63,   62,   61,   41,   40,
+   74,    0,    0,    0,   28,    0,    0,   37,    0,    0,
+    0,    0,    0,   59,   60,    0,   42,   75,   38,   56,
+   57,    0,   39,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yydgoto[] =
@@ -321,123 +328,130 @@ short yydgoto[] =
        {                                      11,
   110,   52,   62,   63,   64,   39,   12,   40,   13,   75,
    27,   21,   24,   30,   14,   15,   44,   18,   19,   76,
-   17,   45,   77,  117,   54,  118,  119,  126,  111,  120,
-   85,   22,   65,   25,   67,  112,   31,   71,   28,   69,
-   41,
+   17,   45,   77,  117,   54,  118,  119,  126,  132,  111,
+  120,   85,   22,   65,   25,   67,  112,   31,   71,   28,
+   69,   41,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yysindex[] =
 #else
 short yysindex[] =
 #endif
-       {                                   -226,
- -256,    0,    0,    0,    0,    0, -233, -230, -227, -225,
- -226,    0,  -29,    0,  -28,    0,  -15,  -29,  257,    0,
-  -26,    0,    0,  -23,    0,    0,  -22,    0,    0,  -21,
-    0,    0,    0,    0,    0,    0,    0, -205,    0,  -33,
-    0,  -35, -217,    0,    7,    0,    0,    0,    0,    0,
- -193,    0,    8,    0,   10,    0,    0,    0,    0,    0,
-    0,    0,    0,   15,  -17, -233,   -1, -230,    2, -227,
-   11, -225,    0,  -29,    3,  -37,    0, -201, -194, -192,
-    0,  -28,    0,  -15, -179,  257,  -15,    0,  222,    0,
-  -29,    0,  257,    0,    0,  -15, -191,    0,    0,    0,
-    0,    0,    0,    0,    8,    0,    0,    0,    0,    0,
-    0,   30,   10,   15,    0,  257,   37,    0, -250, -244,
-  222,   15, -191,    0,    0,  222,    0,    0,    0,    0,};
+       {                                   -234,
+ -262,    0,    0,    0,    0,    0, -242, -238, -235, -229,
+ -234,    0,  296,    0,  -31,    0,  305,  296,  309,    0,
+  -19,    0,    0,  -10,    0,    0,   -4,    0,    0,    2,
+    0,    0,    0,    0,    0,    0,    0, -212,    0,  283,
+    0,  -26, -194,    0,   22,    0,    0,    0,    0,    0,
+ -205,    0,   23,    0,   25,    0,    0,    0,    0,    0,
+    0,    0,    0,   27,  -23, -242,   11, -238,   12, -235,
+   14, -229,    0,  296,   18,  -34,    0, -185, -184, -180,
+    0,  -31,    0,  305, -199,  309,  305,    0,  -33,    0,
+  296,    0,  309,    0,    0,  305, -183,    0,    0,    0,
+    0,    0,    0,    0,   23,    0,    0,    0,    0,    0,
+    0,   40,   25,   27,    0,  309,   42,    0, -257, -221,
+  -33,   27, -183,    0,    0, -244,    0,    0,    0,    0,
+    0,  -33,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short yyrindex[] =
 #else
 short yyrindex[] =
 #endif
-       {                                    269,
+       {                                    328,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  269,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  127,    0,    0,  148,    0,    0,  169,    0,    0,  190,
+  328,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  139,    0,    0,  162,    0,    0,  185,    0,    0,  208,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    1,    0,    0,  211,    0,    0,    0,    0,    0,
-    0,    0,  -24,    0,  -12,    0,    0,    0,    0,    0,
-    0,    0,    0,  -10,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  236,    0,    0,    0,    0,    0,
+    0,    1,    0,    0,  236,    0,    0,    0,    0,    0,
+    0,    0,  -30,    0,  -24,    0,    0,    0,    0,    0,
+    0,    0,    0,  -12,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,  260,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  -18,    0,    0,    0,
-    0,    0,    0,    0,   22,    0,    0,    0,    0,    0,
-    0,   43,   64,   85,    0,    0,  106,    0,  288,    0,
-    0,  267,  -18,    0,    0,    0,    0,    0,    0,    0,};
+    0,    0,    0,    0,    0,    0,  -27,    0,    0,    0,
+    0,    0,    0,    0,   24,    0,    0,    0,    0,    0,
+    0,   47,   70,   93,    0,    0,  116,    0,  282,    0,
+    0,  -20,  -27,    0,    0,  -25,    0,    0,    0,    0,
+    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
 const short yygindex[] =
 #else
 short yygindex[] =
 #endif
        {                                      0,
-  -34,   36,    4,    5,  -87,   50,   79,  -16,    0,    0,
-    0,    0,    0,    0,    0,    0,   12,    0,    0,  -14,
-    0,    0,   -3,    0,   14,  -27,    0,    0, -109,    0,
-    0,   29,    0,   31,    0,    0,   28,    0,   32,    0,
-   33,
+  -32,   36,    4,    5,  -88,   52,   81,  -14,    0,    0,
+    0,    0,    0,    0,    0,    0,   13,    0,    0,   -6,
+    0,    0,   -2,    0,   15,  -22,    0,    0,    0, -114,
+    0,    0,   30,    0,   29,    0,    0,   26,    0,   32,
+    0,   33,
 };
-#define YYTABLESIZE 559
+#define YYTABLESIZE 601
 #if defined(__cplusplus) || defined(__STDC__)
 const short yytable[] =
 #else
 short yytable[] =
 #endif
-       {                                      51,
-   22,   55,   53,   38,   43,  114,   84,   79,   19,   80,
-   74,  128,  106,  107,   43,   16,  130,   51,  124,  125,
-   15,   64,   17,   97,   20,   78,  108,   23,  122,    1,
-   26,   66,   29,   22,   68,   70,   72,    2,    3,    4,
-    5,   81,   70,   87,   22,    6,    7,    8,    9,   10,
-   82,   84,   33,   74,   64,   34,   35,   36,   86,   89,
-   96,   98,   91,   80,   46,   37,   47,   48,   99,   49,
-  100,   93,  105,  121,  113,   70,  116,   50,   56,   64,
-  123,   57,   58,   59,   76,  127,   83,   73,  103,   32,
-  104,   60,  115,  101,   88,  129,   80,  102,   90,   94,
-   70,   92,    0,    0,    0,   29,   95,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   76,    0,    0,
-    0,   80,    0,    0,    0,    0,    8,    0,    0,    0,
+       {                                     109,
+   22,   43,   19,   55,  114,   43,  128,   55,   15,   84,
+   53,   16,   44,  124,  125,   20,   79,  133,   80,   23,
+   17,    1,   26,   67,  130,  131,   97,  122,   29,    2,
+    3,    4,    5,   22,   78,  106,  107,   87,   66,    6,
+    7,    8,    9,   10,   22,   33,   73,   68,   34,   35,
+   36,  108,   46,   70,   47,   48,   67,   49,   56,   72,
+   37,   57,   58,   59,   81,   82,   84,   50,   74,   83,
+   86,   89,   91,   60,   93,   96,  113,   98,   99,   73,
+  105,   67,  100,  121,  116,  123,   83,  127,  103,   73,
+  104,   32,   79,  115,  101,   88,   90,   94,  102,    0,
+  129,   92,   83,    0,   73,    0,   95,    0,    0,    0,
+    0,    0,    0,    0,    0,   29,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   79,    0,   83,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    8,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   29,    0,
-    0,    0,   76,    0,    0,    0,    0,    9,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    8,
-    0,    0,    0,   29,    0,    0,    0,    0,    7,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    9,    0,    0,    0,    0,    0,    0,    0,    0,   10,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    7,    0,    0,    0,    0,    0,    0,    0,    0,
-   20,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   10,    0,   46,    0,   47,   48,   33,   49,
-   42,   34,   35,   36,   19,    6,    0,   50,   43,   43,
-    0,   37,   46,   20,   47,   48,   15,   49,   17,    0,
-   43,   43,   43,    0,  109,   50,   22,    0,   22,    0,
-    0,   22,   22,   22,   22,   22,   22,   22,    6,    0,
-    0,   22,   22,   22,   22,   22,   22,   64,    0,   64,
-    0,    0,   64,   64,   64,   64,   64,   64,   64,   61,
-    0,    0,   64,   64,   64,   64,   64,   64,   70,   44,
-   70,    5,    0,   70,   70,   70,   70,   70,   70,   70,
-    0,    0,    0,   70,   70,   70,   70,   70,   70,   80,
-   55,   80,    0,    0,   80,   80,   80,   80,   80,   80,
-   80,    0,    0,    0,   80,   80,   80,   80,   80,   80,
-   76,    0,   76,    0,    0,   76,   76,   76,   76,   76,
-   76,   76,    0,    0,    0,   76,   76,   76,   76,   76,
-   76,   29,    0,   29,    0,    0,   29,   29,   29,   29,
-   29,   29,   29,    0,    0,    0,   29,   29,   29,   29,
-   29,   29,    8,    0,    8,    0,    0,    8,    8,    8,
-    8,    8,    8,    8,    0,    0,    0,    8,    8,    8,
-    8,    8,    8,    9,    0,    9,    0,    0,    9,    9,
-    9,    9,    9,    9,    9,    0,    0,    0,    9,    9,
-    9,    9,    9,    9,    7,    0,    7,    0,    0,    7,
-    7,    7,    7,    7,    7,    7,    0,    0,    0,    7,
-    7,    7,    7,    7,    7,   10,    0,   10,    0,    0,
-   10,   10,   10,   10,   10,   10,   10,    0,    0,    0,
-   10,   10,   10,   10,   10,   10,   20,    0,   20,    0,
-    0,   20,   20,   20,   20,   20,   20,   20,  106,  107,
-    0,   20,   20,   20,   20,   20,   20,    0,    0,    0,
-    0,    6,  108,    6,    0,    0,    6,    6,    6,    6,
-    6,    6,    6,    0,    0,    0,    6,    6,    6,    6,
-    6,    6,    0,    0,   56,    0,    0,   57,   58,   59,
-    0,    0,    0,   44,   44,    0,    5,   60,    0,    5,
-    5,    5,    0,    0,    0,   44,   44,   44,    0,    5,
-    0,    0,    0,    0,   55,   55,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   55,
+   79,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    9,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    8,    0,   29,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    7,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    9,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,   10,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    7,    0,    0,
+    0,    0,    0,  106,  107,    0,    0,   42,   19,   43,
+   43,   55,   55,    0,   15,   20,   44,   44,    0,  108,
+   10,   43,   43,   43,   43,   43,   17,   55,   44,   44,
+   44,   44,   44,    0,    0,    0,   22,    0,   22,    6,
+    0,   22,   22,   22,   22,   22,   22,   22,   20,    0,
+    0,    0,    0,   22,   22,   22,   22,   22,   22,   67,
+    0,   67,    0,    0,   67,   67,   67,   67,   67,   67,
+   67,    0,    6,    0,    0,    0,   67,   67,   67,   67,
+   67,   67,   73,    0,   73,    0,    0,   73,   73,   73,
+   73,   73,   73,   73,   58,   51,    0,    0,    0,   73,
+   73,   73,   73,   73,   73,   83,   74,   83,   38,    0,
+   83,   83,   83,   83,   83,   83,   83,   51,    0,    0,
+    0,   61,   83,   83,   83,   83,   83,   83,   79,    0,
+   79,    0,    0,   79,   79,   79,   79,   79,   79,   79,
+    5,    0,    0,    0,    0,   79,   79,   79,   79,   79,
+   79,   29,    0,   29,    0,    0,   29,   29,   29,   29,
+   29,   29,   29,    0,    0,    0,    0,    0,   29,   29,
+   29,   29,   29,   29,    8,    0,    8,    0,    0,    8,
+    8,    8,    8,    8,    8,    8,    0,    0,    0,    0,
+    0,    8,    8,    8,    8,    8,    8,    9,    0,    9,
+    0,    0,    9,    9,    9,    9,    9,    9,    9,    0,
+    0,    0,    0,    0,    9,    9,    9,    9,    9,    9,
+    7,    0,    7,    0,    0,    7,    7,    7,    7,    7,
+    7,    7,    0,    0,    0,    0,    0,    7,    7,    7,
+    7,    7,    7,   10,    0,   10,    0,    0,   10,   10,
+   10,   10,   10,   10,   10,    0,    0,    0,    0,    0,
+   10,   10,   10,   10,   10,   10,    0,    0,    0,    0,
+    0,   20,    0,   20,    0,    0,   20,   20,   20,   20,
+   20,   20,   20,    0,    0,    0,    0,    0,   20,   20,
+   20,   20,   20,   20,    0,    6,    0,    6,    0,    0,
+    6,    6,    6,    6,    6,    6,    6,    0,    0,    0,
+    0,    0,    6,    6,    6,    6,    6,    6,   58,   58,
+   46,    0,   47,   48,    0,   49,    0,    0,    0,    0,
+   58,   58,    0,   33,   58,   50,   34,   35,   36,    0,
+    0,    0,   46,    0,   47,   48,   56,   49,   37,   57,
+   58,   59,    0,    0,    0,    0,    0,   50,    0,    0,
+    0,   60,    0,    0,    0,    5,    0,    0,    5,    5,
+    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    5,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short yycheck[] =
@@ -445,68 +459,73 @@ const short yycheck[] =
 short yycheck[] =
 #endif
        {                                      33,
-    0,   18,   17,   33,   33,   93,   44,   43,   33,   45,
-   44,  121,  257,  258,   33,  272,  126,   33,  269,  270,
-   33,    0,   33,   61,  258,   61,  271,  258,  116,  256,
-  258,   58,  258,   33,   58,   58,   58,  264,  265,  266,
-  267,  259,    0,   61,   44,  272,  273,  274,  275,  276,
-   44,   44,  258,   44,   33,  261,  262,  263,   44,   61,
-   58,  263,   61,    0,  258,  271,  260,  261,  263,  263,
-  263,   61,   87,   44,   91,   33,  268,  271,  258,   58,
-   44,  261,  262,  263,    0,  120,   51,   38,   85,   11,
-   86,  271,   96,   82,   66,  123,   33,   84,   68,   72,
-   58,   70,   -1,   -1,   -1,    0,   74,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
-   -1,   58,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,
+    0,   33,   33,   18,   93,   33,  121,   33,   33,   44,
+   17,  274,   33,  271,  272,  258,   43,  132,   45,  258,
+   33,  256,  258,    0,  269,  270,   61,  116,  258,  264,
+  265,  266,  267,   33,   61,  257,  258,   61,   58,  274,
+  275,  276,  277,  278,   44,  258,    0,   58,  261,  262,
+  263,  273,  258,   58,  260,  261,   33,  263,  258,   58,
+  273,  261,  262,  263,  259,   44,   44,  273,   44,    0,
+   44,   61,   61,  273,   61,   58,   91,  263,  263,   33,
+   87,   58,  263,   44,  268,   44,   51,  120,   85,   38,
+   86,   11,    0,   96,   82,   66,   68,   72,   84,   -1,
+  123,   70,   33,   -1,   58,   -1,   74,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   33,   -1,   58,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,
-   -1,   -1,   58,   -1,   -1,   -1,   -1,    0,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,
-   -1,   -1,   -1,   58,   -1,   -1,   -1,   -1,    0,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,    0,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-    0,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   33,   -1,  258,   -1,  260,  261,  258,  263,
-  259,  261,  262,  263,  259,    0,   -1,  271,  257,  258,
-   -1,  271,  258,   33,  260,  261,  259,  263,  259,   -1,
-  269,  270,  271,   -1,   33,  271,  256,   -1,  258,   -1,
+   58,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,    0,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   33,   -1,   58,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,    0,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,    0,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
+   -1,   -1,   -1,  257,  258,   -1,   -1,  259,  259,  257,
+  258,  257,  258,   -1,  259,    0,  257,  258,   -1,  273,
+   33,  269,  270,  271,  272,  273,  259,  273,  269,  270,
+  271,  272,  273,   -1,   -1,   -1,  256,   -1,  258,    0,
    -1,  261,  262,  263,  264,  265,  266,  267,   33,   -1,
-   -1,  271,  272,  273,  274,  275,  276,  256,   -1,  258,
-   -1,   -1,  261,  262,  263,  264,  265,  266,  267,   33,
-   -1,   -1,  271,  272,  273,  274,  275,  276,  256,   33,
-  258,   33,   -1,  261,  262,  263,  264,  265,  266,  267,
-   -1,   -1,   -1,  271,  272,  273,  274,  275,  276,  256,
-   33,  258,   -1,   -1,  261,  262,  263,  264,  265,  266,
-  267,   -1,   -1,   -1,  271,  272,  273,  274,  275,  276,
+   -1,   -1,   -1,  273,  274,  275,  276,  277,  278,  256,
+   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,  266,
+  267,   -1,   33,   -1,   -1,   -1,  273,  274,  275,  276,
+  277,  278,  256,   -1,  258,   -1,   -1,  261,  262,  263,
+  264,  265,  266,  267,   33,   33,   -1,   -1,   -1,  273,
+  274,  275,  276,  277,  278,  256,   44,  258,   33,   -1,
+  261,  262,  263,  264,  265,  266,  267,   33,   -1,   -1,
+   -1,   33,  273,  274,  275,  276,  277,  278,  256,   -1,
+  258,   -1,   -1,  261,  262,  263,  264,  265,  266,  267,
+   33,   -1,   -1,   -1,   -1,  273,  274,  275,  276,  277,
+  278,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
+  265,  266,  267,   -1,   -1,   -1,   -1,   -1,  273,  274,
+  275,  276,  277,  278,  256,   -1,  258,   -1,   -1,  261,
+  262,  263,  264,  265,  266,  267,   -1,   -1,   -1,   -1,
+   -1,  273,  274,  275,  276,  277,  278,  256,   -1,  258,
+   -1,   -1,  261,  262,  263,  264,  265,  266,  267,   -1,
+   -1,   -1,   -1,   -1,  273,  274,  275,  276,  277,  278,
   256,   -1,  258,   -1,   -1,  261,  262,  263,  264,  265,
-  266,  267,   -1,   -1,   -1,  271,  272,  273,  274,  275,
-  276,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   -1,   -1,   -1,  271,  272,  273,  274,
-  275,  276,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,   -1,   -1,   -1,  271,  272,  273,
-  274,  275,  276,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,   -1,   -1,   -1,  271,  272,
-  273,  274,  275,  276,  256,   -1,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,   -1,   -1,   -1,  271,
-  272,  273,  274,  275,  276,  256,   -1,  258,   -1,   -1,
+  266,  267,   -1,   -1,   -1,   -1,   -1,  273,  274,  275,
+  276,  277,  278,  256,   -1,  258,   -1,   -1,  261,  262,
+  263,  264,  265,  266,  267,   -1,   -1,   -1,   -1,   -1,
+  273,  274,  275,  276,  277,  278,   -1,   -1,   -1,   -1,
+   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
+  265,  266,  267,   -1,   -1,   -1,   -1,   -1,  273,  274,
+  275,  276,  277,  278,   -1,  256,   -1,  258,   -1,   -1,
   261,  262,  263,  264,  265,  266,  267,   -1,   -1,   -1,
-  271,  272,  273,  274,  275,  276,  256,   -1,  258,   -1,
-   -1,  261,  262,  263,  264,  265,  266,  267,  257,  258,
-   -1,  271,  272,  273,  274,  275,  276,   -1,   -1,   -1,
-   -1,  256,  271,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,   -1,   -1,   -1,  271,  272,  273,  274,
-  275,  276,   -1,   -1,  258,   -1,   -1,  261,  262,  263,
-   -1,   -1,   -1,  257,  258,   -1,  258,  271,   -1,  261,
-  262,  263,   -1,   -1,   -1,  269,  270,  271,   -1,  271,
-   -1,   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  271,
+   -1,   -1,  273,  274,  275,  276,  277,  278,  257,  258,
+  258,   -1,  260,  261,   -1,  263,   -1,   -1,   -1,   -1,
+  269,  270,   -1,  258,  273,  273,  261,  262,  263,   -1,
+   -1,   -1,  258,   -1,  260,  261,  258,  263,  273,  261,
+  262,  263,   -1,   -1,   -1,   -1,   -1,  273,   -1,   -1,
+   -1,  273,   -1,   -1,   -1,  258,   -1,   -1,  261,  262,
+  263,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  273,
 };
 #define YYFINAL 11
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 277
+#define YYMAXTOKEN 279
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyname[] =
@@ -523,7 +542,8 @@ char *yyname[] =
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 "COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
 "DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","RUNAS","NOPASSWD","PASSWD",
-"ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR",
+"NOEXEC","EXEC","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
+"RUNASALIAS","ERROR",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const yyrule[] =
@@ -569,7 +589,7 @@ char *yyrule[] =
 "host : ALIAS",
 "cmndspeclist : cmndspec",
 "cmndspeclist : cmndspeclist ',' cmndspec",
-"cmndspec : runasspec nopasswd opcmnd",
+"cmndspec : runasspec noexec nopasswd opcmnd",
 "opcmnd : cmnd",
 "$$5 :",
 "opcmnd : '!' $$5 cmnd",
@@ -588,6 +608,9 @@ char *yyrule[] =
 "nopasswd :",
 "nopasswd : NOPASSWD",
 "nopasswd : PASSWD",
+"noexec :",
+"noexec : NOEXEC",
+"noexec : EXEC",
 "cmnd : ALL",
 "cmnd : ALIAS",
 "cmnd : COMMAND",
@@ -646,7 +669,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 869 "parse.yacc"
+#line 895 "parse.yacc"
 
 #define MOREALIASES (32)
 aliasinfo *aliases = NULL;
@@ -836,6 +859,12 @@ list_matches()
            (void) printf("(%s) ", def_runas_default);
        }
 
+       /* Is execve(2) disabled? */
+       if (cm_list[count].noexecve == TRUE && !def_noexec)
+           (void) fputs("NOEXEC: ", stdout);
+       else if (cm_list[count].noexecve == FALSE && def_noexec)
+           (void) fputs("EXEC: ", stdout);
+
        /* Is a password required? */
        if (cm_list[count].nopasswd == TRUE && def_authenticate)
            (void) fputs("NOPASSWD: ", stdout);
@@ -968,6 +997,7 @@ expand_match_list()
 
     cm_list[cm_list_len].runas = cm_list[cm_list_len].cmnd = NULL;
     cm_list[cm_list_len].nopasswd = FALSE;
+    cm_list[cm_list_len].noexecve = FALSE;
 }
 
 /*
@@ -996,7 +1026,7 @@ init_parser()
     if (printmatches == TRUE)
        expand_match_list();
 }
-#line 948 "sudo.tab.c"
+#line 978 "sudo.tab.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1190,85 +1220,85 @@ yyreduce:
     switch (yyn)
     {
 case 3:
-#line 269 "parse.yacc"
+#line 273 "parse.yacc"
 { ; }
 break;
 case 4:
-#line 271 "parse.yacc"
+#line 275 "parse.yacc"
 { yyerrok; }
 break;
 case 5:
-#line 272 "parse.yacc"
+#line 276 "parse.yacc"
 { push; }
 break;
 case 6:
-#line 272 "parse.yacc"
+#line 276 "parse.yacc"
 {
                            while (top && user_matches != TRUE)
                                pop;
                        }
 break;
 case 7:
-#line 277 "parse.yacc"
+#line 281 "parse.yacc"
 { ; }
 break;
 case 8:
-#line 279 "parse.yacc"
+#line 283 "parse.yacc"
 { ; }
 break;
 case 9:
-#line 281 "parse.yacc"
+#line 285 "parse.yacc"
 { ; }
 break;
 case 10:
-#line 283 "parse.yacc"
+#line 287 "parse.yacc"
 { ; }
 break;
 case 11:
-#line 285 "parse.yacc"
+#line 289 "parse.yacc"
 { ; }
 break;
 case 13:
-#line 291 "parse.yacc"
+#line 295 "parse.yacc"
 {
                            defaults_matches = TRUE;
                        }
 break;
 case 14:
-#line 294 "parse.yacc"
+#line 298 "parse.yacc"
 { push; }
 break;
 case 15:
-#line 294 "parse.yacc"
+#line 298 "parse.yacc"
 {
                            defaults_matches = user_matches;
                            pop;
                        }
 break;
 case 16:
-#line 298 "parse.yacc"
+#line 302 "parse.yacc"
 { push; }
 break;
 case 17:
-#line 298 "parse.yacc"
+#line 302 "parse.yacc"
 {
                            defaults_matches = yyvsp[0].BOOLEAN == TRUE;
                            pop;
                        }
 break;
 case 18:
-#line 302 "parse.yacc"
+#line 306 "parse.yacc"
 { push; }
 break;
 case 19:
-#line 302 "parse.yacc"
+#line 306 "parse.yacc"
 {
                            defaults_matches = host_matches;
                            pop;
                        }
 break;
 case 22:
-#line 312 "parse.yacc"
+#line 316 "parse.yacc"
 {
                            if (defaults_matches == TRUE &&
                                !set_default(yyvsp[0].string, NULL, TRUE)) {
@@ -1279,7 +1309,7 @@ case 22:
                        }
 break;
 case 23:
-#line 320 "parse.yacc"
+#line 324 "parse.yacc"
 {
                            if (defaults_matches == TRUE &&
                                !set_default(yyvsp[0].string, NULL, FALSE)) {
@@ -1290,7 +1320,7 @@ case 23:
                        }
 break;
 case 24:
-#line 328 "parse.yacc"
+#line 332 "parse.yacc"
 {
                            if (defaults_matches == TRUE &&
                                !set_default(yyvsp[-2].string, yyvsp[0].string, TRUE)) {
@@ -1302,7 +1332,7 @@ case 24:
                        }
 break;
 case 25:
-#line 337 "parse.yacc"
+#line 341 "parse.yacc"
 {
                            if (defaults_matches == TRUE &&
                                !set_default(yyvsp[-2].string, yyvsp[0].string, '+')) {
@@ -1314,7 +1344,7 @@ case 25:
                        }
 break;
 case 26:
-#line 346 "parse.yacc"
+#line 350 "parse.yacc"
 {
                            if (defaults_matches == TRUE &&
                                !set_default(yyvsp[-2].string, yyvsp[0].string, '-')) {
@@ -1326,7 +1356,7 @@ case 26:
                        }
 break;
 case 29:
-#line 361 "parse.yacc"
+#line 365 "parse.yacc"
 {
                            /*
                             * We already did a push if necessary in
@@ -1335,34 +1365,32 @@ case 29:
                             */
                            host_matches = -1;
                            runas_matches = -1;
-                           if (def_authenticate)
-                               no_passwd = -1;
-                           else
-                               no_passwd = TRUE;
+                           no_passwd = def_authenticate ? -1 : TRUE;
+                           no_execve = def_noexec ? TRUE : -1;
                        }
 break;
 case 30:
-#line 376 "parse.yacc"
+#line 378 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                host_matches = yyvsp[0].BOOLEAN;
                        }
 break;
 case 31:
-#line 380 "parse.yacc"
+#line 382 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                host_matches = ! yyvsp[0].BOOLEAN;
                        }
 break;
 case 32:
-#line 386 "parse.yacc"
+#line 388 "parse.yacc"
 {
                            yyval.BOOLEAN = TRUE;
                        }
 break;
 case 33:
-#line 389 "parse.yacc"
+#line 391 "parse.yacc"
 {
                            if (addr_matches(yyvsp[0].string))
                                yyval.BOOLEAN = TRUE;
@@ -1372,7 +1400,7 @@ case 33:
                        }
 break;
 case 34:
-#line 396 "parse.yacc"
+#line 398 "parse.yacc"
 {
                            if (netgr_matches(yyvsp[0].string, user_host, user_shost, NULL))
                                yyval.BOOLEAN = TRUE;
@@ -1382,7 +1410,7 @@ case 34:
                        }
 break;
 case 35:
-#line 403 "parse.yacc"
+#line 405 "parse.yacc"
 {
                            if (hostname_matches(user_shost, user_host, yyvsp[0].string) == 0)
                                yyval.BOOLEAN = TRUE;
@@ -1392,7 +1420,7 @@ case 35:
                        }
 break;
 case 36:
-#line 410 "parse.yacc"
+#line 412 "parse.yacc"
 {
                            aliasinfo *aip = find_alias(yyvsp[0].string, HOST_ALIAS);
 
@@ -1417,7 +1445,7 @@ case 36:
                        }
 break;
 case 39:
-#line 438 "parse.yacc"
+#line 440 "parse.yacc"
 {
                            /*
                             * Push the entry onto the stack if it is worth
@@ -1445,14 +1473,14 @@ case 39:
                        }
 break;
 case 40:
-#line 465 "parse.yacc"
+#line 467 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                cmnd_matches = yyvsp[0].BOOLEAN;
                        }
 break;
 case 41:
-#line 469 "parse.yacc"
+#line 471 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1464,14 +1492,14 @@ case 41:
                        }
 break;
 case 42:
-#line 477 "parse.yacc"
+#line 479 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                cmnd_matches = ! yyvsp[0].BOOLEAN;
                        }
 break;
 case 43:
-#line 483 "parse.yacc"
+#line 485 "parse.yacc"
 {
                            if (printmatches == TRUE && host_matches == TRUE &&
                                user_matches == TRUE) {
@@ -1497,17 +1525,17 @@ case 43:
                        }
 break;
 case 44:
-#line 506 "parse.yacc"
+#line 508 "parse.yacc"
 {
                            runas_matches = (yyvsp[0].BOOLEAN == TRUE ? TRUE : FALSE);
                        }
 break;
 case 45:
-#line 511 "parse.yacc"
+#line 513 "parse.yacc"
 { ; }
 break;
 case 46:
-#line 512 "parse.yacc"
+#line 514 "parse.yacc"
 {
                            /* Later entries override earlier ones. */
                            if (yyvsp[0].BOOLEAN != -1)
@@ -1517,11 +1545,11 @@ case 46:
                        }
 break;
 case 47:
-#line 521 "parse.yacc"
+#line 523 "parse.yacc"
 { ; }
 break;
 case 48:
-#line 522 "parse.yacc"
+#line 524 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1533,14 +1561,14 @@ case 48:
                        }
 break;
 case 49:
-#line 530 "parse.yacc"
+#line 532 "parse.yacc"
 {
                            /* Set $$ to the negation of runasuser */
                            yyval.BOOLEAN = (yyvsp[0].BOOLEAN == -1 ? -1 : ! yyvsp[0].BOOLEAN);
                        }
 break;
 case 50:
-#line 536 "parse.yacc"
+#line 538 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1557,7 +1585,7 @@ case 50:
                        }
 break;
 case 51:
-#line 550 "parse.yacc"
+#line 552 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1574,7 +1602,7 @@ case 51:
                        }
 break;
 case 52:
-#line 564 "parse.yacc"
+#line 566 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1591,7 +1619,7 @@ case 52:
                        }
 break;
 case 53:
-#line 578 "parse.yacc"
+#line 580 "parse.yacc"
 {
                            aliasinfo *aip = find_alias(yyvsp[0].string, RUNAS_ALIAS);
 
@@ -1623,7 +1651,7 @@ case 53:
                        }
 break;
 case 54:
-#line 607 "parse.yacc"
+#line 609 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1636,7 +1664,7 @@ case 54:
                        }
 break;
 case 55:
-#line 619 "parse.yacc"
+#line 621 "parse.yacc"
 {
                            /* Inherit NOPASSWD/PASSWD status. */
                            if (printmatches == TRUE && host_matches == TRUE &&
@@ -1649,7 +1677,7 @@ case 55:
                        }
 break;
 case 56:
-#line 629 "parse.yacc"
+#line 631 "parse.yacc"
 {
                            no_passwd = TRUE;
                            if (printmatches == TRUE && host_matches == TRUE &&
@@ -1658,7 +1686,7 @@ case 56:
                        }
 break;
 case 57:
-#line 635 "parse.yacc"
+#line 637 "parse.yacc"
 {
                            no_passwd = FALSE;
                            if (printmatches == TRUE && host_matches == TRUE &&
@@ -1667,7 +1695,38 @@ case 57:
                        }
 break;
 case 58:
-#line 643 "parse.yacc"
+#line 645 "parse.yacc"
+{
+                           /* Inherit NOEXEC/EXEC status. */
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE) {
+                               if (no_execve == TRUE)
+                                   cm_list[cm_list_len].noexecve = TRUE;
+                               else
+                                   cm_list[cm_list_len].noexecve = FALSE;
+                           }
+                       }
+break;
+case 59:
+#line 655 "parse.yacc"
+{
+                           no_execve = TRUE;
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE)
+                               cm_list[cm_list_len].noexecve = TRUE;
+                       }
+break;
+case 60:
+#line 661 "parse.yacc"
+{
+                           no_execve = FALSE;
+                           if (printmatches == TRUE && host_matches == TRUE &&
+                               user_matches == TRUE)
+                               cm_list[cm_list_len].noexecve = FALSE;
+                       }
+break;
+case 61:
+#line 669 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE)
@@ -1686,8 +1745,8 @@ case 58:
                            safe_cmnd = estrdup(user_cmnd);
                        }
 break;
-case 59:
-#line 660 "parse.yacc"
+case 62:
+#line 686 "parse.yacc"
 {
                            aliasinfo *aip;
 
@@ -1718,8 +1777,8 @@ case 59:
                            free(yyvsp[0].string);
                        }
 break;
-case 60:
-#line 689 "parse.yacc"
+case 63:
+#line 715 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                if (in_alias == TRUE) {
@@ -1747,12 +1806,12 @@ case 60:
                                free(yyvsp[0].command.args);
                        }
 break;
-case 63:
-#line 721 "parse.yacc"
+case 66:
+#line 747 "parse.yacc"
 { push; }
 break;
-case 64:
-#line 721 "parse.yacc"
+case 67:
+#line 747 "parse.yacc"
 {
                            if ((host_matches != -1 || pedantic) &&
                                !add_alias(yyvsp[-3].string, HOST_ALIAS, host_matches)) {
@@ -1762,8 +1821,8 @@ case 64:
                            pop;
                        }
 break;
-case 69:
-#line 739 "parse.yacc"
+case 72:
+#line 765 "parse.yacc"
 {
                            push;
                            if (printmatches == TRUE) {
@@ -1775,8 +1834,8 @@ case 69:
                             }
                        }
 break;
-case 70:
-#line 748 "parse.yacc"
+case 73:
+#line 774 "parse.yacc"
 {
                            if ((cmnd_matches != -1 || pedantic) &&
                                !add_alias(yyvsp[-3].string, CMND_ALIAS, cmnd_matches)) {
@@ -1790,12 +1849,12 @@ case 70:
                                in_alias = FALSE;
                        }
 break;
-case 71:
-#line 762 "parse.yacc"
+case 74:
+#line 788 "parse.yacc"
 { ; }
 break;
-case 75:
-#line 770 "parse.yacc"
+case 78:
+#line 796 "parse.yacc"
 {
                            if (printmatches == TRUE) {
                                in_alias = TRUE;
@@ -1806,8 +1865,8 @@ case 75:
                            }
                        }
 break;
-case 76:
-#line 778 "parse.yacc"
+case 79:
+#line 804 "parse.yacc"
 {
                            if ((yyvsp[0].BOOLEAN != -1 || pedantic) &&
                                !add_alias(yyvsp[-3].string, RUNAS_ALIAS, yyvsp[0].BOOLEAN)) {
@@ -1820,12 +1879,12 @@ case 76:
                                in_alias = FALSE;
                        }
 break;
-case 79:
-#line 795 "parse.yacc"
+case 82:
+#line 821 "parse.yacc"
 { push; }
 break;
-case 80:
-#line 795 "parse.yacc"
+case 83:
+#line 821 "parse.yacc"
 {
                            if ((user_matches != -1 || pedantic) &&
                                !add_alias(yyvsp[-3].string, USER_ALIAS, user_matches)) {
@@ -1836,22 +1895,22 @@ case 80:
                            free(yyvsp[-3].string);
                        }
 break;
-case 83:
-#line 810 "parse.yacc"
+case 86:
+#line 836 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                user_matches = yyvsp[0].BOOLEAN;
                        }
 break;
-case 84:
-#line 814 "parse.yacc"
+case 87:
+#line 840 "parse.yacc"
 {
                            if (yyvsp[0].BOOLEAN != -1)
                                user_matches = ! yyvsp[0].BOOLEAN;
                        }
 break;
-case 85:
-#line 820 "parse.yacc"
+case 88:
+#line 846 "parse.yacc"
 {
                            if (strcmp(yyvsp[0].string, user_name) == 0)
                                yyval.BOOLEAN = TRUE;
@@ -1860,8 +1919,8 @@ case 85:
                            free(yyvsp[0].string);
                        }
 break;
-case 86:
-#line 827 "parse.yacc"
+case 89:
+#line 853 "parse.yacc"
 {
                            if (usergr_matches(yyvsp[0].string, user_name))
                                yyval.BOOLEAN = TRUE;
@@ -1870,8 +1929,8 @@ case 86:
                            free(yyvsp[0].string);
                        }
 break;
-case 87:
-#line 834 "parse.yacc"
+case 90:
+#line 860 "parse.yacc"
 {
                            if (netgr_matches(yyvsp[0].string, NULL, NULL, user_name))
                                yyval.BOOLEAN = TRUE;
@@ -1880,8 +1939,8 @@ case 87:
                            free(yyvsp[0].string);
                        }
 break;
-case 88:
-#line 841 "parse.yacc"
+case 91:
+#line 867 "parse.yacc"
 {
                            aliasinfo *aip = find_alias(yyvsp[0].string, USER_ALIAS);
 
@@ -1905,13 +1964,13 @@ case 88:
                            free(yyvsp[0].string);
                        }
 break;
-case 89:
-#line 863 "parse.yacc"
+case 92:
+#line 889 "parse.yacc"
 {
                            yyval.BOOLEAN = TRUE;
                        }
 break;
-#line 1863 "sudo.tab.c"
+#line 1922 "sudo.tab.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 68c1e654f2e6a3b4f05057d52efd81ba8ef1c3c1..ce62976afecec1435f147f6630bc011545971c73 100644 (file)
 #define RUNAS 268
 #define NOPASSWD 269
 #define PASSWD 270
-#define ALL 271
-#define COMMENT 272
-#define HOSTALIAS 273
-#define CMNDALIAS 274
-#define USERALIAS 275
-#define RUNASALIAS 276
-#define ERROR 277
+#define NOEXEC 271
+#define EXEC 272
+#define ALL 273
+#define COMMENT 274
+#define HOSTALIAS 275
+#define CMNDALIAS 276
+#define USERALIAS 277
+#define RUNASALIAS 278
+#define ERROR 279
 typedef union {
     char *string;
     int BOOLEAN;