]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
- Make is_boolean_expression return true for expr_exists.
authorTed Lemon <source@isc.org>
Fri, 7 May 1999 17:10:38 +0000 (17:10 +0000)
committerTed Lemon <source@isc.org>
Fri, 7 May 1999 17:10:38 +0000 (17:10 +0000)
- Conditionalize pointer debug abort on POINTER_DEBUG.
- When using options in expression evaluation, make sure that there are
  options to use.

common/tree.c

index 8872d36d656a32086a1823758ddeb800c4c068c3..094539bb3dd2a8c4c2bbe02d31ab613a42ea975c 100644 (file)
@@ -22,7 +22,7 @@
 
 #ifndef lint
 static char copyright[] =
-"$Id: tree.c,v 1.27 1999/04/23 22:22:55 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: tree.c,v 1.28 1999/05/07 17:10:38 mellon Exp $ Copyright (c) 1995, 1996, 1997, 1998 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
@@ -484,7 +484,8 @@ int evaluate_boolean_expression (result, packet, options, expr)
 
              case expr_exists:
                memset (&left, 0, sizeof left);
-               if (!((*expr -> data.option -> universe -> get_func)
+               if (!options ||
+                   !((*expr -> data.option -> universe -> get_func)
                      (&left, expr -> data.exists -> universe,
                       options, expr -> data.exists -> code)))
                        *result = 0;
@@ -632,9 +633,12 @@ int evaluate_data_expression (result, packet, options, expr)
 
                /* Extract an option. */
              case expr_option:
-               s0 = ((*expr -> data.option -> universe -> get_func)
-                     (result, expr -> data.option -> universe,
-                      options, expr -> data.option -> code));
+               if (options)
+                       s0 = ((*expr -> data.option -> universe -> get_func)
+                             (result, expr -> data.option -> universe,
+                              options, expr -> data.option -> code));
+               else
+                       s0 = 0;
 
 #if defined (DEBUG_EXPRESSIONS)
                log_info ("data: option %s.%s = %s",
@@ -658,7 +662,7 @@ int evaluate_data_expression (result, packet, options, expr)
                }
                result -> len = packet -> raw -> hlen + 1;
                if (buffer_allocate (&result -> buffer, result -> len,
-                                         "evaluate_data_expression")) {
+                                    "evaluate_data_expression")) {
                        result -> data = &result -> buffer -> data [0];
                        result -> data [0] = packet -> raw -> htype;
                        memcpy (&result -> data [1], packet -> raw -> chaddr,
@@ -699,7 +703,7 @@ int evaluate_data_expression (result, packet, options, expr)
                                         + offset), result -> len);
                                result -> terminated = 0;
                        } else {
-                               log_error ("data: packet: no memory for buffer.");
+                               log_error ("data: packet: no buffer memory.");
                                return 0;
                        }
                        s2 = 1;
@@ -716,8 +720,12 @@ int evaluate_data_expression (result, packet, options, expr)
                /* The encapsulation of all defined options in an
                   option space... */
              case expr_encapsulate:
-               s0 = option_space_encapsulate (result, options,
-                                              &expr -> data.encapsulate);
+               if (options)
+                       s0 = option_space_encapsulate
+                               (result, options, &expr -> data.encapsulate);
+               else
+                       s0 = 0;
+
 #if defined (DEBUG_EXPRESSIONS)
                log_info ("data: encapsulate (%s) = %s",
                          expr -> data.encapsulate.data,
@@ -902,7 +910,7 @@ int evaluate_numeric_expression (result, packet, options, expr)
                return 1;
        }
 
-       log_error ("Bogus opcode in evaluate_numeric_expression: %d", expr -> op);
+       log_error ("evaluate_numeric_expression: bogus opcode %d", expr -> op);
        return 0;
 }
 
@@ -940,7 +948,7 @@ int evaluate_boolean_option_cache (packet, options, oc)
        int result;
 
        /* So that we can be called with option_lookup as an argument. */
-       if (!oc)
+       if (!oc || !options)
                return 0;
        
        memset (&ds, 0, sizeof ds);
@@ -994,7 +1002,11 @@ void expression_dereference (eptr, name)
                return;
        if (expr -> refcnt < 0) {
                log_error ("expression_dereference: negative refcnt!");
+#if defined (POINTER_DEBUG)
                abort ();
+#else
+               return;
+#endif
        }
 
        /* Dereference subexpressions. */
@@ -1124,6 +1136,7 @@ int is_boolean_expression (expr)
        struct expression *expr;
 {
        return (expr -> op == expr_check ||
+               expr -> op == expr_exists ||
                expr -> op == expr_equal ||
                expr -> op == expr_and ||
                expr -> op == expr_or ||