]>
Commit | Line | Data |
---|---|---|
fb98beff ER |
1 | --- PHP_5_3/ext/standard/ftp_fopen_wrapper.c 2011/02/27 20:10:08 308733 |
2 | +++ PHP_5_3/ext/standard/ftp_fopen_wrapper.c 2011/02/27 20:23:54 308734 | |
3 | @@ -72,6 +72,12 @@ | |
4 | #define FTPS_ENCRYPT_DATA 1 | |
5 | #define GET_FTP_RESULT(stream) get_ftp_result((stream), tmp_line, sizeof(tmp_line) TSRMLS_CC) | |
6 | ||
7 | +typedef struct _php_ftp_dirstream_data { | |
8 | + php_stream *datastream; | |
9 | + php_stream *controlstream; | |
10 | + php_stream *dirstream; | |
11 | +} php_ftp_dirstream_data; | |
12 | + | |
13 | /* {{{ get_ftp_result | |
14 | */ | |
15 | static inline int get_ftp_result(php_stream *stream, char *buffer, size_t buffer_size TSRMLS_DC) | |
16 | @@ -97,7 +103,7 @@ | |
17 | */ | |
18 | static int php_stream_ftp_stream_close(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC) | |
19 | { | |
20 | - php_stream *controlstream = (php_stream *)stream->wrapperdata; | |
21 | + php_stream *controlstream = stream->wrapperthis; | |
22 | int ret = 0; | |
23 | ||
24 | if (controlstream) { | |
25 | @@ -106,10 +112,6 @@ | |
26 | int result; | |
27 | ||
28 | /* For write modes close data stream first to signal EOF to server */ | |
29 | - stream->wrapperdata = NULL; | |
30 | - php_stream_close(stream); | |
31 | - stream = NULL; | |
32 | - | |
33 | result = GET_FTP_RESULT(controlstream); | |
34 | if (result != 226 && result != 250) { | |
35 | php_error_docref(NULL TSRMLS_CC, E_WARNING, "FTP server error %d:%s", result, tmp_line); | |
36 | @@ -119,9 +121,7 @@ | |
37 | ||
38 | php_stream_write_string(controlstream, "QUIT\r\n"); | |
39 | php_stream_close(controlstream); | |
40 | - if (stream) { | |
41 | - stream->wrapperdata = NULL; | |
42 | - } | |
43 | + stream->wrapperthis = NULL; | |
44 | } | |
45 | ||
46 | return ret; | |
47 | @@ -584,7 +584,7 @@ | |
48 | } | |
49 | ||
50 | /* remember control stream */ | |
51 | - datastream->wrapperdata = (zval *)stream; | |
52 | + datastream->wrapperthis = stream; | |
53 | ||
54 | php_url_free(resource); | |
55 | return datastream; | |
56 | @@ -608,11 +608,13 @@ | |
57 | static size_t php_ftp_dirstream_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) | |
58 | { | |
59 | php_stream_dirent *ent = (php_stream_dirent *)buf; | |
60 | - php_stream *innerstream = (php_stream *)stream->abstract; | |
61 | + php_stream *innerstream; | |
62 | size_t tmp_len; | |
63 | char *basename; | |
64 | size_t basename_len; | |
65 | ||
66 | + innerstream = ((php_ftp_dirstream_data *)stream->abstract)->datastream; | |
67 | + | |
68 | if (count != sizeof(php_stream_dirent)) { | |
69 | return 0; | |
70 | } | |
71 | @@ -656,13 +658,18 @@ | |
72 | */ | |
73 | static int php_ftp_dirstream_close(php_stream *stream, int close_handle TSRMLS_DC) | |
74 | { | |
75 | - php_stream *innerstream = (php_stream *)stream->abstract; | |
76 | + php_ftp_dirstream_data *data = stream->abstract; | |
77 | ||
78 | - if (innerstream->wrapperdata) { | |
79 | - php_stream_close((php_stream *)innerstream->wrapperdata); | |
80 | - innerstream->wrapperdata = NULL; | |
81 | - } | |
82 | - php_stream_close((php_stream *)stream->abstract); | |
83 | + /* close control connection */ | |
84 | + if (data->controlstream) { | |
85 | + php_stream_close(data->controlstream); | |
86 | + data->controlstream = NULL; | |
87 | + } | |
88 | + /* close data connection */ | |
89 | + php_stream_close(data->datastream); | |
90 | + data->datastream = NULL; | |
91 | + | |
92 | + efree(data); | |
93 | stream->abstract = NULL; | |
94 | ||
95 | return 0; | |
96 | @@ -688,6 +695,7 @@ | |
97 | php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) | |
98 | { | |
99 | php_stream *stream, *reuseid, *datastream = NULL; | |
100 | + php_ftp_dirstream_data *dirsdata; | |
101 | php_url *resource = NULL; | |
102 | int result = 0, use_ssl, use_ssl_on_data = 0; | |
103 | char *hoststart = NULL, tmp_line[512]; | |
104 | @@ -747,11 +755,14 @@ | |
105 | goto opendir_errexit; | |
106 | } | |
107 | ||
108 | - /* remember control stream */ | |
109 | - datastream->wrapperdata = (zval *)stream; | |
110 | - | |
111 | php_url_free(resource); | |
112 | - return php_stream_alloc(&php_ftp_dirstream_ops, datastream, 0, mode); | |
113 | + | |
114 | + dirsdata = emalloc(sizeof *dirsdata); | |
115 | + dirsdata->datastream = datastream; | |
116 | + dirsdata->controlstream = stream; | |
117 | + dirsdata->dirstream = php_stream_alloc(&php_ftp_dirstream_ops, dirsdata, 0, mode); | |
118 | + | |
119 | + return dirsdata->dirstream; | |
120 | ||
121 | opendir_errexit: | |
122 | if (resource) { |