]> git.pond.sub.org Git - empserver/commitdiff
Make nstr_exec_val() more robust
authorMarkus Armbruster <armbru@pond.sub.org>
Tue, 4 Mar 2008 06:55:32 +0000 (07:55 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Fri, 14 Mar 2008 19:25:40 +0000 (20:25 +0100)
Oops on bad argument, and make a better error value then.

include/nsc.h
src/lib/common/nstreval.c

index 91519206d0aaad911ea69e4c9624432bb438d349..636e0548085d3bb35f897d009faeda18e0acf7e8 100644 (file)
@@ -67,6 +67,9 @@ typedef enum {
 } nsc_type;
 typedef char packed_nsc_type;
 
+/* Is TYPE a promoted value type?  */
+#define NSC_IS_PROMOTED(type) (NSC_LONG <= (type) && (type) <= NSC_STRING)
+
 /* Return nsc_type for a signed integer with the same size as TYPE.  */
 #define NSC_SITYPE(type)                               \
     (sizeof(type) == 1 ? NSC_CHAR                      \
index c730ff5aaf98bde5cc00e16b4a3b0e80f3e0bc7f..24d9dda056afc98fa38b79809c68808c895f1560 100644 (file)
@@ -36,6 +36,7 @@
 #include <config.h>
 
 #include <limits.h>
+#include <string.h>
 #include "file.h"
 #include "nat.h"
 #include "nsc.h"
@@ -45,7 +46,7 @@
 /*
  * Evaluate VAL.
  * If VAL is symbolic, evaluate it into a promoted value type.
- * Use coordinate system of country CNUM.
+ * Use country CNUM's coordinate system and access control.
  * PTR points to a context object of the type that was used to compile
  * the value.
  * Unless WANT is NSC_NOTYPE, coerce the value to promoted value type
@@ -60,10 +61,10 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
     int idx;
     struct natstr *natp;
 
+    if (CANT_HAPPEN(want != NSC_NOTYPE && !NSC_IS_PROMOTED(want)))
+       want = nstr_promote(want);
+
     switch (val->val_cat) {
-    default:
-       CANT_REACH();
-       /* fall through */
     case NSC_VAL:
        valtype = val->val_type;
        break;
@@ -134,6 +135,10 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
            val->val_as.lng = 0;
        }
        val->val_cat = NSC_VAL;
+       break;
+    default:
+       CANT_REACH();
+       valtype = NSC_NOTYPE;
     }
 
     if (valtype == want)
@@ -147,14 +152,9 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
        CANT_REACH();           /* FIXME implement */
 
     if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) {
+       /* make up an error value */
        valtype = want;
-       switch (want) {
-       case NSC_LONG: val->val_as.lng = 0; break;
-       case NSC_DOUBLE: val->val_as.dbl = 0.0; break;
-       case NSC_STRING: val->val_as.str.base = NULL; break;
-       default:
-           CANT_REACH();
-       }
+       memset(&val->val_as, 0, sizeof(val->val_as));
     }
 
     val->val_type = valtype;