From 6235da689cb928ce3b4f9e6deb4a50a5b9c841fb Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 25 Nov 2004 00:47:11 +0000 Subject: [PATCH] check for extra bits --- base/chiark-tcl.h | 1 + hbytes/hbytes.h | 1 + maskmap/maskmap.c | 24 +++++++++++++++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/base/chiark-tcl.h b/base/chiark-tcl.h index f57b037..48ee798 100644 --- a/base/chiark-tcl.h +++ b/base/chiark-tcl.h @@ -90,6 +90,7 @@ * HBYTES MASKMAP SYNTAX UNDERRUN value for mask-map entry hex too short * HBYTES MASKMAP SYNTAX OVERRUN actual mask-map entry hex too short * HBYTES MASKMAP SYNTAX ORDER actual mask-map is disordered + * HBYTES MASKMAP SYNTAX EXCLBITS mask-map has 1-bits outside prefix len * SOCKADDR AFUNIX LENGTH path for AF_UNIX socket too long * SOCKADDR SYNTAX IPV4 bad IPv4 socket address &/or port * SOCKADDR SYNTAX OTHER bad socket addr, couldn't tell what kind diff --git a/hbytes/hbytes.h b/hbytes/hbytes.h index f57b037..48ee798 100644 --- a/hbytes/hbytes.h +++ b/hbytes/hbytes.h @@ -90,6 +90,7 @@ * HBYTES MASKMAP SYNTAX UNDERRUN value for mask-map entry hex too short * HBYTES MASKMAP SYNTAX OVERRUN actual mask-map entry hex too short * HBYTES MASKMAP SYNTAX ORDER actual mask-map is disordered + * HBYTES MASKMAP SYNTAX EXCLBITS mask-map has 1-bits outside prefix len * SOCKADDR AFUNIX LENGTH path for AF_UNIX socket too long * SOCKADDR SYNTAX IPV4 bad IPv4 socket address &/or port * SOCKADDR SYNTAX OTHER bad socket addr, couldn't tell what kind diff --git a/maskmap/maskmap.c b/maskmap/maskmap.c index 1ae8439..1f122e9 100644 --- a/maskmap/maskmap.c +++ b/maskmap/maskmap.c @@ -36,21 +36,22 @@ static void mme_free(MaskMap_Entry *mme) { } static int mme_parsekey(Tcl_Interp *ip, MaskMap_Entry *mme, - Tcl_Obj *prefixo, Tcl_Obj *prefixleno, + Tcl_Obj *prefixo, Tcl_Obj *prefixbitso, int inmap) { /* *mme should be blank entry; after exit (even error exit) it will be valid * - on errors, it will be blank. inmap is 1 if we're parsing an existing * map or 0 if it's an entry to be added or modified. */ HBytes_Value prefix; - int suppliedprefixbytes, prefixlen, wantprefixbytes; + int suppliedprefixbytes, prefixbits, wantprefixbytes, sparebits; + const Byte *data; int rc; hbytes_empty(&prefix); rc= pat_hb(ip,prefixo,&prefix); if (rc) goto x_rc; - rc= pat_int(ip,prefixleno,&prefixlen); if (rc) goto x_rc; + rc= pat_int(ip,prefixbitso,&prefixbits); if (rc) goto x_rc; - wantprefixbytes= prefix_bytes(prefixlen); + wantprefixbytes= prefix_bytes(prefixbits); suppliedprefixbytes= hbytes_len(&prefix); if (suppliedprefixbytes < wantprefixbytes) { @@ -63,9 +64,17 @@ static int mme_parsekey(Tcl_Interp *ip, MaskMap_Entry *mme, "HBYTES MASKMAP SYNTAX OVERRUN"); goto x_rc; } - mme->prefixlen= prefixlen; + sparebits= wantprefixbytes*8 - prefixbits; + data= hbytes_data(&prefix); + if (sparebits && (data[wantprefixbytes-1] & ((1u << sparebits)-1))) { + rc= staticerr(ip, "mask-map entry PREFIX contains bits excluded" + " by PREFIX-LEN", "HBYTES MASKMAP SYNTAX EXCLBITS"); + goto x_rc; + } + + mme->prefixlen= prefixbits; mme->prefix= TALLOC(wantprefixbytes); assert(mme->prefix); - memcpy(mme->prefix, hbytes_data(&prefix), wantprefixbytes); + memcpy(mme->prefix, data, wantprefixbytes); return TCL_OK; x_rc: @@ -102,7 +111,8 @@ static void mm_allocentries(MaskMap_Value *mm, int len) { int do_maskmap_amend(ClientData cd, Tcl_Interp *ip, MaskMap_Var map, HBytes_Value prefix, int preflen, Tcl_Obj *data) { - return TCL_OK; /*fixme*/ + + return TCL_OK; } int do_maskmap_lookup(ClientData cd, Tcl_Interp *ip, -- 2.30.2