Ignore:
Timestamp:
2010-04-15T21:53:29+02:00 (6 years ago)
Author:
jow
Message:

[backfire] merge r20883

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/package/uhttpd/src/uhttpd-utils.c

    r20513 r20884  
    117117        FD_SET(cl->socket, &writer); 
    118118 
    119         timeout.tv_sec = 0; 
    120         timeout.tv_usec = 500000; 
     119        timeout.tv_sec = cl->server->conf->network_timeout; 
     120        timeout.tv_usec = 0; 
    121121 
    122122        if( select(cl->socket + 1, NULL, &writer, NULL, &timeout) > 0 ) 
     
    377377} 
    378378 
     379static char * canonpath(const char *path, char *path_resolved) 
     380{ 
     381        char path_copy[PATH_MAX]; 
     382        char *path_cpy = path_copy; 
     383        char *path_res = path_resolved; 
     384 
     385        struct stat s; 
     386 
     387 
     388        /* relative -> absolute */ 
     389        if( *path != '/' ) 
     390        { 
     391                getcwd(path_copy, PATH_MAX); 
     392                strncat(path_copy, "/", PATH_MAX - strlen(path_copy)); 
     393                strncat(path_copy, path, PATH_MAX - strlen(path_copy)); 
     394        } 
     395        else 
     396        { 
     397                strncpy(path_copy, path, PATH_MAX); 
     398        } 
     399 
     400        /* normalize */ 
     401        while( (*path_cpy != '\0') && (path_cpy < (path_copy + PATH_MAX - 2)) ) 
     402        { 
     403                if( *path_cpy == '/' ) 
     404                { 
     405                        /* skip repeating / */ 
     406                        if( path_cpy[1] == '/' ) 
     407                        { 
     408                                path_cpy++; 
     409                                continue; 
     410                        } 
     411 
     412                        /* /./ or /../ */ 
     413                        else if( path_cpy[1] == '.' ) 
     414                        { 
     415                                /* skip /./ */ 
     416                                if( (path_cpy[2] == '/') || (path_cpy[2] == '\0') ) 
     417                                { 
     418                                        path_cpy += 2; 
     419                                        continue; 
     420                                } 
     421 
     422                                /* collapse /x/../ */ 
     423                                else if( path_cpy[2] == '.' ) 
     424                                { 
     425                                        while( (path_res > path_resolved) && (*--path_res != '/') ) 
     426                                                ; 
     427 
     428                                        path_cpy += 3; 
     429                                        continue; 
     430                                } 
     431                        } 
     432                } 
     433 
     434                *path_res++ = *path_cpy++; 
     435        } 
     436 
     437        /* remove trailing slash if not root / */ 
     438        if( (path_res > (path_resolved+1)) && (path_res[-1] == '/') ) 
     439                path_res--; 
     440        else if( path_res == path_resolved ) 
     441                *path_res++ = '/'; 
     442 
     443        *path_res = '\0'; 
     444 
     445        /* test access */ 
     446        if( !stat(path_resolved, &s) && (s.st_mode & S_IROTH) ) 
     447                return path_resolved; 
     448 
     449        return NULL; 
     450} 
    379451 
    380452struct path_info * uh_path_lookup(struct client *cl, const char *url) 
     
    388460        char *pathptr = NULL; 
    389461 
     462        int no_sym = cl->server->conf->no_symlinks; 
    390463        int i = 0; 
    391464        struct stat s; 
     
    433506                        memcpy(path_info, buffer, min(i + 1, sizeof(path_info) - 1)); 
    434507 
    435                         if( realpath(path_info, path_phys) ) 
    436                         { 
     508                        if( no_sym ? realpath(path_info, path_phys) 
     509                                   : canonpath(path_info, path_phys) 
     510                        ) { 
    437511                                memset(path_info, 0, sizeof(path_info)); 
    438512                                memcpy(path_info, &buffer[i], 
Note: See TracChangeset for help on using the changeset viewer.