[BACK]Return to cgi.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/cgi.c between version 1.90 and 1.96

version 1.90, 2014/07/25 20:09:09 version 1.96, 2014/08/26 11:21:40
Line 15 
Line 15 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
   #include <sys/types.h>
   #include <sys/time.h>
   
 #include <ctype.h>  #include <ctype.h>
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
   #include <stdint.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 55  struct req {
Line 57  struct req {
 static  void             catman(const struct req *, const char *);  static  void             catman(const struct req *, const char *);
 static  void             format(const struct req *, const char *);  static  void             format(const struct req *, const char *);
 static  void             html_print(const char *);  static  void             html_print(const char *);
 static  void             html_printquery(const struct req *);  
 static  void             html_putchar(char);  static  void             html_putchar(char);
 static  int              http_decode(char *);  static  int              http_decode(char *);
 static  void             http_parse(struct req *, const char *);  static  void             http_parse(struct req *, const char *);
 static  void             http_print(const char *);  static  void             http_print(const char *);
 static  void             http_putchar(char);  static  void             http_putchar(char);
 static  void             http_printquery(const struct req *);  static  void             http_printquery(const struct req *, const char *);
 static  void             pathgen(struct req *);  static  void             pathgen(struct req *);
 static  void             pg_error_badrequest(const char *);  static  void             pg_error_badrequest(const char *);
 static  void             pg_error_internal(void);  static  void             pg_error_internal(void);
Line 91  static const char *const sec_names[] = {
Line 92  static const char *const sec_names[] = {
     "All Sections",      "All Sections",
     "1 - General Commands",      "1 - General Commands",
     "2 - System Calls",      "2 - System Calls",
     "3 - Subroutines",      "3 - Library Functions",
     "3p - Perl Subroutines",      "3p - Perl Library",
     "4 - Special Files",      "4 - Device Drivers",
     "5 - File Formats",      "5 - File Formats",
     "6 - Games",      "6 - Games",
     "7 - Macros and Conventions",      "7 - Miscellaneous Information",
     "8 - Maintenance Commands",      "8 - System Manager\'s Manual",
     "9 - Kernel Interface"      "9 - Kernel Developer\'s Manual"
 };  };
 static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);  static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);
   
Line 145  html_putchar(char c)
Line 146  html_putchar(char c)
 }  }
   
 static void  static void
 http_printquery(const struct req *req)  http_printquery(const struct req *req, const char *sep)
 {  {
   
         if (NULL != req->q.query) {          if (NULL != req->q.query) {
Line 153  http_printquery(const struct req *req)
Line 154  http_printquery(const struct req *req)
                 http_print(req->q.query);                  http_print(req->q.query);
         }          }
         if (0 == req->q.equal)          if (0 == req->q.equal)
                 printf("&apropos=1");                  printf("%sapropos=1", sep);
         if (NULL != req->q.sec) {          if (NULL != req->q.sec) {
                 printf("&sec=");                  printf("%ssec=", sep);
                 http_print(req->q.sec);                  http_print(req->q.sec);
         }          }
         if (NULL != req->q.arch) {          if (NULL != req->q.arch) {
                 printf("&arch=");                  printf("%sarch=", sep);
                 http_print(req->q.arch);                  http_print(req->q.arch);
         }          }
         if (NULL != req->q.manpath &&          if (NULL != req->q.manpath &&
             strcmp(req->q.manpath, req->p[0])) {              strcmp(req->q.manpath, req->p[0])) {
                 printf("&manpath=");                  printf("%smanpath=", sep);
                 http_print(req->q.manpath);                  http_print(req->q.manpath);
         }          }
 }  }
   
 static void  static void
 html_printquery(const struct req *req)  
 {  
   
         if (NULL != req->q.query) {  
                 printf("query=");  
                 html_print(req->q.query);  
         }  
         if (0 == req->q.equal)  
                 printf("&amp;apropos=1");  
         if (NULL != req->q.sec) {  
                 printf("&amp;sec=");  
                 html_print(req->q.sec);  
         }  
         if (NULL != req->q.arch) {  
                 printf("&amp;arch=");  
                 html_print(req->q.arch);  
         }  
         if (NULL != req->q.manpath &&  
             strcmp(req->q.manpath, req->p[0])) {  
                 printf("&amp;manpath=");  
                 html_print(req->q.manpath);  
         }  
 }  
   
 static void  
 http_print(const char *p)  http_print(const char *p)
 {  {
   
Line 640  pg_searchres(const struct req *req, struct manpage *r,
Line 616  pg_searchres(const struct req *req, struct manpage *r,
                 printf("Status: 303 See Other\r\n");                  printf("Status: 303 See Other\r\n");
                 printf("Location: http://%s%s/%s/%s?",                  printf("Location: http://%s%s/%s/%s?",
                     HTTP_HOST, scriptname, req->q.manpath, r[0].file);                      HTTP_HOST, scriptname, req->q.manpath, r[0].file);
                 http_printquery(req);                  http_printquery(req, "&");
                 printf("\r\n"                  printf("\r\n"
                      "Content-Type: text/html; charset=utf-8\r\n"                       "Content-Type: text/html; charset=utf-8\r\n"
                      "\r\n");                       "\r\n");
Line 657  pg_searchres(const struct req *req, struct manpage *r,
Line 633  pg_searchres(const struct req *req, struct manpage *r,
                        "<TD CLASS=\"title\">\n"                         "<TD CLASS=\"title\">\n"
                        "<A HREF=\"%s/%s/%s?",                         "<A HREF=\"%s/%s/%s?",
                     scriptname, req->q.manpath, r[i].file);                      scriptname, req->q.manpath, r[i].file);
                 html_printquery(req);                  http_printquery(req, "&amp;");
                 printf("\">");                  printf("\">");
                 html_print(r[i].names);                  html_print(r[i].names);
                 printf("</A>\n"                  printf("</A>\n"
Line 998  pg_search(const struct req *req)
Line 974  pg_search(const struct req *req)
   
         search.arch = req->q.arch;          search.arch = req->q.arch;
         search.sec = req->q.sec;          search.sec = req->q.sec;
         search.deftype = req->q.equal ? TYPE_Nm : (TYPE_Nm | TYPE_Nd);          search.outkey = "Nd";
         search.flags = req->q.equal ? MANSEARCH_MAN : 0;          search.argmode = req->q.equal ? ARG_NAME : ARG_EXPR;
   
         paths.sz = 1;          paths.sz = 1;
         paths.paths = mandoc_malloc(sizeof(char *));          paths.paths = mandoc_malloc(sizeof(char *));
Line 1028  pg_search(const struct req *req)
Line 1004  pg_search(const struct req *req)
                         ep++;                          ep++;
         }          }
   
         if (0 == mansearch(&search, &paths, sz, cp, "Nd", &res, &ressz))          if (0 == mansearch(&search, &paths, sz, cp, &res, &ressz))
                 pg_noresult(req, "You entered an invalid query.");                  pg_noresult(req, "You entered an invalid query.");
         else if (0 == ressz)          else if (0 == ressz)
                 pg_noresult(req, "No results found.");                  pg_noresult(req, "No results found.");
Line 1054  int
Line 1030  int
 main(void)  main(void)
 {  {
         struct req       req;          struct req       req;
           struct itimerval itimer;
         const char      *path;          const char      *path;
         const char      *querystring;          const char      *querystring;
         int              i;          int              i;
   
           /* Poor man's ReDoS mitigation. */
   
           itimer.it_value.tv_sec = 1;
           itimer.it_value.tv_usec = 0;
           itimer.it_interval.tv_sec = 1;
           itimer.it_interval.tv_usec = 0;
           if (setitimer(ITIMER_VIRTUAL, &itimer, NULL) == -1) {
                   fprintf(stderr, "setitimer: %s\n", strerror(errno));
                   pg_error_internal();
                   return(EXIT_FAILURE);
           }
   
         /* Scan our run-time environment. */          /* Scan our run-time environment. */
   

Legend:
Removed from v.1.90  
changed lines
  Added in v.1.96

CVSweb