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

Diff for /mandoc/cgi.c between version 1.145 and 1.149

version 1.145, 2017/01/25 02:14:43 version 1.149, 2017/03/15 10:17:29
Line 21 
Line 21 
 #include <sys/time.h>  #include <sys/time.h>
   
 #include <ctype.h>  #include <ctype.h>
   #if HAVE_ERR
 #include <err.h>  #include <err.h>
   #endif
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
Line 74  static void   pg_error_badrequest(const char *);
Line 76  static void   pg_error_badrequest(const char *);
 static  void             pg_error_internal(void);  static  void             pg_error_internal(void);
 static  void             pg_index(const struct req *);  static  void             pg_index(const struct req *);
 static  void             pg_noresult(const struct req *, const char *);  static  void             pg_noresult(const struct req *, const char *);
   static  void             pg_redirect(const struct req *, const char *);
 static  void             pg_search(const struct req *);  static  void             pg_search(const struct req *);
 static  void             pg_searchres(const struct req *,  static  void             pg_searchres(const struct req *,
                                 struct manpage *, size_t);                                  struct manpage *, size_t);
Line 113  static const char *const sec_names[] = {
Line 116  static const char *const sec_names[] = {
 static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);  static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);
   
 static  const char *const arch_names[] = {  static  const char *const arch_names[] = {
     "amd64",       "alpha",       "armv7",      "amd64",       "alpha",       "armv7",      "arm64",
     "hppa",        "i386",        "landisk",      "hppa",        "i386",        "landisk",
     "loongson",    "luna88k",     "macppc",      "mips64",      "loongson",    "luna88k",     "macppc",      "mips64",
     "octeon",      "sgi",         "socppc",      "sparc64",      "octeon",      "sgi",         "socppc",      "sparc64",
Line 538  pg_error_internal(void)
Line 541  pg_error_internal(void)
 }  }
   
 static void  static void
   pg_redirect(const struct req *req, const char *name)
   {
           printf("Status: 303 See Other\r\n");
           printf("Location: http://%s/", HTTP_HOST);
           if (*scriptname != '\0')
                   printf("%s/", scriptname);
           if (strcmp(req->q.manpath, req->p[0]))
                   printf("%s/", req->q.manpath);
           if (req->q.arch != NULL)
                   printf("%s/", req->q.arch);
           printf("%s", name);
           if (req->q.sec != NULL)
                   printf(".%s", req->q.sec);
           printf("\r\nContent-Type: text/html; charset=utf-8\r\n\r\n");
   }
   
   static void
 pg_searchres(const struct req *req, struct manpage *r, size_t sz)  pg_searchres(const struct req *req, struct manpage *r, size_t sz)
 {  {
         char            *arch, *archend;          char            *arch, *archend;
Line 954  pg_search(const struct req *req)
Line 974  pg_search(const struct req *req)
                 }                  }
         }          }
   
         if (0 == mansearch(&search, &paths, argc, argv, &res, &ressz))          res = NULL;
           ressz = 0;
           if (req->isquery && req->q.equal && argc == 1)
                   pg_redirect(req, argv[0]);
           else if (mansearch(&search, &paths, argc, argv, &res, &ressz) == 0)
                 pg_noresult(req, "You entered an invalid query.");                  pg_noresult(req, "You entered an invalid query.");
         else if (0 == ressz)          else if (ressz == 0)
                 pg_noresult(req, "No results found.");                  pg_noresult(req, "No results found.");
         else          else
                 pg_searchres(req, res, ressz);                  pg_searchres(req, res, ressz);
Line 975  main(void)
Line 999  main(void)
         const char      *path;          const char      *path;
         const char      *querystring;          const char      *querystring;
         int              i;          int              i;
   
   #if HAVE_PLEDGE
           /*
            * The "rpath" pledge could be revoked after mparse_readfd()
            * if the file desciptor to "/footer.html" would be opened
            * up front, but it's probably not worth the complication
            * of the code it would cause: it would require scattering
            * pledge() calls in multiple low-level resp_*() functions.
            */
   
           if (pledge("stdio rpath", NULL) == -1) {
                   warn("pledge");
                   pg_error_internal();
                   return EXIT_FAILURE;
           }
   #endif
   
         /* Poor man's ReDoS mitigation. */          /* Poor man's ReDoS mitigation. */
   

Legend:
Removed from v.1.145  
changed lines
  Added in v.1.149

CVSweb