Ignore:
Timestamp:
05/11/11 22:23:15 (9 years ago)
Author:
Admin
Message:

WebIf: Leak fix for external css.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/oscam-http-helpers.c

    r5219 r5225  
    533533 */
    534534void send_file(FILE *f, char *filename, time_t modifiedheader, uint32_t etagheader){
    535     int32_t fileno = 0;
     535    int8_t fileno = 0, allocated = 0;
     536    int32_t size = 0;
    536537    char* mimetype = "", *result = "";
    537538    time_t moddate;
     
    548549
    549550    if(strlen(filename) > 0 && file_exists(filename) == 1){
    550         FILE *fp;
    551         char buffer[1024], *pos;
    552         int32_t read;
    553551        struct stat st;     
    554552        stat(filename, &st);
    555         moddate = st.st_mtime;
    556         if((fp = fopen(filename, "r"))==NULL) return;
    557         if(!cs_malloc(&result, st.st_size + 1, -1)){
    558             send_error500(f);
     553        moddate = st.st_mtime;     
     554        if(st.st_size > 0){
     555            FILE *fp;
     556            int32_t read;
     557            size = st.st_size;
     558            if((fp = fopen(filename, "r"))==NULL) return;
     559            if(!cs_malloc(&result, st.st_size + 1, -1)){
     560                send_error500(f);
     561                fclose(fp);
     562                return;
     563            }
     564            allocated = 1;
     565            if((read = fread(result, 1, st.st_size, fp)) != size){
     566                result[0] = '\0';
     567                size = 0;
     568            } else result[read] = '\0';
    559569            fclose(fp);
    560             return;
    561         }
    562         result[0] = '\0';
    563         pos = result;
    564         while((read = fread(buffer,sizeof(char), 1023, fp)) > 0) {
    565             buffer[read] = '\0';
    566             if(pos + read > result + st.st_size) break;     //nasty, file has grown while reading   
    567             memcpy(pos, buffer, read);
    568             pos += read;   
    569         }       
    570         fclose(fp);
     570        }
    571571    } else {
    572572        moddate = first_client->login;
     
    576576            result = JSCRIPT;
    577577        }
    578     }
    579     if((etagheader == 0 && moddate < modifiedheader) || (uint32_t)crc32(0L, (uchar *)result, strlen(result)) == etagheader){
     578        size = strlen(result);
     579    }
     580    if((etagheader == 0 && moddate < modifiedheader) || (uint32_t)crc32(0L, (uchar *)result, size) == etagheader){
    580581        send_header304(f);
    581582    } else {
    582         send_headers(f, 200, "OK", NULL, mimetype, 1, strlen(result), result, 0);
     583        send_headers(f, 200, "OK", NULL, mimetype, 1, size, result, 0);
    583584        webif_write(result, f);
    584585    }
     586    if(allocated) free(result);
    585587}
    586588
Note: See TracChangeset for help on using the changeset viewer.