jani Sat May 23 18:46:10 2009 UTC
Modified files:
/php-src/main rfc1867.c
Log:
ws
http://cvs.php.net/viewvc.cgi/php-src/main/rfc1867.c?r1=1.212&r2=1.213&diff_format=u
Index: php-src/main/rfc1867.c
diff -u php-src/main/rfc1867.c:1.212 php-src/main/rfc1867.c:1.213
--- php-src/main/rfc1867.c:1.212 Sat May 23 18:42:54 2009
+++ php-src/main/rfc1867.c Sat May 23 18:46:10 2009
@@ -17,13 +17,13 @@
+----------------------------------------------------------------------+
*/
-/* $Id: rfc1867.c,v 1.212 2009/05/23 18:42:54 jani Exp $ */
+/* $Id: rfc1867.c,v 1.213 2009/05/23 18:46:10 jani Exp $ */
/*
* This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/).
*
- */
+ */
#include <stdio.h>
#include "php.h"
@@ -76,14 +76,12 @@
REGISTER_MAIN_LONG_CONSTANT("UPLOAD_ERR_EXTENSION", UPLOAD_ERROR_X,
CONST_CS | CONST_PERSISTENT);
}
-
static int unlink_filename(char **filename TSRMLS_DC)
{
VCWD_UNLINK(*filename);
return 0;
}
-
void destroy_uploaded_files_hash(TSRMLS_D)
{
zend_hash_apply(SG(rfc1867_uploaded_files), (apply_func_t)
unlink_filename TSRMLS_CC);
@@ -113,13 +111,11 @@
} multipart_buffer;
-
typedef struct {
char *key;
char *value;
} mime_header_entry;
-
/*
fill up the buffer with client data.
returns number of bytes added to buffer.
@@ -166,7 +162,6 @@
return total_read;
}
-
/* eof if we are out of bytes, or if we hit the final boundary */
static int multipart_buffer_eof(multipart_buffer *self TSRMLS_DC)
{
@@ -177,7 +172,6 @@
}
}
-
/* create new multipart_buffer structure */
static multipart_buffer *multipart_buffer_new(char *boundary, int boundary_len)
{
@@ -190,7 +184,7 @@
self->bufsize = minsize;
spprintf(&self->boundary, 0, "--%s", boundary);
-
+
self->boundary_next_len = spprintf(&self->boundary_next, 0, "\n--%s",
boundary);
self->buf_begin = self->buffer;
@@ -199,7 +193,6 @@
return self;
}
-
/*
gets the next CRLF terminated line from the input buffer.
if it doesn't find a CRLF, and the buffer isn't completely full, returns
@@ -229,7 +222,7 @@
/* bump the pointer */
self->buf_begin = ptr + 1;
self->bytes_in_buffer -= (self->buf_begin - line);
-
+
} else { /* no LF found */
/* buffer isn't completely full, fail */
@@ -245,7 +238,6 @@
return line;
}
-
/* returns the next CRLF terminated line from the client */
static char *get_line(multipart_buffer *self TSRMLS_DC)
{
@@ -259,7 +251,6 @@
return ptr;
}
-
/* Free header entry */
static void php_free_hdr_entry(mime_header_entry *h)
{
@@ -271,7 +262,6 @@
}
}
-
/* finds a boundary */
static int find_boundary(multipart_buffer *self, char *boundary TSRMLS_DC)
{
@@ -290,14 +280,13 @@
return 0;
}
-
/* parse headers */
static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header
TSRMLS_DC)
{
char *line;
mime_header_entry prev_entry, entry;
int prev_len, cur_len;
-
+
/* didn't find boundary, abort */
if (!find_boundary(self, self->boundary TSRMLS_CC)) {
return 0;
@@ -308,10 +297,9 @@
while( (line = get_line(self TSRMLS_CC)) && strlen(line) > 0 )
{
/* add header to table */
-
char *key = line;
char *value = NULL;
-
+
/* space in the beginning means same header */
if (!isspace(line[0])) {
value = strchr(line, ':');
@@ -335,7 +323,7 @@
entry.value[cur_len + prev_len] = '\0';
entry.key = estrdup(prev_entry.key);
-
+
zend_llist_remove_tail(header);
} else {
continue;
@@ -348,7 +336,6 @@
return 1;
}
-
static char *php_mime_get_hdr_value(zend_llist header, char *key)
{
mime_header_entry *entry;
@@ -356,7 +343,7 @@
if (key == NULL) {
return NULL;
}
-
+
entry = zend_llist_get_first(&header);
while (entry) {
if (!strcasecmp(entry->key, key)) {
@@ -364,19 +351,17 @@
}
entry = zend_llist_get_next(&header);
}
-
+
return NULL;
}
-
-
static char *php_ap_getword(char **line, char stop)
{
char *pos = *line, quote;
char *res;
while (*pos && *pos != stop) {
-
+
if ((quote = *pos) == '"' || quote == '\'') {
++pos;
while (*pos && *pos != quote) {
@@ -390,7 +375,7 @@
++pos;
}
} else ++pos;
-
+
}
if (*pos == '\0') {
res = estrdup(*line);
@@ -408,8 +393,6 @@
return res;
}
-
-
static char *substring_conf(char *start, int len, char quote TSRMLS_DC)
{
char *result = emalloc(len + 2);
@@ -428,7 +411,6 @@
return result;
}
-
static char *php_ap_getword_conf(char **line TSRMLS_DC)
{
char *str = *line, *strend, *res, quote;
@@ -483,7 +465,6 @@
return res;
}
-
/*
search for a string in a fixed-length byte string.
if partial is true, partial matches are allowed at the end of the buffer.
@@ -512,7 +493,6 @@
return ptr;
}
-
/* read until a boundary condition */
static int multipart_buffer_read(multipart_buffer *self, char *buf, int bytes,
int *end TSRMLS_DC)
{
@@ -556,7 +536,6 @@
return len;
}
-
/*
XXX: this is horrible memory-usage-wise, but we only expect
to do this on small pieces of form data.
@@ -572,7 +551,9 @@
total_bytes += read_bytes;
}
- if (out) out[total_bytes] = '\0';
+ if (out) {
+ out[total_bytes] = '\0';
+ }
*len = total_bytes;
return out;
@@ -580,7 +561,7 @@
static void register_raw_var_ex(char *var, zval *value, HashTable *array)
{
- zend_hash_update(array, var, strlen(var)+1, &value, sizeof(zval *),
NULL);
+ zend_hash_update(array, var, strlen(var) + 1, &value, sizeof(zval *),
NULL);
}
static void register_raw_var(char *var, char *str, int str_len, HashTable
*array)
@@ -590,9 +571,7 @@
/* Prepare value */
MAKE_STD_ZVAL(new_entry);
- Z_STRLEN_P(new_entry) = str_len;
- Z_STRVAL_P(new_entry) = estrndup(str, Z_STRLEN_P(new_entry));
- Z_TYPE_P(new_entry) = IS_STRING;
+ ZVAL_STRINGL(new_entry, str, str_len, 1);
register_raw_var_ex(var, new_entry, array);
}
@@ -634,7 +613,7 @@
if (boundary[0] == '"') {
boundary++;
boundary_end = strchr(boundary, '"');
- if (!boundary_end) {
+ if (!boundary_end) {
sapi_module.sapi_error(E_WARNING, "Invalid boundary in
multipart/form-data POST data");
return;
}
@@ -676,12 +655,11 @@
}
}
-
while (!multipart_buffer_eof(mbuff TSRMLS_CC))
{
char buff[FILLUNIT];
- char *cd=NULL,*param=NULL,*filename=NULL, *tmp=NULL;
- size_t blen=0, wlen=0;
+ char *cd = NULL, *param = NULL, *filename = NULL, *tmp = NULL;
+ size_t blen = 0, wlen = 0;
off_t offset;
zend_llist_clean(&header);
@@ -691,16 +669,16 @@
}
if ((cd = php_mime_get_hdr_value(header,
"Content-Disposition"))) {
- char *pair=NULL;
- int end=0;
-
+ char *pair = NULL;
+ int end = 0;
+
while (isspace(*cd)) {
++cd;
}
while (*cd && (pair = php_ap_getword(&cd, ';')))
{
- char *key=NULL, *word = pair;
+ char *key = NULL, *word = pair;
while (isspace(*cd)) {
++cd;
@@ -729,7 +707,7 @@
/* Normal form variable, safe to read all data into
memory */
if (!filename && param) {
- unsigned int value_len;
+ unsigned int value_len;
char *value = multipart_buffer_read_body(mbuff,
&value_len TSRMLS_CC);
if (!value) {
@@ -797,7 +775,7 @@
skip_upload = 1;
break;
}
- tmp++;
+ tmp++;
}
}
@@ -811,7 +789,7 @@
cancel_upload = UPLOAD_ERROR_E;
}
}
-
+
if (!skip_upload && php_rfc1867_callback != NULL) {
multipart_event_file_start event_file_start;
@@ -833,14 +811,13 @@
}
}
-
if (skip_upload) {
efree(param);
efree(filename);
continue;
- }
+ }
- if(strlen(filename) == 0) {
+ if (strlen(filename) == 0) {
#if DEBUG_FILE_UPLOAD
sapi_module.sapi_error(E_NOTICE, "No file
uploaded");
#endif
@@ -864,8 +841,7 @@
continue;
}
}
-
-
+
if (PG(upload_max_filesize) > 0 &&
(total_bytes+blen) > PG(upload_max_filesize)) {
#if DEBUG_FILE_UPLOAD
sapi_module.sapi_error(E_NOTICE,
"upload_max_filesize of %ld bytes exceeded - file [%s=%s] not saved",
PG(upload_max_filesize), param, filename);
@@ -878,7 +854,7 @@
cancel_upload = UPLOAD_ERROR_B;
} else if (blen > 0) {
wlen = write(fd, buff, blen);
-
+
if (wlen == -1) {
/* write failed */
#if DEBUG_FILE_UPLOAD
@@ -893,9 +869,8 @@
} else {
total_bytes += wlen;
}
-
offset += wlen;
- }
+ }
}
if (fd!=-1) { /* may not be initialized if file could
not be created */
close(fd);
@@ -907,12 +882,11 @@
cancel_upload = UPLOAD_ERROR_C;
}
#if DEBUG_FILE_UPLOAD
- if(strlen(filename) > 0 && total_bytes == 0 &&
!cancel_upload) {
+ if (strlen(filename) > 0 && total_bytes == 0 &&
!cancel_upload) {
sapi_module.sapi_error(E_WARNING, "Uploaded
file size 0 - file [%s=%s] not saved", param, filename);
cancel_upload = 5;
}
-#endif
-
+#endif
if (php_rfc1867_callback != NULL) {
multipart_event_file_end event_file_end;
@@ -947,7 +921,7 @@
if (array_index) {
efree(array_index);
}
- array_index = estrndup(start_arr+1,
array_len-2);
+ array_index = estrndup(start_arr + 1, array_len
- 2);
}
/* Add $foo_name */
@@ -960,7 +934,7 @@
/* The \ check should technically be needed for win32
systems only where
* it is a valid path separator. However, IE in all
it's wisdom always sends
* the full path of the file on the user's filesystem,
which means that unless
- * the user does basename() they get a bogus file name.
Until IE's user base drops
+ * the user does basename() they get a bogus file name.
Until IE's user base drops
* to nill or problem is fixed this code must remain
enabled for all systems.
*/
s = strrchr(filename, '\\');
@@ -985,7 +959,7 @@
/* Possible Content-Type: */
if (cancel_upload || !(cd =
php_mime_get_hdr_value(header, "Content-Type"))) {
cd = "";
- } else {
+ } else {
/* fix for Opera 6.01 */
s = strchr(cd, ';');
if (s != NULL) {
@@ -1028,7 +1002,7 @@
ZVAL_LONG(file_size, 0);
} else {
ZVAL_LONG(file_size, total_bytes);
- }
+ }
if (is_arr_upload) {
snprintf(lbuf, llen, "%s[error][%s]",
abuf, array_index);
@@ -1050,10 +1024,9 @@
}
fileupload_done:
-
if (php_rfc1867_callback != NULL) {
multipart_event_end event_end;
-
+
event_end.post_bytes_processed = SG(read_post_bytes);
php_rfc1867_callback(MULTIPART_EVENT_END, &event_end,
&event_extra_data TSRMLS_CC);
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php