URI: 
       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;