From: danw Date: Wed, 1 Oct 1997 22:30:26 +0000 (+0000) Subject: Add validation of numeric query arguments X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/commitdiff_plain/f0e5d2fedf8aa93d4b0627630f3a887c2bfc2abf Add validation of numeric query arguments (and fix a handful of other validation bogons I noticed along the way) --- diff --git a/server/queries2.c b/server/queries2.c index d5454418..2244f358 100644 --- a/server/queries2.c +++ b/server/queries2.c @@ -354,10 +354,14 @@ static char *gubu_fields[] = { MIT_ID, CLASS, MOD1, MOD2, MOD3, }; +static struct valobj gubu_valobj[] = { + {V_NUM, 0} +}; + static struct validate gubu_validate = { - 0, - 0, + gubu_valobj, + 1, 0, 0, 0, @@ -424,18 +428,21 @@ static char *auac_fields[] = { static struct valobj auac_valobj[] = { {V_LOCK, 0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, {V_CHAR, 0, USERS_TABLE, LOGIN}, + {V_NUM, 1}, {V_CHAR, 2, USERS_TABLE, SHELL}, {V_CHAR, 3, USERS_TABLE, LAST}, {V_CHAR, 4, USERS_TABLE, FIRST}, {V_CHAR, 5, USERS_TABLE, MIDDLE}, + {V_NUM, 6}, {V_CHAR, 7, USERS_TABLE, MIT_ID}, {V_TYPE, 8, 0, CLASS, 0, MR_BAD_CLASS}, {V_ID, 9, STRINGS_TABLE, "string", "string_id", MR_NO_MATCH}, + {V_NUM, 10} }; static struct validate auac_validate = { auac_valobj, - 9, + 12, LOGIN, "login = '%s'", 1, @@ -447,7 +454,7 @@ static struct validate auac_validate = { static struct validate ausr_validate = { auac_valobj, - 8, + 10, LOGIN, "login = '%s'", 1, @@ -470,11 +477,14 @@ static struct valobj rusr_valobj[] = { {V_LOCK, 0, NFSPHYS_TABLE, 0, "nfsphys_id", MR_DEADLOCK}, {V_LOCK, 0, QUOTA_TABLE,0, FILSYS_ID, MR_DEADLOCK}, {V_RLOCK,0, SERVERHOSTS_TABLE,0, MACH_ID, MR_DEADLOCK}, + {V_NUM, 0}, + {V_CHAR, 1}, + {V_NUM, 2}, }; static struct validate rusr_validate = { rusr_valobj, - 8, + 11, 0, 0, 0, @@ -494,18 +504,21 @@ static struct valobj uuac_valobj[] = { {V_LOCK, 0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, {V_ID, 0, USERS_TABLE, LOGIN, USERS_ID, MR_USER}, {V_RENAME, 1, USERS_TABLE, LOGIN, USERS_ID, MR_NOT_UNIQUE}, + {V_NUM, 2}, {V_CHAR, 3, USERS_TABLE, SHELL}, {V_CHAR, 4, USERS_TABLE, FIRST}, {V_CHAR, 5, USERS_TABLE, LAST}, {V_CHAR, 6, USERS_TABLE, MIDDLE}, + {V_NUM, 7}, {V_CHAR, 8, USERS_TABLE, MIT_ID}, {V_TYPE, 9, 0, CLASS, 0, MR_BAD_CLASS}, {V_ID, 10, STRINGS_TABLE, "string", "string_id", MR_NO_MATCH}, + {V_NUM, 12}, }; static struct validate uuac_validate = { uuac_valobj, - 10, + 13, 0, 0, 0, @@ -517,7 +530,7 @@ static struct validate uuac_validate = { static struct validate uusr_validate = { uuac_valobj, - 10, + 12, 0, 0, 0, @@ -560,9 +573,16 @@ static char *uuss_fields[] = { SECURE, }; +static struct valobj uust_valobj[] = { + {V_LOCK, 0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, + {V_ID, 0, USERS_TABLE, LOGIN, USERS_ID, MR_USER}, + {V_NUM, 1}, + {V_NUM, 2}, +}; + static struct validate uust_validate = { - VOuser0lock, - 2, + uust_valobj, + 3, 0, 0, 0, @@ -578,8 +598,8 @@ static char *uudf_fields[] = { }; static struct validate uudf_validate = { - VOuser0lock, - 2, + uust_valobj, + 4, 0, 0, 0, @@ -855,17 +875,19 @@ static char *ahst_fields[] = { }; static struct valobj ahst_valobj[] = { + {V_RLOCK,0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, + {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, + {V_RLOCK, 0, SUBNET_TABLE, 0, SNET_ID, MR_DEADLOCK}, + {V_RLOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, + {V_RLOCK, 0, HOSTALIAS_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_CHAR, 0, MACHINE_TABLE, NAME}, {V_CHAR, 1, MACHINE_TABLE, "vendor"}, {V_CHAR, 2, MACHINE_TABLE, "model"}, {V_CHAR, 3, MACHINE_TABLE, "os"}, {V_CHAR, 4, MACHINE_TABLE, "location"}, {V_CHAR, 5, MACHINE_TABLE, "contact"}, - {V_RLOCK,0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, - {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, - {V_RLOCK, 0, SUBNET_TABLE, 0, SNET_ID, MR_DEADLOCK}, - {V_RLOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, - {V_RLOCK, 0, HOSTALIAS_TABLE, 0, MACH_ID, MR_DEADLOCK}, + {V_NUM, 6}, + {V_NUM, 7}, {V_ID, 8, SUBNET_TABLE, NAME, SNET_ID, MR_SUBNET}, {V_TYPE, 10, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 11, 0, 0, 0, MR_ACE}, @@ -875,7 +897,7 @@ static struct valobj ahst_valobj[] = { static struct validate ahst_validate = { ahst_valobj, - 16, + 18, NAME, "name = UPPER('%s')", 1, @@ -902,6 +924,9 @@ static struct valobj uhst_valobj[] = { {V_CHAR, 3, MACHINE_TABLE, "model"}, {V_CHAR, 4, MACHINE_TABLE, "os"}, {V_CHAR, 5, MACHINE_TABLE, "location"}, + {V_CHAR, 6, MACHINE_TABLE, "contact"}, + {V_NUM, 7}, + {V_NUM, 8}, {V_ID, 9, SUBNET_TABLE, NAME, SNET_ID, MR_SUBNET}, {V_TYPE, 11, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 12, 0, 0, 0, MR_ACE}, @@ -911,7 +936,7 @@ static struct valobj uhst_valobj[] = { static struct validate uhst_validate = { uhst_valobj, - 16, + 19, 0, 0, 0, @@ -1043,6 +1068,10 @@ static struct valobj asnt_valobj[] = { {V_RLOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, {V_CHAR, 0, SUBNET_TABLE, NAME}, {V_LEN, 1, SUBNET_TABLE, DESC}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, {V_LEN, 6, SUBNET_TABLE, "prefix"}, {V_TYPE, 7, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 8, 0, 0, 0, MR_ACE}, @@ -1051,7 +1080,7 @@ static struct valobj asnt_valobj[] = { static struct validate asnt_validate = { asnt_valobj, - 8, + 12, NAME, "name = UPPER('%s')", 1, @@ -1073,6 +1102,10 @@ static struct valobj usnt_valobj[] = { {V_ID, 0, SUBNET_TABLE, NAME, SNET_ID, MR_NO_MATCH}, {V_RENAME, 1, SUBNET_TABLE, NAME, SNET_ID, MR_NOT_UNIQUE}, {V_LEN, 2, SUBNET_TABLE, DESC}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, + {V_NUM, 6}, {V_LEN, 7, SUBNET_TABLE, "prefix"}, {V_TYPE, 8, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 9, 0, 0, 0, MR_ACE}, @@ -1081,7 +1114,7 @@ static struct valobj usnt_valobj[] = { static struct validate usnt_validate = { usnt_valobj, - 9, + 13, NAME, "snet_id = %d", 1, @@ -1289,6 +1322,12 @@ static struct valobj alis_valobj[] = { {V_RLOCK, 0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, {V_LOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, {V_CHAR, 0, LIST_TABLE, NAME}, + {V_NUM, 1}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, + {V_NUM, 6}, {V_TYPE, 7, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 8, 0, 0, LIST_ID, MR_ACE}, {V_LEN, 9, LIST_TABLE, DESC}, @@ -1296,7 +1335,7 @@ static struct valobj alis_valobj[] = { static struct validate alis_validate = { alis_valobj, - 6, + 12, NAME, "name = '%s'", 1, @@ -1317,14 +1356,20 @@ static struct valobj ulis_valobj[] = { {V_LOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, {V_ID, 0, LIST_TABLE, NAME, LIST_ID, MR_LIST}, {V_RENAME, 1, LIST_TABLE, NAME, LIST_ID, MR_NOT_UNIQUE}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, + {V_NUM, 6}, + {V_NUM, 7}, + {V_TYPE, 8, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 9, 0, 0, LIST_ID, MR_ACE}, - {V_CHAR, 1, LIST_TABLE, NAME}, {V_LEN, 10, LIST_TABLE, DESC}, }; static struct validate ulis_validate = { ulis_valobj, - 7, + 13, NAME, "list_id = %d", 1, @@ -1588,9 +1633,11 @@ static struct valobj asin_valobj[] = { {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_RLOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, {V_CHAR, 0, SERVERS_TABLE, NAME}, + {V_NUM, 1}, {V_LEN, 2, SERVERS_TABLE, "target_file"}, {V_LEN, 3, SERVERS_TABLE, "script"}, {V_TYPE, 4, 0, "service", 0, MR_TYPE}, + {V_NUM, 5}, {V_TYPE, 6, 0, ACE_TYPE, 0, MR_ACE}, {V_TYPEDATA, 7, 0, 0, 0, MR_ACE}, }; @@ -1598,7 +1645,7 @@ static struct valobj asin_valobj[] = { static struct validate asin_validate = /* for asin, usin */ { asin_valobj, - 9, + 11, NAME, "name = UPPER('%s')", 1, @@ -1628,12 +1675,16 @@ static struct valobj ssif_valobj[] = { {V_RLOCK, 0, USERS_TABLE, 0, USERS_ID, MR_DEADLOCK}, {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_RLOCK, 0, LIST_TABLE, 0, LIST_ID, MR_DEADLOCK}, + {V_NUM, 1}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, {V_LEN, 5, SERVERS_TABLE, "errmsg"}, }; static struct validate ssif_validate = { ssif_valobj, - 4, + 8, NAME, "name = UPPER('%s')", 1, @@ -1716,15 +1767,18 @@ static struct valobj ashi_valobj[] = { {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_NAME, 0, SERVERS_TABLE, NAME, 0, MR_SERVICE}, {V_LOCK, 0, SERVERHOSTS_TABLE,0, MACH_ID, MR_DEADLOCK}, - {V_ID, 1, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, {V_CHAR, 0, SERVERHOSTS_TABLE, NAME}, + {V_ID, 1, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, {V_LEN, 5, SERVERHOSTS_TABLE, "value3"}, }; static struct validate ashi_validate = /* ashi & ushi */ { ashi_valobj, - 6, + 9, SERVICE, "service = UPPER('%s') AND mach_id = %d", 2, @@ -1737,7 +1791,7 @@ static struct validate ashi_validate = /* ashi & ushi */ static struct validate rshe_validate = { ashi_valobj, - 4, + 5, SERVICE, "service = UPPER('%s') AND mach_id = %d", 2, @@ -1750,7 +1804,7 @@ static struct validate rshe_validate = static struct validate ssho_validate = { ashi_valobj, - 4, + 5, SERVICE, "service = UPPER('%s') AND mach_id = %d", 2, @@ -1768,14 +1822,20 @@ static char *sshi_fields[] = { static struct valobj sshi_valobj[] = { {V_RLOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_NAME, 0, SERVERS_TABLE, NAME, 0, MR_SERVICE}, - {V_ID, 1, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, /** Was this ok to add? */ - {V_LEN, 5, SERVERS_TABLE, "errmsg"}, + {V_ID, 1, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, + {V_NUM, 2}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, + {V_LEN, 6, SERVERS_TABLE, "errmsg"}, + {V_NUM, 7}, + {V_NUM, 8}, }; static struct validate sshi_validate = { sshi_valobj, - 4, + 10, 0, 0, 0, @@ -1792,7 +1852,7 @@ static char *dshi_fields[] = { static struct validate dshi_validate = { ashi_valobj, - 4, + 5, SERVICE, "service = UPPER('%s') AND mach_id = %d", 2, @@ -1905,15 +1965,17 @@ static struct valobj afil_valobj[] = { {V_ID, 2, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, {V_CHAR, 3, FILESYS_TABLE, NAME}, {V_LEN, 4, FILESYS_TABLE, "mount"}, + {V_LEN, 5, FILESYS_TABLE, "rwaccess"}, {V_LEN, 6, FILESYS_TABLE, COMMENTS}, {V_ID, 7, USERS_TABLE, LOGIN, USERS_ID, MR_USER}, {V_ID, 8, LIST_TABLE, NAME, LIST_ID, MR_LIST}, + {V_NUM, 9}, {V_TYPE, 10, 0, "lockertype", 0, MR_TYPE}, }; static struct validate afil_validate = { afil_valobj, - 13, + 15, LABEL, "label = '%s'", 1, @@ -1940,15 +2002,17 @@ static struct valobj ufil_valobj[] = { {V_ID, 3, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, {V_CHAR, 4, FILESYS_TABLE, NAME}, {V_LEN, 5, FILESYS_TABLE, "mount"}, + {V_LEN, 6, FILESYS_TABLE, "rwaccess"}, {V_LEN, 7, FILESYS_TABLE, COMMENTS}, {V_ID, 8, USERS_TABLE, LOGIN, USERS_ID, MR_USER}, {V_ID, 9, LIST_TABLE, NAME, LIST_ID, MR_LIST}, + {V_NUM, 10}, {V_TYPE, 11, 0, "lockertype", 0, MR_TYPE}, }; static struct validate ufil_validate = { ufil_valobj, - 15, + 17, LABEL, "filsys_id = %d", 1, @@ -2054,11 +2118,14 @@ static struct valobj anfp_valobj[] = { {V_ID, 0, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, {V_CHAR, 1, NFSPHYS_TABLE, "dir"}, {V_LEN, 2, NFSPHYS_TABLE, "device"}, + {V_NUM, 3}, + {V_NUM, 4}, + {V_NUM, 5}, }; static struct validate anfp_validate = { anfp_valobj, - 5, + 8, DIR, "mach_id = %d and dir = '%s'", 2, @@ -2070,7 +2137,7 @@ static struct validate anfp_validate = { static struct validate unfp_validate = { anfp_valobj, - 5, + 8, DIR, "mach_id = %d and dir = '%s'", 2, @@ -2084,6 +2151,26 @@ static char *ajnf_fields[] = { MACHINE, DIR, "adjustment", }; +static struct valobj ajnf_valobj[] = { + {V_RLOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, + {V_LOCK, 0, NFSPHYS_TABLE, 0, "nfsphys_id", MR_DEADLOCK}, + {V_ID, 0, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, + {V_CHAR, 1, NFSPHYS_TABLE, "dir"}, + {V_NUM, 2}, +}; + +static struct validate ajnf_validate = { + ajnf_valobj, + 5, + DIR, + "mach_id = %d and dir = '%s'", + 2, + "nfsphys_id", + 0, + 0, + set_nfsphys_modtime, +}; + static char *dnfp_fields[] = { MACHINE, DIR, }; @@ -2093,7 +2180,6 @@ static struct valobj dnfp_valobj[] = { {V_LOCK, 0, MACHINE_TABLE, 0, MACH_ID, MR_DEADLOCK}, {V_LOCK, 0, NFSPHYS_TABLE, 0, "nfsphys_id", MR_DEADLOCK}, {V_ID, 0, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, - }; static struct validate dnfp_validate = { @@ -2166,11 +2252,12 @@ static struct valobj aqot_valobj[] = { {V_ID, 0, FILESYS_TABLE, LABEL, FILSYS_ID, MR_FILESYS}, {V_TYPE, 1, 0, QUOTA_TYPE, 0, MR_TYPE}, {V_TYPEDATA, 2, 0, 0, 0, MR_ACE}, + {V_NUM, 3}, }; static struct validate aqot_validate = { aqot_valobj, - 8, + 9, FILSYS_ID, "filsys_id = %d and type = '%s' and entity_id = %d", 3, @@ -2182,7 +2269,7 @@ static struct validate aqot_validate = { static struct validate uqot_validate = { aqot_valobj, - 8, + 9, FILSYS_ID, "filsys_id = %d AND type = '%s' AND entity_id = %d", 3, @@ -2237,9 +2324,16 @@ static char *anfq_fields[] = { FILESYS, LOGIN, QUOTA, }; +static struct valobj anfq_valobj[] = { + {V_LOCK, 0, FILESYS_TABLE, 0, FILSYS_ID, MR_DEADLOCK}, + {V_ID, 0, FILESYS_TABLE, LABEL, FILSYS_ID, MR_FILESYS}, + {V_ID, 1, USERS_TABLE, LOGIN, USERS_ID, MR_USER}, + {V_NUM, 2}, +}; + static struct validate anfq_validate = { - VOfilsys0user1, - 3, + anfq_valobj, + 4, FILSYS_ID, "filsys_id = %d AND type = 'USER' AND entity_id = %d", 2, @@ -2250,8 +2344,8 @@ static struct validate anfq_validate = { }; static struct validate unfq_validate = { - VOfilsys0user1, - 3, + anfq_valobj, + 4, FILSYS_ID, "filsys_id = %d AND type = 'USER' AND entity_id = %d", 2, @@ -2262,7 +2356,7 @@ static struct validate unfq_validate = { }; static struct validate dnfq_validate = { - VOfilsys0user1, + anfq_valobj, 3, FILSYS_ID, "filsys_id = %d AND entity_id = %d", @@ -2428,12 +2522,13 @@ static char *asvc_fields[] = { static struct valobj asvc_valobj[] = { {V_CHAR, 0, SERVICES_TABLE, NAME}, {V_CHAR, 1, SERVICES_TABLE, "protocol"}, + {V_NUM, 2}, {V_CHAR, 3, SERVICES_TABLE, DESC}, }; static struct validate asvc_validate = { asvc_valobj, - 3, + 4, NAME, "name = '%s'", 1, @@ -2481,12 +2576,14 @@ static struct valobj apce_valobj[] = { {V_LEN, 2, PRINTCAP_TABLE, "dir"}, {V_LEN, 3, PRINTCAP_TABLE, "rp"}, {V_ID, 4, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, + {V_NUM, 5}, + {V_NUM, 6}, {V_CHAR, 7, PRINTCAP_TABLE, "comments"}, }; static struct validate apce_validate = { apce_valobj, - 6, + 8, NAME, "name = '%s'", 1, @@ -2525,12 +2622,13 @@ static char *apdm_fields[] = { static struct valobj apdm_valobj[] = { {V_CHAR, 0, PALLADIUM_TABLE, NAME}, + {V_NUM, 1}, {V_ID, 2, MACHINE_TABLE, NAME, MACH_ID, MR_MACHINE}, }; static struct validate apdm_validate = { apdm_valobj, - 2, + 3, NAME, "name = '%s'", 1, @@ -2618,12 +2716,13 @@ static char *aval_fields[] = { static struct valobj aval_valobj[] = { {V_CHAR, 0, NUMVALUES_TABLE, NAME}, + {V_NUM, 1}, }; static struct validate aval_validate = /* for aval, uval, and dval */ { aval_valobj, - 1, + 2, NAME, "name = '%s'", 1, @@ -2645,10 +2744,14 @@ static char *_sdl_fields[] = { "level", }; +static struct valobj _sdl_valobj[] = { + {V_NUM, 0}, +}; + static struct validate _sdl_validate = { - 0, - 0, + _sdl_valobj, + 1, (char *)0, (char *)0, 0, @@ -4312,7 +4415,7 @@ struct query Queries2[] = { "mach_id = %d AND dir = '%s'", 2, 0, - &unfp_validate, + &ajnf_validate, }, { diff --git a/server/query.h b/server/query.h index 22e55b83..bdaf2411 100644 --- a/server/query.h +++ b/server/query.h @@ -57,7 +57,7 @@ struct validate /* Validated Object Types */ enum vo_type {V_NAME, V_ID, V_TYPE, V_TYPEDATA, V_DATE, V_RENAME, V_CHAR, V_LOCK, V_WILD, V_UPWILD, - V_RLOCK, V_LEN}; + V_RLOCK, V_LEN, V_NUM}; /* Validated Object Definition */ struct valobj diff --git a/server/qvalidate.pc b/server/qvalidate.pc index 400d6c5c..dfd8e05f 100644 --- a/server/qvalidate.pc +++ b/server/qvalidate.pc @@ -37,6 +37,7 @@ int validate_rename(char *argv[], struct valobj *vo); int validate_type(char *argv[], struct valobj *vo); int validate_typedata(struct query *, char *argv[], struct valobj *vo); int validate_len(char *argv[], struct valobj *vo); +int validate_num(char *argv[], struct valobj *vo); int lock_table(struct valobj *vo); int readlock_table(struct valobj *vo); int convert_wildcards_uppercase(char *arg); @@ -141,6 +142,12 @@ int validate_fields(q, argv, vo, n) status = validate_len(argv, vo); break; + case V_NUM: + if (log_flags & LOG_VALID) + com_err(whoami, 0, "validating number: %s", argv[vo->index]); + status = validate_num(argv, vo); + break; + case V_LOCK: status = lock_table(vo); break; @@ -529,6 +536,20 @@ int readlock_table(vo) */ } +/* Make sure the data is numeric */ +int validate_num(argv, vo) + register char *argv[]; + register struct valobj *vo; +{ + char *p = argv[vo->index]; + + if (*p == '-') p++; + for (;*p;p++) + if (*p < '0' || *p > '9') return MR_INTEGER; + + return MR_EXISTS; +} + /* Check the database at startup time. */ void sanity_check_database(void)