Index: filed.c ================================================================== --- filed.c +++ filed.c @@ -44,11 +44,11 @@ }; /* File information */ struct filed_fileinfo { pthread_mutex_t mutex; - char *path; + char path[FILED_PATH_BUFFER_SIZE]; int fd; off_t len; char *lastmod; char lastmod_b[64]; const char *type; @@ -56,15 +56,15 @@ /* Request variables */ struct filed_http_request { /** Buffers **/ struct filed_fileinfo fileinfo; - char path_b[FILED_PATH_BUFFER_SIZE]; char tmpbuf[1010]; /** HTTP Request information **/ - char *path; /*** Path being requested ***/ + /*** Path being requested ***/ + char path[FILED_PATH_BUFFER_SIZE]; struct { struct { int present; off_t offset; /*** Range start ***/ @@ -137,11 +137,11 @@ mutex_init_ret = pthread_mutex_init(&filed_fileinfo_fdcache[idx].mutex, NULL); if (mutex_init_ret != 0) { return(1); } - filed_fileinfo_fdcache[idx].path = strdup(""); + filed_fileinfo_fdcache[idx].path[0] = '\0'; filed_fileinfo_fdcache[idx].fd = -1; filed_fileinfo_fdcache[idx].lastmod = ""; filed_fileinfo_fdcache[idx].type = ""; } @@ -513,21 +513,20 @@ pthread_mutex_unlock(&cache->mutex); return(NULL); } - free(cache->path); if (cache->fd >= 0) { close(cache->fd); } len = lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); cache->fd = fd; cache->len = len; - cache->path = strdup(path); + strcpy(cache->path, path); cache->type = filed_determine_mimetype(open_path); /* XXX:TODO: Determine */ cache->lastmod = filed_format_time(cache->lastmod_b, sizeof(cache->lastmod_b), time(NULL) - 30); } else { @@ -557,12 +556,12 @@ } /* Process an HTTP request and return the path requested */ static struct filed_http_request *filed_get_http_request(FILE *fp, struct filed_http_request *buffer_st) { char *method, *path; - char *buffer, *tmpbuffer, *workbuffer, *workbuffer_next; - size_t buffer_len, tmpbuffer_len; + char *buffer, *workbuffer, *workbuffer_next; + size_t buffer_len; off_t range_start, range_end, range_length; int range_request; int fd; int i; @@ -571,15 +570,12 @@ range_start = 0; range_end = 0; range_request = 0; range_length = -1; - buffer = buffer_st->path_b; - buffer_len = sizeof(buffer_st->path_b); - - tmpbuffer = buffer_st->tmpbuf; - tmpbuffer_len = sizeof(buffer_st->tmpbuf); + buffer = buffer_st->tmpbuf; + buffer_len = sizeof(buffer_st->tmpbuf); fgets(buffer, buffer_len, fp); method = buffer; @@ -597,15 +593,24 @@ if (buffer != NULL) { *buffer = '\0'; buffer++; } + /* We only handle the "GET" method */ + if (strcasecmp(method, "get") != 0) { + return(NULL); + } + + /* Note path */ + strcpy(buffer_st->path, path); + for (i = 0; i < 100; i++) { - fgets(tmpbuffer, tmpbuffer_len, fp); + buffer = buffer_st->tmpbuf; + fgets(buffer, buffer_len, fp); - if (strncasecmp(tmpbuffer, "Range: ", 7) == 0) { - workbuffer = tmpbuffer + 7; + if (strncasecmp(buffer, "Range: ", 7) == 0) { + workbuffer = buffer + 7; if (strncasecmp(workbuffer, "bytes=", 6) == 0) { workbuffer += 6; range_request = 1; @@ -622,20 +627,15 @@ } } } } - if (memcmp(tmpbuffer, "\r\n", 2) == 0) { + if (memcmp(buffer, "\r\n", 2) == 0) { break; } } - /* We only handle the "GET" method */ - if (strcasecmp(method, "get") != 0) { - return(NULL); - } - /* Determine range */ if (range_end != 0) { if (range_end <= range_start) { return(NULL); } @@ -648,11 +648,10 @@ (unsigned long long) range_start ); } /* Fill up structure to return */ - buffer_st->path = path; buffer_st->headers.range.present = range_request; buffer_st->headers.range.offset = range_start; buffer_st->headers.range.length = range_length; return(buffer_st); @@ -697,11 +696,11 @@ return; } request = filed_get_http_request(fp, request); - if (request == NULL || request->path == NULL) { + if (request == NULL) { filed_error_page(fp, date_current, 500); log->buffer[0] = '\0'; log->http_code = 500; log->reason = "format";