-rw-r--r-- | html.c | 9 | ||||
-rwxr-xr-x | tests/t0108-patch.sh | 2 |
2 files changed, 7 insertions, 4 deletions
@@ -175,145 +175,146 @@ void html_url_path(const char *txt) void html_url_arg(const char *txt) { const char *t = txt; while(t && *t){ int c = *t; const char *e = url_escape_table[c]; if (e) { write(htmlfd, txt, t - txt); write(htmlfd, e, 3); txt = t+1; } t++; } if (t!=txt) html(txt); } void html_hidden(const char *name, const char *value) { html("<input type='hidden' name='"); html_attr(name); html("' value='"); html_attr(value); html("'/>"); } void html_option(const char *value, const char *text, const char *selected_value) { html("<option value='"); html_attr(value); html("'"); if (selected_value && !strcmp(selected_value, value)) html(" selected='selected'"); html(">"); html_txt(text); html("</option>\n"); } void html_link_open(const char *url, const char *title, const char *class) { html("<a href='"); html_attr(url); if (title) { html("' title='"); html_attr(title); } if (class) { html("' class='"); html_attr(class); } html("'>"); } void html_link_close(void) { html("</a>"); } void html_fileperm(unsigned short mode) { htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); } int html_include(const char *filename) { FILE *f; char buf[4096]; size_t len; if (!(f = fopen(filename, "r"))) { fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", filename, strerror(errno), errno); return -1; } while((len = fread(buf, 1, 4096, f)) > 0) write(htmlfd, buf, len); fclose(f); return 0; } int hextoint(char c) { if (c >= 'a' && c <= 'f') return 10 + c - 'a'; else if (c >= 'A' && c <= 'F') return 10 + c - 'A'; else if (c >= '0' && c <= '9') return c - '0'; else return -1; } char *convert_query_hexchar(char *txt) { - int d1, d2; - if (strlen(txt) < 3) { + int d1, d2, n; + n = strlen(txt); + if (n < 3) { *txt = '\0'; return txt-1; } d1 = hextoint(*(txt+1)); d2 = hextoint(*(txt+2)); if (d1<0 || d2<0) { - strcpy(txt, txt+3); + memmove(txt, txt+3, n-3); return txt-1; } else { *txt = d1 * 16 + d2; - strcpy(txt+1, txt+3); + memmove(txt+1, txt+3, n-2); return txt; } } int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) { char *t, *txt, *value = NULL, c; if (!txt_) return 0; t = txt = strdup(txt_); if (t == NULL) { printf("Out of memory\n"); exit(1); } while((c=*t) != '\0') { if (c=='=') { *t = '\0'; value = t+1; } else if (c=='+') { *t = ' '; } else if (c=='%') { t = convert_query_hexchar(t); } else if (c=='&') { *t = '\0'; (*fn)(txt, value); txt = t+1; value = NULL; } t++; } if (t!=txt) (*fn)(txt, value); return 0; } diff --git a/tests/t0108-patch.sh b/tests/t0108-patch.sh index 33351d6..e608104 100755 --- a/tests/t0108-patch.sh +++ b/tests/t0108-patch.sh @@ -1,37 +1,39 @@ #!/bin/sh . ./setup.sh prepare_tests "Check content on patch page" run_test 'generate foo/patch' ' cgit_query "url=foo/patch" >trash/tmp ' run_test 'find `From:` line' ' grep -e "^From: " trash/tmp ' run_test 'find `Date:` line' ' grep -e "^Date: " trash/tmp ' run_test 'find `Subject:` line' ' grep -e "^Subject: commit 5" trash/tmp ' run_test 'find `cgit` signature' ' tail -1 trash/tmp | grep -e "^cgit" ' run_test 'find initial commit' ' root=$(git --git-dir=$PWD/trash/repos/foo/.git rev-list HEAD | tail -1) ' run_test 'generate patch for initial commit' ' cgit_query "url=foo/patch&id=$root" >trash/tmp ' run_test 'find `cgit` signature' ' tail -1 trash/tmp | grep -e "^cgit" ' + +tests_done |