some error checking for invalid selectors - webdump - HTML to plain-text converter for webpages
HTML git clone git://git.codemadness.org/webdump
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit 520710cbd57b8e9df4886d60e16976df19a701b9
DIR parent 743dc293a681e8543b6aa4e784bc5e2835aba6d4
HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Thu, 2 Jul 2026 19:27:14 +0200
some error checking for invalid selectors
There is no strict checking but one way it could fail is if there are too deep
selectors (>32 nodes) specified or if it is too long (>256 bytes).
Just print usage on failure for now.
On error the program exits and does not need freeing, but free the selectors to
make the code more reusable for other projects maybe.
Diffstat:
M webdump.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
---
DIR diff --git a/webdump.c b/webdump.c
@@ -143,7 +143,7 @@ struct selectornode {
};
struct selector {
- const char *text;
+ char *text;
struct selectornode nodes[32];
int depth;
};
@@ -1308,6 +1308,7 @@ newselector(const char *q)
r = compileselector(sel->text, sel->nodes, LEN(sel->nodes));
if (r <= 0) {
+ free(sel->text);
free(sel);
return NULL;
}
@@ -1324,7 +1325,7 @@ compileselectors(const char *q)
const char *start;
char *qe;
int count = 0;
- size_t siz;
+ size_t i, siz;
sels = ecalloc(1, sizeof(*sels));
@@ -1335,6 +1336,10 @@ compileselectors(const char *q)
sel = newselector(qe);
free(qe);
+ /* invalid selector */
+ if (!sel)
+ goto invalid;
+
/* add new selector */
siz = (count + 1) * sizeof(struct selector *);
sels->selectors = erealloc(sels->selectors, siz);
@@ -1349,6 +1354,17 @@ compileselectors(const char *q)
sels->count = count;
return sels;
+
+invalid:
+ for (i = 0; i < count; i++) {
+ sel = sels->selectors[count];
+ free(sel->text);
+ free(sel);
+ }
+ free(sels->selectors);
+ free(sels);
+
+ return NULL;
}
/* very limited CSS-like matcher, supports: main, main#id, main.class,
@@ -2470,12 +2486,16 @@ main(int argc, char **argv)
break;
case 's':
sel_show = compileselectors(EARGF(usage()));
+ if (!sel_show)
+ usage(); /* invalid selector */
/* switch to reader/selector mode, ignore all data except when matched */
reader_mode = 1;
reader_ignore = 1;
break;
case 'u':
sel_hide = compileselectors(EARGF(usage()));
+ if (!sel_hide)
+ usage(); /* invalid selector */
/* switch to reader/selector mode */
reader_mode = 1;
break;