Make nstr_exec_val() more robust

Oops on bad argument, and make a better error value then.
This commit is contained in:
Markus Armbruster 2008-03-04 07:55:32 +01:00
parent 422cd52209
commit 0bcb047806
2 changed files with 14 additions and 11 deletions

View file

@ -67,6 +67,9 @@ typedef enum {
} nsc_type; } nsc_type;
typedef char packed_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. */ /* Return nsc_type for a signed integer with the same size as TYPE. */
#define NSC_SITYPE(type) \ #define NSC_SITYPE(type) \
(sizeof(type) == 1 ? NSC_CHAR \ (sizeof(type) == 1 ? NSC_CHAR \

View file

@ -36,6 +36,7 @@
#include <config.h> #include <config.h>
#include <limits.h> #include <limits.h>
#include <string.h>
#include "file.h" #include "file.h"
#include "nat.h" #include "nat.h"
#include "nsc.h" #include "nsc.h"
@ -45,7 +46,7 @@
/* /*
* Evaluate VAL. * Evaluate VAL.
* If VAL is symbolic, evaluate it into a promoted value type. * 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 * PTR points to a context object of the type that was used to compile
* the value. * the value.
* Unless WANT is NSC_NOTYPE, coerce the value to promoted value type * 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; int idx;
struct natstr *natp; struct natstr *natp;
if (CANT_HAPPEN(want != NSC_NOTYPE && !NSC_IS_PROMOTED(want)))
want = nstr_promote(want);
switch (val->val_cat) { switch (val->val_cat) {
default:
CANT_REACH();
/* fall through */
case NSC_VAL: case NSC_VAL:
valtype = val->val_type; valtype = val->val_type;
break; 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_as.lng = 0;
} }
val->val_cat = NSC_VAL; val->val_cat = NSC_VAL;
break;
default:
CANT_REACH();
valtype = NSC_NOTYPE;
} }
if (valtype == want) if (valtype == want)
@ -147,14 +152,9 @@ nstr_exec_val(struct valstr *val, natid cnum, void *ptr, nsc_type want)
CANT_REACH(); /* FIXME implement */ CANT_REACH(); /* FIXME implement */
if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) { if (CANT_HAPPEN(valtype != want && want != NSC_NOTYPE)) {
/* make up an error value */
valtype = want; valtype = want;
switch (want) { memset(&val->val_as, 0, sizeof(val->val_as));
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();
}
} }
val->val_type = valtype; val->val_type = valtype;