Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki2@gmail.com>2014-07-03 23:08:23 +0400
committerLukasz Marek <lukasz.m.luki2@gmail.com>2014-07-04 03:21:08 +0400
commit3ba6dce48dc1e957dada8bfbff9106a2444e22c4 (patch)
treed5a12e5f0beb37e01ef8b901fa9a87b83205d68b /libavformat/ftp.c
parentcf8c44fc47330833fadc505dfef2c2c1ae03a561 (diff)
lavf/ftp: make response parsing more RFC compliant
Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>
Diffstat (limited to 'libavformat/ftp.c')
-rw-r--r--libavformat/ftp.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/libavformat/ftp.c b/libavformat/ftp.c
index 60011650b5..e99d4dd6db 100644
--- a/libavformat/ftp.c
+++ b/libavformat/ftp.c
@@ -119,7 +119,7 @@ static int ftp_get_line(FTPContext *s, char *line, int line_size)
*/
static int ftp_status(FTPContext *s, char **line, const int response_codes[])
{
- int err, i, dash = 0, result = 0, code_found = 0;
+ int err, i, dash = 0, result = 0, code_found = 0, linesize;
char buf[CONTROL_BUFFER_SIZE];
AVBPrint line_buffer;
@@ -135,25 +135,36 @@ static int ftp_status(FTPContext *s, char **line, const int response_codes[])
av_log(s, AV_LOG_DEBUG, "%s\n", buf);
- if (strlen(buf) < 4)
- continue;
-
+ linesize = strlen(buf);
err = 0;
- for (i = 0; i < 3; ++i) {
- if (buf[i] < '0' || buf[i] > '9')
- continue;
- err *= 10;
- err += buf[i] - '0';
+ if (linesize >= 3) {
+ for (i = 0; i < 3; ++i) {
+ if (buf[i] < '0' || buf[i] > '9') {
+ err = 0;
+ break;
+ }
+ err *= 10;
+ err += buf[i] - '0';
+ }
}
- dash = !!(buf[3] == '-');
-
- for (i = 0; response_codes[i]; ++i) {
- if (err == response_codes[i]) {
- if (line)
- av_bprintf(&line_buffer, "%s", buf);
- code_found = 1;
- result = err;
- break;
+
+ if (!code_found) {
+ for (i = 0; response_codes[i]; ++i) {
+ if (err == response_codes[i]) {
+ code_found = 1;
+ result = err;
+ break;
+ }
+ }
+ }
+ if (code_found) {
+ if (line)
+ av_bprintf(&line_buffer, "%s\r\n", buf);
+ if (linesize >= 4) {
+ if (!dash && buf[3] == '-')
+ dash = err;
+ else if (err == dash && buf[3] == ' ')
+ dash = 0;
}
}
}