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

Diff for /mandoc/cgi.c between version 1.77 and 1.80

version 1.77, 2014/07/19 13:15:11 version 1.80, 2014/07/22 18:14:13
Line 71  static void   pg_noresult(const struct req *, const ch
Line 71  static void   pg_noresult(const struct req *, const ch
 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);
 static  void             pg_show(const struct req *, const char *);  static  void             pg_show(struct req *, const char *);
 static  void             resp_begin_html(int, const char *);  static  void             resp_begin_html(int, const char *);
 static  void             resp_begin_http(int, const char *);  static  void             resp_begin_http(int, const char *);
 static  void             resp_end_html(void);  static  void             resp_end_html(void);
Line 467  resp_searchform(const struct req *req)
Line 467  resp_searchform(const struct req *req)
 }  }
   
 static int  static int
   validate_urifrag(const char *frag)
   {
   
           while ('\0' != *frag) {
                   if ( ! (isalnum((unsigned char)*frag) ||
                       '-' == *frag || '.' == *frag ||
                       '/' == *frag || '_' == *frag))
                           return(0);
                   frag++;
           }
           return(1);
   }
   
   static int
 validate_manpath(const struct req *req, const char* manpath)  validate_manpath(const struct req *req, const char* manpath)
 {  {
         size_t   i;          size_t   i;
Line 564  pg_searchres(const struct req *req, struct manpage *r,
Line 578  pg_searchres(const struct req *req, struct manpage *r,
                  * without any delay.                   * without any delay.
                  */                   */
                 printf("Status: 303 See Other\r\n");                  printf("Status: 303 See Other\r\n");
                 printf("Location: %s/%s/%s?",                  printf("Location: http://%s%s/%s/%s?",
                     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"
Line 785  format(const struct req *req, const char *file)
Line 799  format(const struct req *req, const char *file)
                 return;                  return;
         }          }
   
         snprintf(opts, sizeof(opts),          snprintf(opts, sizeof(opts), "fragment,man=%s?"
             "fragment,man=%s?query=%%N&sec=%%S",              "manpath=%s&query=%%N&sec=%%S&arch=%s",
             scriptname);              scriptname, req->q.manpath,
               req->q.arch ? req->q.arch : "");
   
         mparse_result(mp, &mdoc, &man, NULL);          mparse_result(mp, &mdoc, &man, NULL);
         if (NULL == man && NULL == mdoc) {          if (NULL == man && NULL == mdoc) {
Line 823  resp_show(const struct req *req, const char *file)
Line 838  resp_show(const struct req *req, const char *file)
 }  }
   
 static void  static void
 pg_show(const struct req *req, const char *path)  pg_show(struct req *req, const char *path)
 {  {
         char            *sub;          char            *sub;
   
Line 859  pg_show(const struct req *req, const char *path)
Line 874  pg_show(const struct req *req, const char *path)
                 return;                  return;
         }          }
   
           if (strcmp(path, "mandoc"))
                   req->q.manpath = path;
   
         resp_begin_html(200, NULL);          resp_begin_html(200, NULL);
         resp_searchform(req);          resp_searchform(req);
         resp_show(req, sub);          resp_show(req, sub);
Line 956  main(void)
Line 974  main(void)
         if (NULL == (scriptname = getenv("SCRIPT_NAME")))          if (NULL == (scriptname = getenv("SCRIPT_NAME")))
                 scriptname = "";                  scriptname = "";
   
           if ( ! validate_urifrag(scriptname)) {
                   fprintf(stderr, "unsafe SCRIPT_NAME \"%s\"\n",
                       scriptname);
                   pg_error_internal();
                   return(EXIT_FAILURE);
           }
   
         /*          /*
          * First we change directory into the MAN_DIR so that           * First we change directory into the MAN_DIR so that
          * subsequent scanning for manpath directories is rooted           * subsequent scanning for manpath directories is rooted
Line 983  main(void)
Line 1008  main(void)
                 return(EXIT_FAILURE);                  return(EXIT_FAILURE);
         }          }
   
           if ( ! (NULL == req.q.arch || validate_urifrag(req.q.arch))) {
                   pg_error_badrequest(
                       "You specified an invalid architecture.");
                   return(EXIT_FAILURE);
           }
   
         /* Dispatch to the three different pages. */          /* Dispatch to the three different pages. */
   
         path = getenv("PATH_INFO");          path = getenv("PATH_INFO");
Line 1034  pathgen(struct req *req)
Line 1065  pathgen(struct req *req)
                         dpsz--;                          dpsz--;
                 req->p = mandoc_realloc(req->p,                  req->p = mandoc_realloc(req->p,
                     (req->psz + 1) * sizeof(char *));                      (req->psz + 1) * sizeof(char *));
                 req->p[req->psz++] = mandoc_strndup(dp, dpsz);                  dp = mandoc_strndup(dp, dpsz);
                   if ( ! validate_urifrag(dp)) {
                           fprintf(stderr, "%s/manpath.conf contains "
                               "unsafe path \"%s\"\n", MAN_DIR, dp);
                           pg_error_internal();
                           exit(EXIT_FAILURE);
                   }
                   if (NULL != strchr(dp, '/')) {
                           fprintf(stderr, "%s/manpath.conf contains "
                               "path with slash \"%s\"\n", MAN_DIR, dp);
                           pg_error_internal();
                           exit(EXIT_FAILURE);
                   }
                   req->p[req->psz++] = dp;
         }          }
   
         if ( req->p == NULL ) {          if ( req->p == NULL ) {

Legend:
Removed from v.1.77  
changed lines
  Added in v.1.80

CVSweb