=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/cgi.c,v retrieving revision 1.35 retrieving revision 1.36 diff -c -r1.35 -r1.36 *** src/usr.bin/mandoc/cgi.c 2014/08/27 00:06:08 1.35 --- src/usr.bin/mandoc/cgi.c 2014/09/14 19:44:20 1.36 *************** *** 1,4 **** ! /* $OpenBSD: cgi.c,v 1.35 2014/08/27 00:06:08 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2014 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: cgi.c,v 1.36 2014/09/14 19:44:20 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2014 Ingo Schwarze *************** *** 953,962 **** struct mansearch search; struct manpaths paths; struct manpage *res; ! char **cp; ! const char *ep, *start; size_t ressz; ! int i, sz; /* * Begin by chdir()ing into the root of the manpath. --- 953,962 ---- struct mansearch search; struct manpaths paths; struct manpage *res; ! char **argv; ! char *query, *rp, *wp; size_t ressz; ! int argc; /* * Begin by chdir()ing into the root of the manpath. *************** *** 981,1026 **** paths.paths[0] = mandoc_strdup("."); /* ! * Poor man's tokenisation: just break apart by spaces. ! * Yes, this is half-ass. But it works for now. */ ! ep = req->q.query; ! while (ep && isspace((unsigned char)*ep)) ! ep++; ! ! sz = 0; ! cp = NULL; ! while (ep && '\0' != *ep) { ! cp = mandoc_reallocarray(cp, sz + 1, sizeof(char *)); ! start = ep; ! while ('\0' != *ep && ! isspace((unsigned char)*ep)) ! ep++; ! cp[sz] = mandoc_malloc((ep - start) + 1); ! memcpy(cp[sz], start, ep - start); ! cp[sz++][ep - start] = '\0'; ! while (isspace((unsigned char)*ep)) ! ep++; } ! if (0 == mansearch(&search, &paths, sz, cp, &res, &ressz)) pg_noresult(req, "You entered an invalid query."); else if (0 == ressz) pg_noresult(req, "No results found."); else pg_searchres(req, res, ressz); ! for (i = 0; i < sz; i++) ! free(cp[i]); ! free(cp); ! ! for (i = 0; i < (int)ressz; i++) { ! free(res[i].file); ! free(res[i].names); ! free(res[i].output); ! } ! free(res); ! free(paths.paths[0]); free(paths.paths); } --- 981,1025 ---- paths.paths[0] = mandoc_strdup("."); /* ! * Break apart at spaces with backslash-escaping. */ ! argc = 0; ! argv = NULL; ! rp = query = mandoc_strdup(req->q.query); ! for (;;) { ! while (isspace((unsigned char)*rp)) ! rp++; ! if (*rp == '\0') ! break; ! argv = mandoc_reallocarray(argv, argc + 1, sizeof(char *)); ! argv[argc++] = wp = rp; ! for (;;) { ! if (isspace((unsigned char)*rp)) { ! *wp = '\0'; ! rp++; ! break; ! } ! if (rp[0] == '\\' && rp[1] != '\0') ! rp++; ! if (wp != rp) ! *wp = *rp; ! if (*rp == '\0') ! break; ! wp++; ! rp++; ! } } ! if (0 == mansearch(&search, &paths, argc, argv, &res, &ressz)) pg_noresult(req, "You entered an invalid query."); else if (0 == ressz) pg_noresult(req, "No results found."); else pg_searchres(req, res, ressz); ! free(query); ! mansearch_free(res, ressz); free(paths.paths[0]); free(paths.paths); }