Changeset 70 in Main for trunk


Ignore:
Timestamp:
Sep 19, 2024, 6:23:45 PM (2 months ago)
Author:
Nishi
Message:

patch for windows xp

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Common/cm_string.h

    r21 r70  
    77
    88int cm_hex(const char* str, int len);
     9bool cm_nocase_endswith(const char* str, const char* end);
     10bool cm_endswith(const char* str, const char* end);
    911char* cm_html_escape(const char* str);
    1012char* cm_url_escape(const char* str);
  • trunk/Common/string.c

    r21 r70  
    88
    99char* cm_strcat(const char* a, const char* b) {
     10        if(a == NULL) a = "";
     11        if(b == NULL) b = "";
    1012        char* str = malloc(strlen(a) + strlen(b) + 1);
    1113        memcpy(str, a, strlen(a));
     
    2325
    2426char* cm_strdup(const char* str) { return cm_strcat(str, ""); }
     27
     28bool cm_endswith(const char* str, const char* end) {
     29        if(strlen(str) < strlen(end)) return false;
     30        int i;
     31        for(i = strlen(str) - strlen(end); i < strlen(str); i++) {
     32                if(str[i] != end[i - strlen(str) + strlen(end)]) return false;
     33        }
     34        return true;
     35}
     36
     37bool cm_nocase_endswith(const char* str, const char* end) {
     38        if(strlen(str) < strlen(end)) return false;
     39        int i;
     40        for(i = strlen(str) - strlen(end); i < strlen(str); i++) {
     41                if(tolower(str[i]) != tolower(end[i - strlen(str) + strlen(end)])) return false;
     42        }
     43        return true;
     44}
    2545
    2646char* cm_trimstart(const char* str) {
  • trunk/Server/http.c

    r69 r70  
    8383#endif
    8484                int len = tw_read(ssl, sock, buffer, 512);
    85                 if(len <= 0){
     85                if(len <= 0) {
    8686                        bad = true;
    8787                        break;
     
    285285                        if(req->path[i + 1] == 0) continue;
    286286                        cbuf[0] = cm_hex(req->path + i + 1, 2);
    287                         char* tmp = result;
    288                         result = cm_strcat(tmp, cbuf);
    289                         free(tmp);
     287                        if(cbuf[0] != '\\') {
     288                                char* tmp = result;
     289                                result = cm_strcat(tmp, cbuf);
     290                                free(tmp);
     291                        }
    290292                        i += 2;
    291                 } else {
     293                } else if(req->path[i] != '\\') {
    292294                        cbuf[0] = req->path[i];
    293295                        char* tmp = result;
     
    325327                                }
    326328                        } else if(strcmp(pth, ".") == 0) {
    327                         } else if(oldc != '\\') {
     329                        } else {
    328330                                char* tmp = p;
    329331                                p = cm_strcat3(tmp, pth, cbuf);
  • trunk/Server/main.c

    r62 r70  
    3737SERVICE_STATUS_HANDLE status_handle;
    3838
    39 void WINAPI servhandler(DWORD control){
    40         switch(control){
    41                 case SERVICE_CONTROL_STOP:
    42                 case SERVICE_CONTROL_SHUTDOWN:
    43                         status.dwCurrentState = SERVICE_STOP_PENDING;
    44                         break;
     39void WINAPI servhandler(DWORD control) {
     40        switch(control) {
     41        case SERVICE_CONTROL_STOP:
     42        case SERVICE_CONTROL_SHUTDOWN:
     43                status.dwCurrentState = SERVICE_STOP_PENDING;
     44                break;
    4545        }
    4646        SetServiceStatus(status_handle, &status);
    4747}
    4848
    49 void WINAPI servmain(DWORD argc, LPSTR* argv){
     49void WINAPI servmain(DWORD argc, LPSTR* argv) {
    5050        logfile = fopen(PREFIX "/logs/tewi.log", "a");
    5151        if(logfile == NULL) logfile = stderr;
     
    6161        if(SetServiceStatus(status_handle, &status) == 0) return;
    6262        int st = startup(argc, argv);
    63         if(st != -1){
     63        if(st != -1) {
    6464                status.dwWin32ExitCode = NO_ERROR;
    6565                status.dwServiceSpecificExitCode = st;
     
    8888}
    8989
    90 int startup(int argc, char** argv){
     90int startup(int argc, char** argv) {
    9191        int i;
    9292        const char* confpath = PREFIX "/etc/tewi.conf";
    93         if(argv != NULL){
     93        if(argv != NULL) {
    9494                for(i = 1; i < argc; i++) {
    9595                        if(argv[i][0] == '-') {
     
    9797                                        if(!cm_do_log) {
    9898                                                cm_do_log = true;
    99         #ifndef NO_SSL
     99#ifndef NO_SSL
    100100                                                cm_log("", "This is Tewi HTTPd, version %s, using %s", tw_get_version(), OPENSSL_VERSION_TEXT);
    101         #else
     101#else
    102102                                                cm_log("", "This is Tewi HTTPd, version %s", tw_get_version());
    103         #endif
     103#endif
    104104                                        } else {
    105105                                                cm_do_log = true;
  • trunk/Server/server.c

    r68 r70  
    5151SOCKADDR addresses[MAX_PORTS];
    5252int sockets[MAX_PORTS];
     53
     54#ifdef __MINGW32__
     55const char* reserved_names[] = {"CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"};
     56#endif
    5357
    5458/* https://qiita.com/gyu-don/items/5a640c6d2252a860c8cd */
     
    429433                int i;
    430434                time_t cmtime = 0;
    431                 if(req.headers != NULL){
     435                if(req.headers != NULL) {
    432436                        for(i = 0; req.headers[i] != NULL; i += 2) {
    433437                                if(cm_strcaseequ(req.headers[i], "Host")) {
     
    480484                        char* path = cm_strcat(vhost_entry->root == NULL ? "" : vhost_entry->root, req.path);
    481485                        cm_log("Server", "Filesystem path is %s", path);
     486                        bool rej = false;
     487#ifdef __MINGW32__
     488                        for(i = 0; i < sizeof(reserved_names) / sizeof(reserved_names[0]); i++) {
     489                                char* n = cm_strcat("/", reserved_names[i]);
     490                                if(cm_nocase_endswith(path, n)) {
     491                                        tw_http_error(s, sock, 403, name, port);
     492                                        free(n);
     493                                        rej = true;
     494                                        cm_log("Server", "XP Patch ; rejecting access to device");
     495                                        break;
     496                                }
     497                                free(n);
     498                                char* y = cm_strcat3("/", reserved_names[i], ":");
     499                                if(cm_nocase_endswith(path, y)) {
     500                                        tw_http_error(s, sock, 403, name, port);
     501                                        free(y);
     502                                        rej = true;
     503                                        cm_log("Server", "XP Patch ; rejecting access to device");
     504                                        break;
     505                                }
     506                                free(y);
     507                        }
     508#endif
    482509                        struct stat st;
    483                         if(stat(path, &st) == 0) {
     510                        if(!rej && stat(path, &st) == 0) {
    484511                                if(!tw_permission_allowed(path, addr, req, vhost_entry)) {
    485512                                        tw_http_error(s, sock, 403, name, port);
     
    648675                                                                        addstring(&str, "<pre><code>%h</code></pre>\n", rmbuf);
    649676                                                                        fclose(fr);
     677                                                                        free(rmbuf);
    650678                                                                }
    651679                                                                free(fpth);
     
    682710                free(vhost);
    683711                free(host);
    684                 tw_free_request(&req);
    685712        } else if(ret == -1) {
    686713        } else {
    687714                tw_http_error(s, sock, 400, name, port);
    688715        }
     716        tw_free_request(&req);
    689717cleanup:
    690718#ifndef NO_SSL
     
    718746#ifdef __MINGW32__
    719747        struct thread_entry threads[2048];
    720         for(i = 0; i < sizeof(threads) / sizeof(threads[0]); i++){
     748        for(i = 0; i < sizeof(threads) / sizeof(threads[0]); i++) {
    721749                threads[i].used = false;
    722750        }
     
    732760                if(ret == -1) {
    733761                        break;
    734                 }else if(ret == 0){
    735 #ifdef __MINGW32__
    736                         for(i = 0; i < sizeof(threads) / sizeof(threads[0]); i++){
    737                                 if(threads[i].used){
     762                } else if(ret == 0) {
     763#ifdef __MINGW32__
     764                        for(i = 0; i < sizeof(threads) / sizeof(threads[0]); i++) {
     765                                if(threads[i].used) {
    738766                                        DWORD ex;
    739767                                        GetExitCodeThread(threads[i].handle, &ex);
    740                                         if(ex != STILL_ACTIVE){
     768                                        if(ex != STILL_ACTIVE) {
    741769                                                CloseHandle(threads[i].handle);
    742770                                                threads[i].used = false;
     
    746774#endif
    747775#ifdef SERVICE
    748                         if(status.dwCurrentState == SERVICE_STOP_PENDING){
     776                        if(status.dwCurrentState == SERVICE_STOP_PENDING) {
    749777                                break;
    750778                        }
     
    766794                                        e->addr = claddr;
    767795                                        int j;
    768                                         for(j = 0; j < sizeof(threads) / sizeof(threads[0]); j++){
    769                                                 if(threads[j].used){
     796                                        for(j = 0; j < sizeof(threads) / sizeof(threads[0]); j++) {
     797                                                if(threads[j].used) {
    770798                                                        DWORD ex;
    771799                                                        GetExitCodeThread(threads[j].handle, &ex);
    772                                                         if(ex != STILL_ACTIVE){
     800                                                        if(ex != STILL_ACTIVE) {
    773801                                                                CloseHandle(threads[j].handle);
    774802                                                                threads[j].used = false;
     
    776804                                                }
    777805                                        }
    778                                         for(j = 0; j < sizeof(threads) / sizeof(threads[0]); j++){
    779                                                 if(!threads[j].used){
     806                                        for(j = 0; j < sizeof(threads) / sizeof(threads[0]); j++) {
     807                                                if(!threads[j].used) {
    780808                                                        threads[j].handle = (HANDLE)_beginthreadex(NULL, 0, tw_server_pass, e, 0, NULL);
    781809                                                        threads[j].used = true;
  • trunk/Server/tw_version.h

    r49 r70  
    44#define __TW_VERSION_H__
    55
    6 #define TW_VERSION "1.00\0"
     6#define TW_VERSION "1.01\0"
    77
    88const char* tw_get_version(void);
Note: See TracChangeset for help on using the changeset viewer.