Mercurial > mplayer.hg
annotate libmpdemux/stream_file.c @ 18001:a2683ee7cb5a
fix descrambling of asf file,
where signed buffer could cause erroneous values to be filled in descrable variables,
add misssing check for one of these variables
and restore sign of these variables as insurance that these checks will work even in such case.
author | iive |
---|---|
date | Thu, 30 Mar 2006 23:06:18 +0000 |
parents | 6ff3379a0862 |
children |
rev | line source |
---|---|
9794 | 1 |
2 #include "config.h" | |
3 | |
16748
ec02252fbaa6
we need stdio.h for SEEK_SET on mingw, patch by Zuxy <zuxy.meng at gmail.com>
faust3
parents:
15461
diff
changeset
|
4 #include <stdio.h> |
9794 | 5 #include <sys/types.h> |
6 #include <sys/stat.h> | |
7 #include <fcntl.h> | |
8 #include <unistd.h> | |
9 | |
10 #include "mp_msg.h" | |
11 #include "stream.h" | |
12 #include "help_mp.h" | |
17012 | 13 #include "m_option.h" |
14 #include "m_struct.h" | |
9794 | 15 |
16 static struct stream_priv_s { | |
17 char* filename; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
18 char *filename2; |
9794 | 19 } stream_priv_dflts = { |
15452 | 20 NULL, NULL |
9794 | 21 }; |
22 | |
23 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
24 /// URL definition | |
25 static m_option_t stream_opts_fields[] = { | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
26 {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
27 {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
9794 | 28 { NULL, NULL, 0, 0, 0, 0, NULL } |
29 }; | |
30 static struct m_struct_st stream_opts = { | |
31 "file", | |
32 sizeof(struct stream_priv_s), | |
33 &stream_priv_dflts, | |
34 stream_opts_fields | |
35 }; | |
36 | |
37 static int fill_buffer(stream_t *s, char* buffer, int max_len){ | |
38 int r = read(s->fd,buffer,max_len); | |
39 return (r <= 0) ? -1 : r; | |
40 } | |
41 | |
42 static int write_buffer(stream_t *s, char* buffer, int len) { | |
43 int r = write(s->fd,buffer,len); | |
44 return (r <= 0) ? -1 : r; | |
45 } | |
46 | |
47 static int seek(stream_t *s,off_t newpos) { | |
48 s->pos = newpos; | |
49 if(lseek(s->fd,s->pos,SEEK_SET)<0) { | |
50 s->eof=1; | |
51 return 0; | |
52 } | |
53 return 1; | |
54 } | |
55 | |
56 static int seek_forward(stream_t *s,off_t newpos) { | |
57 if(newpos<s->pos){ | |
58 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); | |
59 return 0; | |
60 } | |
61 while(s->pos<newpos){ | |
12018 | 62 int len=s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE); |
63 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF | |
64 s->buf_pos=0; | |
65 s->buf_len=len; | |
66 s->pos+=len; | |
9794 | 67 } |
68 return 1; | |
69 } | |
70 | |
71 static int open_f(stream_t *stream,int mode, void* opts, int* file_format) { | |
72 int f; | |
73 mode_t m = 0; | |
74 off_t len; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
75 unsigned char *filename; |
9794 | 76 struct stream_priv_s* p = (struct stream_priv_s*)opts; |
77 | |
78 if(mode == STREAM_READ) | |
79 m = O_RDONLY; | |
80 else if(mode == STREAM_WRITE) | |
81 m = O_WRONLY; | |
82 else { | |
10608 | 83 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode); |
9794 | 84 m_struct_free(&stream_opts,opts); |
85 return STREAM_UNSUPORTED; | |
86 } | |
87 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
88 if(p->filename) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
89 filename = p->filename; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
90 else if(p->filename2) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
91 filename = p->filename2; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
92 else |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
93 filename = NULL; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
94 if(!filename) { |
9849 | 95 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n"); |
96 m_struct_free(&stream_opts,opts); | |
97 return STREAM_ERROR; | |
98 } | |
99 | |
9794 | 100 #if defined(__CYGWIN__)|| defined(__MINGW32__) |
101 m |= O_BINARY; | |
102 #endif | |
103 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
104 if(!strcmp(filename,"-")){ |
9794 | 105 if(mode == STREAM_READ) { |
106 // read from stdin | |
107 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_ReadSTDIN); | |
108 f=0; // 0=stdin | |
12921 | 109 #ifdef __MINGW32__ |
110 setmode(fileno(stdin),O_BINARY); | |
111 #endif | |
9794 | 112 } else { |
113 mp_msg(MSGT_OPEN,MSGL_INFO,"Writing to stdout\n"); | |
114 f=1; | |
12921 | 115 #ifdef __MINGW32__ |
116 setmode(fileno(stdout),O_BINARY); | |
117 #endif | |
9794 | 118 } |
119 } else { | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
120 f=open(filename,m); |
9794 | 121 if(f<0) { |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
122 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename); |
9794 | 123 m_struct_free(&stream_opts,opts); |
9827 | 124 return STREAM_ERROR; |
9794 | 125 } |
126 } | |
127 | |
128 len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); | |
12921 | 129 #ifdef __MINGW32__ |
130 if(f==0 || len == -1) { | |
131 #else | |
9794 | 132 if(len == -1) { |
12921 | 133 #endif |
9794 | 134 stream->seek = seek_forward; |
135 stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE | |
136 stream->flags |= STREAM_SEEK_FW; | |
137 } else if(len >= 0) { | |
138 stream->seek = seek; | |
139 stream->end_pos = len; | |
140 stream->type = STREAMTYPE_FILE; | |
141 } | |
142 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16748
diff
changeset
|
143 mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len); |
9794 | 144 |
145 stream->fd = f; | |
146 stream->fill_buffer = fill_buffer; | |
147 stream->write_buffer = write_buffer; | |
148 | |
149 m_struct_free(&stream_opts,opts); | |
150 return STREAM_OK; | |
151 } | |
152 | |
153 stream_info_t stream_info_file = { | |
154 "File", | |
155 "file", | |
156 "Albeu", | |
157 "based on the code from ??? (probably Arpi)", | |
158 open_f, | |
159 { "file", "", NULL }, | |
160 &stream_opts, | |
161 1 // Urls are an option string | |
162 }; |