From owner-freebsd-bugs@FreeBSD.ORG Wed Nov 28 02:10:02 2007 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A4DB816A41B for ; Wed, 28 Nov 2007 02:10:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 8822A13C44B for ; Wed, 28 Nov 2007 02:10:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.2/8.14.2) with ESMTP id lAS2A2J8044036 for ; Wed, 28 Nov 2007 02:10:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.2/8.14.1/Submit) id lAS2A2MS044035; Wed, 28 Nov 2007 02:10:02 GMT (envelope-from gnats) Resent-Date: Wed, 28 Nov 2007 02:10:02 GMT Resent-Message-Id: <200711280210.lAS2A2MS044035@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Weongyo Jeong Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 80F9016A418 for ; Wed, 28 Nov 2007 02:04:47 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id 733AA13C442 for ; Wed, 28 Nov 2007 02:04:47 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.2/8.14.2) with ESMTP id lAS24eIn093000 for ; Wed, 28 Nov 2007 02:04:40 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.2/8.14.1/Submit) id lAS24eIp092999; Wed, 28 Nov 2007 02:04:40 GMT (envelope-from nobody) Message-Id: <200711280204.lAS24eIp092999@www.freebsd.org> Date: Wed, 28 Nov 2007 02:04:40 GMT From: Weongyo Jeong To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: bin/118296: ndiscvt(8) can't parse a STRING WORD pattern when it process a register key X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Nov 2007 02:10:02 -0000 >Number: 118296 >Category: bin >Synopsis: ndiscvt(8) can't parse a STRING WORD pattern when it process a register key >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Nov 28 02:10:01 UTC 2007 >Closed-Date: >Last-Modified: >Originator: Weongyo Jeong >Release: FreeBSD 7.0 CURRENT >Organization: CDNetworks >Environment: FreeBSD freebsd.weongyo.org 7.0-CURRENT FreeBSD 7.0-CURRENT #3: Sun Jun 24 21:47:30 KST 2007 weongyo@bsd.dev1.cdnetworks.co.kr:/usr/obj/usr/src/sys/GENERIC i386 >Description: In current ndiscvt(8), it can only parse WORD or STRING separately and disallows a syntax like below: HKLM,SOFTWARE\Mi,DEL_HKR_0000,0,"ENUM"%ZD1211B_50U_PNP% So it make a syntax error when it parse some INF files. Attached patch is for supporting these. >How-To-Repeat: $ cat > t.inf [UnZDRegistryUSB.reg] HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\UNZD1211B%InterfaceType%,DEL_HKR_0000,0,"ENUM"%ZD1211B_50U_PNP% ^D $ ndiscvt -i t.inf -s ZD11BUXP.SYS -o tmp.h ndiscvt: line 2: %ZD1211B_50U_PNP%: syntax error. >Fix: Index: inf-parse.y =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf-parse.y,v retrieving revision 1.2 diff -u -r1.2 inf-parse.y --- inf-parse.y 2 Jan 2004 04:31:06 -0000 1.2 +++ inf-parse.y 27 Nov 2007 12:31:56 -0000 @@ -95,17 +95,12 @@ ; regkey - : WORD + : WORD regkey { push_word($1); } - | STRING - { push_word($1); } - | WORD COMMA regkey - { push_word($1); } - | STRING COMMA regkey + | STRING regkey { push_word($1); } | COMMA regkey { push_word(NULL); } - | COMMA - { push_word(NULL); } + | ; %% Index: inf.c =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf.c,v retrieving revision 1.16 diff -u -r1.16 inf.c --- inf.c 15 May 2005 19:46:14 -0000 1.16 +++ inf.c 27 Nov 2007 12:31:56 -0000 @@ -67,6 +67,8 @@ static void dump_regvals (void); static void dump_paramreg (const struct section *, const struct reg *, int); +static int regkey_getidx(int); +static char * regkey_get(int); static FILE *ofp; @@ -736,6 +738,63 @@ return (0); } +static int +regkey_getidx(int slot) +{ + int i, nullcount; + + nullcount = 0; + + if (slot <= 0) + return 0; + + for (i = 0; i < idx; i++) { + if (words[i] != NULL) + continue; + + nullcount++; + if (nullcount == slot) + break; + } + + return i + 1; +} + +static char * +regkey_get(int rt) +{ + int i, start, slots; + char newbuf[256]; + + switch (rt) { + case REGKEY_SUBKEY: + start = regkey_getidx(3); + slots = regkey_getidx(4) - start - 1; + break; + case REGKEY_KEY: + start = regkey_getidx(2); + slots = regkey_getidx(3) - start - 1; + break; + case REGKEY_FLAGS: + start = regkey_getidx(1); + slots = regkey_getidx(2) - start - 1; + break; + case REGKEY_VALUE: + start = regkey_getidx(0); + slots = regkey_getidx(1) - start - 1; + break; + default: + return NULL; + } + + bzero(newbuf, sizeof(newbuf)); + + for (i = start + slots - 1; i >= start; i--) + (void)strcat(newbuf, words[i]); + + return sstrdup(newbuf); +} + void regkey_add (const char *r) { @@ -745,10 +804,10 @@ bzero(reg, sizeof(struct reg)); reg->section = TAILQ_LAST(&sh, section_head); reg->root = sstrdup(r); - reg->subkey = sstrdup(words[3]); - reg->key = sstrdup(words[2]); - reg->flags = satoi(words[1]); - reg->value = sstrdup(words[0]); + reg->subkey = regkey_get(REGKEY_SUBKEY); + reg->key = regkey_get(REGKEY_KEY); + reg->flags = satoi(regkey_get(REGKEY_FLAGS)); + reg->value = regkey_get(REGKEY_VALUE); TAILQ_INSERT_TAIL(&rh, reg, link); free(__DECONST(char *, r)); Index: inf.h =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf.h,v retrieving revision 1.1 diff -u -r1.1 inf.h --- inf.h 11 Dec 2003 22:38:14 -0000 1.1 +++ inf.h 27 Nov 2007 12:31:56 -0000 @@ -51,6 +51,11 @@ #define FLG_ADDREG_TYPE_DWORD 0x00010001 #define FLG_ADDREG_TYPE_NONE 0x00020001 +#define REGKEY_SUBKEY 0x0 +#define REGKEY_KEY 0x1 +#define REGKEY_FLAGS 0x2 +#define REGKEY_VALUE 0x3 + extern void section_add (const char *); extern void assign_add (const char *); extern void define_add (const char *); Patch attached with submission follows: Index: inf-parse.y =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf-parse.y,v retrieving revision 1.2 diff -u -r1.2 inf-parse.y --- inf-parse.y 2 Jan 2004 04:31:06 -0000 1.2 +++ inf-parse.y 27 Nov 2007 12:31:56 -0000 @@ -95,17 +95,12 @@ ; regkey - : WORD + : WORD regkey { push_word($1); } - | STRING - { push_word($1); } - | WORD COMMA regkey - { push_word($1); } - | STRING COMMA regkey + | STRING regkey { push_word($1); } | COMMA regkey { push_word(NULL); } - | COMMA - { push_word(NULL); } + | ; %% Index: inf.c =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf.c,v retrieving revision 1.16 diff -u -r1.16 inf.c --- inf.c 15 May 2005 19:46:14 -0000 1.16 +++ inf.c 27 Nov 2007 12:31:56 -0000 @@ -67,6 +67,8 @@ static void dump_regvals (void); static void dump_paramreg (const struct section *, const struct reg *, int); +static int regkey_getidx(int); +static char * regkey_get(int); static FILE *ofp; @@ -736,6 +738,63 @@ return (0); } +static int +regkey_getidx(int slot) +{ + int i, nullcount; + + nullcount = 0; + + if (slot <= 0) + return 0; + + for (i = 0; i < idx; i++) { + if (words[i] != NULL) + continue; + + nullcount++; + if (nullcount == slot) + break; + } + + return i + 1; +} + +static char * +regkey_get(int rt) +{ + int i, start, slots; + char newbuf[256]; + + switch (rt) { + case REGKEY_SUBKEY: + start = regkey_getidx(3); + slots = regkey_getidx(4) - start - 1; + break; + case REGKEY_KEY: + start = regkey_getidx(2); + slots = regkey_getidx(3) - start - 1; + break; + case REGKEY_FLAGS: + start = regkey_getidx(1); + slots = regkey_getidx(2) - start - 1; + break; + case REGKEY_VALUE: + start = regkey_getidx(0); + slots = regkey_getidx(1) - start - 1; + break; + default: + return NULL; + } + + bzero(newbuf, sizeof(newbuf)); + + for (i = start + slots - 1; i >= start; i--) + (void)strcat(newbuf, words[i]); + + return sstrdup(newbuf); +} + void regkey_add (const char *r) { @@ -745,10 +804,10 @@ bzero(reg, sizeof(struct reg)); reg->section = TAILQ_LAST(&sh, section_head); reg->root = sstrdup(r); - reg->subkey = sstrdup(words[3]); - reg->key = sstrdup(words[2]); - reg->flags = satoi(words[1]); - reg->value = sstrdup(words[0]); + reg->subkey = regkey_get(REGKEY_SUBKEY); + reg->key = regkey_get(REGKEY_KEY); + reg->flags = satoi(regkey_get(REGKEY_FLAGS)); + reg->value = regkey_get(REGKEY_VALUE); TAILQ_INSERT_TAIL(&rh, reg, link); free(__DECONST(char *, r)); Index: inf.h =================================================================== RCS file: /data/cvs/src/usr.sbin/ndiscvt/inf.h,v retrieving revision 1.1 diff -u -r1.1 inf.h --- inf.h 11 Dec 2003 22:38:14 -0000 1.1 +++ inf.h 27 Nov 2007 12:31:56 -0000 @@ -51,6 +51,11 @@ #define FLG_ADDREG_TYPE_DWORD 0x00010001 #define FLG_ADDREG_TYPE_NONE 0x00020001 +#define REGKEY_SUBKEY 0x0 +#define REGKEY_KEY 0x1 +#define REGKEY_FLAGS 0x2 +#define REGKEY_VALUE 0x3 + extern void section_add (const char *); extern void assign_add (const char *); extern void define_add (const char *); >Release-Note: >Audit-Trail: >Unformatted: