Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-imap/imap-parser.c @ 9532:00cd9aacd03c HEAD
Updated copyright notices to include year 2010.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 25 Jan 2010 01:18:58 +0200 |
parents | 31fe9a8740c3 |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
9151
diff
changeset
|
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "lib.h" | |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
4 #include "istream.h" |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
5 #include "ostream.h" |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
877
diff
changeset
|
6 #include "strescape.h" |
0 | 7 #include "imap-parser.h" |
8 | |
9 #define is_linebreak(c) \ | |
10 ((c) == '\r' || (c) == '\n') | |
11 | |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
12 #define LIST_INIT_COUNT 7 |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
13 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
14 enum arg_parse_type { |
0 | 15 ARG_PARSE_NONE = 0, |
16 ARG_PARSE_ATOM, | |
17 ARG_PARSE_STRING, | |
18 ARG_PARSE_LITERAL, | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
19 ARG_PARSE_LITERAL_DATA, |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
20 ARG_PARSE_LITERAL_DATA_FORCED |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
21 }; |
0 | 22 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
23 struct imap_parser { |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
24 /* permanent */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
25 pool_t pool; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
26 struct istream *input; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
27 struct ostream *output; |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
28 size_t max_line_size; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
29 enum imap_parser_flags flags; |
0 | 30 |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
31 /* reset by imap_parser_reset(): */ |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
32 size_t line_size; |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
33 ARRAY_TYPE(imap_arg_list) root_list; |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
34 ARRAY_TYPE(imap_arg_list) *cur_list; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
35 struct imap_arg *list_arg; |
0 | 36 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
37 enum arg_parse_type cur_type; |
502
7927650f3b9b
imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents:
469
diff
changeset
|
38 size_t cur_pos; /* parser position in input buffer */ |
0 | 39 |
40 int str_first_escape; /* ARG_PARSE_STRING: index to first '\' */ | |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
41 uoff_t literal_size; /* ARG_PARSE_LITERAL: string size */ |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
42 |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
43 const char *error; |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
44 |
0 | 45 unsigned int literal_skip_crlf:1; |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
46 unsigned int literal_nonsync:1; |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
47 unsigned int literal_size_return:1; |
0 | 48 unsigned int eol:1; |
1023
dc660f588218
Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents:
1022
diff
changeset
|
49 unsigned int fatal_error:1; |
0 | 50 }; |
51 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
52 struct imap_parser * |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
53 imap_parser_create(struct istream *input, struct ostream *output, |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
54 size_t max_line_size) |
0 | 55 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
56 struct imap_parser *parser; |
0 | 57 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
58 parser = i_new(struct imap_parser, 1); |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
59 parser->pool = pool_alloconly_create(MEMPOOL_GROWING"IMAP parser", |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
60 1024*10); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
61 parser->input = input; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
62 parser->output = output; |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
63 parser->max_line_size = max_line_size; |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
64 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
65 p_array_init(&parser->root_list, parser->pool, LIST_INIT_COUNT); |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
66 parser->cur_list = &parser->root_list; |
0 | 67 return parser; |
68 } | |
69 | |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
70 void imap_parser_destroy(struct imap_parser **parser) |
0 | 71 { |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6418
diff
changeset
|
72 pool_unref(&(*parser)->pool); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
73 i_free(*parser); |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
74 *parser = NULL; |
0 | 75 } |
76 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
77 void imap_parser_reset(struct imap_parser *parser) |
0 | 78 { |
79 p_clear(parser->pool); | |
80 | |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
81 parser->line_size = 0; |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
82 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
83 p_array_init(&parser->root_list, parser->pool, LIST_INIT_COUNT); |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
84 parser->cur_list = &parser->root_list; |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
85 parser->list_arg = NULL; |
0 | 86 |
87 parser->cur_type = ARG_PARSE_NONE; | |
88 parser->cur_pos = 0; | |
89 | |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
90 parser->str_first_escape = 0; |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
91 parser->literal_size = 0; |
0 | 92 |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
93 parser->error = NULL; |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
94 |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
95 parser->literal_skip_crlf = FALSE; |
0 | 96 parser->eol = FALSE; |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
97 parser->literal_size_return = FALSE; |
0 | 98 } |
99 | |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3481
diff
changeset
|
100 const char *imap_parser_get_error(struct imap_parser *parser, bool *fatal) |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
101 { |
1023
dc660f588218
Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents:
1022
diff
changeset
|
102 *fatal = parser->fatal_error; |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
103 return parser->error; |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
104 } |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
105 |
502
7927650f3b9b
imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents:
469
diff
changeset
|
106 /* skip over everything parsed so far, plus the following whitespace */ |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
107 static int imap_parser_skip_to_next(struct imap_parser *parser, |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
108 const unsigned char **data, |
502
7927650f3b9b
imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents:
469
diff
changeset
|
109 size_t *data_size) |
0 | 110 { |
184 | 111 size_t i; |
0 | 112 |
113 for (i = parser->cur_pos; i < *data_size; i++) { | |
114 if ((*data)[i] != ' ') | |
115 break; | |
116 } | |
117 | |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
118 parser->line_size += i; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
119 i_stream_skip(parser->input, i); |
0 | 120 parser->cur_pos = 0; |
121 | |
122 *data += i; | |
123 *data_size -= i; | |
124 return *data_size > 0; | |
125 } | |
126 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
127 static struct imap_arg *imap_arg_create(struct imap_parser *parser) |
0 | 128 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
129 struct imap_arg *arg; |
0 | 130 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
131 arg = array_append_space(parser->cur_list); |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
132 arg->parent = parser->list_arg; |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
133 return arg; |
0 | 134 } |
135 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
136 static void imap_parser_open_list(struct imap_parser *parser) |
0 | 137 { |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
138 parser->list_arg = imap_arg_create(parser); |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
139 parser->list_arg->type = IMAP_ARG_LIST; |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
140 p_array_init(&parser->list_arg->_data.list, parser->pool, |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
141 LIST_INIT_COUNT); |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
142 parser->cur_list = &parser->list_arg->_data.list; |
0 | 143 |
144 parser->cur_type = ARG_PARSE_NONE; | |
145 } | |
146 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
147 static int imap_parser_close_list(struct imap_parser *parser) |
0 | 148 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
149 struct imap_arg *arg; |
0 | 150 |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
151 if (parser->list_arg == NULL) { |
0 | 152 /* we're not inside list */ |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
153 parser->error = "Unexpected ')'"; |
0 | 154 return FALSE; |
155 } | |
156 | |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
157 arg = imap_arg_create(parser); |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
158 arg->type = IMAP_ARG_EOL; |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
159 |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
160 parser->list_arg = parser->list_arg->parent; |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
161 if (parser->list_arg == NULL) { |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
162 parser->cur_list = &parser->root_list; |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
163 } else { |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
164 parser->cur_list = &parser->list_arg->_data.list; |
0 | 165 } |
166 | |
167 parser->cur_type = ARG_PARSE_NONE; | |
168 return TRUE; | |
169 } | |
170 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
171 static void imap_parser_save_arg(struct imap_parser *parser, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
172 const unsigned char *data, size_t size) |
0 | 173 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
174 struct imap_arg *arg; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
175 char *str; |
0 | 176 |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
177 arg = imap_arg_create(parser); |
0 | 178 |
179 switch (parser->cur_type) { | |
180 case ARG_PARSE_ATOM: | |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
181 if (size == 3 && memcmp(data, "NIL", 3) == 0) { |
0 | 182 /* NIL argument */ |
183 arg->type = IMAP_ARG_NIL; | |
184 } else { | |
185 /* simply save the string */ | |
186 arg->type = IMAP_ARG_ATOM; | |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
187 arg->_data.str = p_strndup(parser->pool, data, size); |
0 | 188 } |
189 break; | |
190 case ARG_PARSE_STRING: | |
191 /* data is quoted and may contain escapes. */ | |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
192 i_assert(size > 0); |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
193 |
0 | 194 arg->type = IMAP_ARG_STRING; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
195 str = p_strndup(parser->pool, data+1, size-1); |
0 | 196 |
197 /* remove the escapes */ | |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
198 if (parser->str_first_escape >= 0 && |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
199 (parser->flags & IMAP_PARSE_FLAG_NO_UNESCAPE) == 0) { |
0 | 200 /* -1 because we skipped the '"' prefix */ |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
201 str_unescape(str + parser->str_first_escape-1); |
0 | 202 } |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
203 arg->_data.str = str; |
0 | 204 break; |
205 case ARG_PARSE_LITERAL_DATA: | |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
206 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) != 0) { |
0 | 207 /* save literal size */ |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
208 arg->type = parser->literal_nonsync ? |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
209 IMAP_ARG_LITERAL_SIZE_NONSYNC : |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
210 IMAP_ARG_LITERAL_SIZE; |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
211 arg->_data.literal_size = parser->literal_size; |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
212 break; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
213 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
214 /* fall through */ |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
215 case ARG_PARSE_LITERAL_DATA_FORCED: |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
216 if ((parser->flags & |
1107
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
217 IMAP_PARSE_FLAG_LITERAL_TYPE) != 0) { |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
218 arg->type = IMAP_ARG_LITERAL; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
219 arg->_data.str = p_strndup(parser->pool, data, size); |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
220 } else { |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
221 arg->type = IMAP_ARG_STRING; |
4044c2903ed7
Don't do x-unknown mime encoding. Correct way is to just send them as
Timo Sirainen <tss@iki.fi>
parents:
1068
diff
changeset
|
222 arg->_data.str = p_strndup(parser->pool, data, size); |
0 | 223 } |
224 break; | |
225 default: | |
546
e1254b838e0b
Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents:
504
diff
changeset
|
226 i_unreached(); |
0 | 227 } |
228 | |
502
7927650f3b9b
imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents:
469
diff
changeset
|
229 parser->cur_type = ARG_PARSE_NONE; |
0 | 230 } |
231 | |
1169
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
232 static int is_valid_atom_char(struct imap_parser *parser, char chr) |
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
233 { |
6889
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
234 const char *error; |
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
235 |
6946
49ba86f65da5
Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents:
6889
diff
changeset
|
236 if (IS_ATOM_SPECIAL_INPUT((unsigned char)chr)) |
6889
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
237 error = "Invalid characters in atom"; |
6946
49ba86f65da5
Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents:
6889
diff
changeset
|
238 else if ((chr & 0x80) != 0) |
6889
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
239 error = "8bit data in atom"; |
6946
49ba86f65da5
Fixed handling invalid characters in atoms.
Timo Sirainen <tss@iki.fi>
parents:
6889
diff
changeset
|
240 else |
6889
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
241 return TRUE; |
1169
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
242 |
6889
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
243 if ((parser->flags & IMAP_PARSE_FLAG_ATOM_ALLCHARS) != 0) |
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
244 return TRUE; |
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
245 parser->error = error; |
3ec5a07d00f2
Added IMAP_PARSE_FLAG_ATOM_ALLCHARS.
Timo Sirainen <tss@iki.fi>
parents:
6739
diff
changeset
|
246 return FALSE; |
1169
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
247 } |
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
248 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
249 static int imap_parser_read_atom(struct imap_parser *parser, |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
250 const unsigned char *data, size_t data_size) |
0 | 251 { |
184 | 252 size_t i; |
0 | 253 |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
254 /* read until we've found space, CR or LF. */ |
0 | 255 for (i = parser->cur_pos; i < data_size; i++) { |
7131
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
256 if (data[i] == ' ' || is_linebreak(data[i])) { |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
257 imap_parser_save_arg(parser, data, i); |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
258 break; |
7131
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
259 } else if (data[i] == ')') { |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
260 if (parser->list_arg != NULL || |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
261 (parser->flags & |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
262 IMAP_PARSE_FLAG_ATOM_ALLCHARS) == 0) { |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
263 imap_parser_save_arg(parser, data, i); |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
264 break; |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
265 } |
0355a4603e80
If IMAP_PARSE_FLAG_ATOM_ALLCHARS is enabled, allow also ')' characters in
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
266 /* assume it's part of the atom */ |
2675
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
267 } else if (!is_valid_atom_char(parser, data[i])) |
60d33cf81c8e
BODY.PEEK[HEADER.FIELDS (...)] list is allowed to contain strings and
Timo Sirainen <tss@iki.fi>
parents:
1661
diff
changeset
|
268 return FALSE; |
0 | 269 } |
270 | |
271 parser->cur_pos = i; | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
272 return parser->cur_type == ARG_PARSE_NONE; |
0 | 273 } |
274 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
275 static int imap_parser_read_string(struct imap_parser *parser, |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
276 const unsigned char *data, size_t data_size) |
0 | 277 { |
184 | 278 size_t i; |
0 | 279 |
280 /* read until we've found non-escaped ", CR or LF */ | |
281 for (i = parser->cur_pos; i < data_size; i++) { | |
282 if (data[i] == '"') { | |
283 imap_parser_save_arg(parser, data, i); | |
284 | |
285 i++; /* skip the trailing '"' too */ | |
286 break; | |
287 } | |
288 | |
289 if (data[i] == '\\') { | |
290 if (i+1 == data_size) { | |
291 /* known data ends with '\' - leave it to | |
292 next time as well if it happens to be \" */ | |
293 break; | |
294 } | |
295 | |
296 /* save the first escaped char */ | |
297 if (parser->str_first_escape < 0) | |
298 parser->str_first_escape = i; | |
299 | |
300 /* skip the escaped char */ | |
301 i++; | |
302 } | |
303 | |
304 /* check linebreaks here, so escaping CR/LF isn't possible. | |
305 string always ends with '"', so it's an error if we found | |
306 a linebreak.. */ | |
8837
c9d6ae6f10fe
imap-parser: Added IMAP_PARSE_FLAG_MULTILINE_STR flag.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
307 if (is_linebreak(data[i]) && |
c9d6ae6f10fe
imap-parser: Added IMAP_PARSE_FLAG_MULTILINE_STR flag.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
308 (parser->flags & IMAP_PARSE_FLAG_MULTILINE_STR) == 0) { |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
309 parser->error = "Missing '\"'"; |
0 | 310 return FALSE; |
311 } | |
312 } | |
313 | |
314 parser->cur_pos = i; | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
315 return parser->cur_type == ARG_PARSE_NONE; |
0 | 316 } |
317 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
318 static int imap_parser_literal_end(struct imap_parser *parser) |
308
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
319 { |
1288
fa47d787c2aa
Literal parser broke if \r\n wasn't in buffer at the time '}' was parsed.
Timo Sirainen <tss@iki.fi>
parents:
1175
diff
changeset
|
320 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0) { |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
321 if (parser->line_size >= parser->max_line_size || |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
322 parser->literal_size > |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
323 parser->max_line_size - parser->line_size) { |
308
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
324 /* too long string, abort. */ |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
325 parser->error = "Literal size too large"; |
1023
dc660f588218
Disconnect client if given non-sync literal size is too large. Better than
Timo Sirainen <tss@iki.fi>
parents:
1022
diff
changeset
|
326 parser->fatal_error = TRUE; |
308
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
327 return FALSE; |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
328 } |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
329 |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
330 if (parser->output != NULL && !parser->literal_nonsync) { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
331 o_stream_send(parser->output, "+ OK\r\n", 6); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
332 o_stream_flush(parser->output); |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
348
diff
changeset
|
333 } |
308
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
334 } |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
335 |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
336 parser->cur_type = ARG_PARSE_LITERAL_DATA; |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
337 parser->literal_skip_crlf = TRUE; |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
338 |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
339 parser->cur_pos = 0; |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
340 return TRUE; |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
341 } |
899d3e189dbf
We didn't allow saving messages longer than 8192 bytes. Now we also send the
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
342 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
343 static int imap_parser_read_literal(struct imap_parser *parser, |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
344 const unsigned char *data, |
184 | 345 size_t data_size) |
0 | 346 { |
184 | 347 size_t i, prev_size; |
0 | 348 |
349 /* expecting digits + "}" */ | |
350 for (i = parser->cur_pos; i < data_size; i++) { | |
351 if (data[i] == '}') { | |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
352 parser->line_size += i+1; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
353 i_stream_skip(parser->input, i+1); |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
354 return imap_parser_literal_end(parser); |
0 | 355 } |
356 | |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
357 if (parser->literal_nonsync) { |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
358 parser->error = "Expecting '}' after '+'"; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
359 return FALSE; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
360 } |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
361 |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
362 if (data[i] == '+') { |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
363 parser->literal_nonsync = TRUE; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
364 continue; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
365 } |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
366 |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
367 if (data[i] < '0' || data[i] > '9') { |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
368 parser->error = "Invalid literal size"; |
0 | 369 return FALSE; |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
370 } |
0 | 371 |
372 prev_size = parser->literal_size; | |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
22
diff
changeset
|
373 parser->literal_size = parser->literal_size*10 + (data[i]-'0'); |
0 | 374 |
375 if (parser->literal_size < prev_size) { | |
376 /* wrapped around, abort. */ | |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
377 parser->error = "Literal size too large"; |
0 | 378 return FALSE; |
379 } | |
380 } | |
381 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
382 parser->cur_pos = i; |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
383 return FALSE; |
0 | 384 } |
385 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
386 static int imap_parser_read_literal_data(struct imap_parser *parser, |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
387 const unsigned char *data, |
184 | 388 size_t data_size) |
0 | 389 { |
390 if (parser->literal_skip_crlf) { | |
391 /* skip \r\n or \n, anything else gives an error */ | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
392 if (data_size == 0) |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
393 return FALSE; |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
394 |
0 | 395 if (*data == '\r') { |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
396 parser->line_size++; |
0 | 397 data++; data_size--; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
398 i_stream_skip(parser->input, 1); |
719 | 399 |
400 if (data_size == 0) | |
401 return FALSE; | |
0 | 402 } |
403 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
404 if (*data != '\n') { |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
405 parser->error = "Missing LF after literal size"; |
0 | 406 return FALSE; |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
407 } |
0 | 408 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
409 parser->line_size++; |
0 | 410 data++; data_size--; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
411 i_stream_skip(parser->input, 1); |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
412 |
0 | 413 parser->literal_skip_crlf = FALSE; |
414 | |
415 i_assert(parser->cur_pos == 0); | |
416 } | |
417 | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
418 if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0 || |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
419 parser->cur_type == ARG_PARSE_LITERAL_DATA_FORCED) { |
0 | 420 /* now we just wait until we've read enough data */ |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
421 if (data_size < parser->literal_size) |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
422 return FALSE; |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
423 else { |
0 | 424 imap_parser_save_arg(parser, data, |
184 | 425 (size_t)parser->literal_size); |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
426 parser->cur_pos = (size_t)parser->literal_size; |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
427 return TRUE; |
0 | 428 } |
429 } else { | |
430 /* we want to save only literal size, not the literal itself. */ | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
431 parser->literal_size_return = TRUE; |
0 | 432 imap_parser_save_arg(parser, NULL, 0); |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
433 return FALSE; |
0 | 434 } |
435 } | |
436 | |
437 /* Returns TRUE if argument was fully processed. Also returns TRUE if | |
438 an argument inside a list was processed. */ | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
439 static int imap_parser_read_arg(struct imap_parser *parser) |
0 | 440 { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
441 const unsigned char *data; |
184 | 442 size_t data_size; |
0 | 443 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
444 data = i_stream_get_data(parser->input, &data_size); |
0 | 445 if (data_size == 0) |
446 return FALSE; | |
447 | |
448 while (parser->cur_type == ARG_PARSE_NONE) { | |
449 /* we haven't started parsing yet */ | |
502
7927650f3b9b
imap_parser_read_args() didn't correctly always return "need for more data"
Timo Sirainen <tss@iki.fi>
parents:
469
diff
changeset
|
450 if (!imap_parser_skip_to_next(parser, &data, &data_size)) |
0 | 451 return FALSE; |
452 i_assert(parser->cur_pos == 0); | |
453 | |
454 switch (data[0]) { | |
455 case '\r': | |
9081
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
456 if (data_size == 1) { |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
457 /* wait for LF */ |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
458 return FALSE; |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
459 } |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
460 if (data[1] != '\n') { |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
461 parser->error = "CR sent without LF"; |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
462 return FALSE; |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
463 } |
09f78cad5d58
imap-parser: Don't return early if line ends with CR but there's no LF.
Timo Sirainen <tss@iki.fi>
parents:
8837
diff
changeset
|
464 /* fall through */ |
0 | 465 case '\n': |
466 /* unexpected end of line */ | |
467 parser->eol = TRUE; | |
468 return FALSE; | |
469 case '"': | |
470 parser->cur_type = ARG_PARSE_STRING; | |
471 parser->str_first_escape = -1; | |
472 break; | |
473 case '{': | |
474 parser->cur_type = ARG_PARSE_LITERAL; | |
475 parser->literal_size = 0; | |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
476 parser->literal_nonsync = FALSE; |
0 | 477 break; |
478 case '(': | |
479 imap_parser_open_list(parser); | |
480 break; | |
481 case ')': | |
482 if (!imap_parser_close_list(parser)) | |
483 return FALSE; | |
484 | |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
485 if (parser->list_arg == NULL) { |
0 | 486 /* end of argument */ |
487 parser->cur_pos++; | |
488 return TRUE; | |
489 } | |
490 break; | |
491 default: | |
1169
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
492 if (!is_valid_atom_char(parser, data[0])) |
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
493 return FALSE; |
0 | 494 parser->cur_type = ARG_PARSE_ATOM; |
495 break; | |
496 } | |
497 | |
498 parser->cur_pos++; | |
499 } | |
500 | |
501 i_assert(data_size > 0); | |
502 | |
503 switch (parser->cur_type) { | |
504 case ARG_PARSE_ATOM: | |
505 if (!imap_parser_read_atom(parser, data, data_size)) | |
506 return FALSE; | |
507 break; | |
508 case ARG_PARSE_STRING: | |
509 if (!imap_parser_read_string(parser, data, data_size)) | |
510 return FALSE; | |
511 break; | |
512 case ARG_PARSE_LITERAL: | |
513 if (!imap_parser_read_literal(parser, data, data_size)) | |
514 return FALSE; | |
515 | |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
516 /* pass through to parsing data. since input->skip was |
0 | 517 modified, we need to get the data start position again. */ |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
518 data = i_stream_get_data(parser->input, &data_size); |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
519 |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
520 /* fall through */ |
0 | 521 case ARG_PARSE_LITERAL_DATA: |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
522 case ARG_PARSE_LITERAL_DATA_FORCED: |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
523 if (!imap_parser_read_literal_data(parser, data, data_size)) |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
524 return FALSE; |
0 | 525 break; |
526 default: | |
546
e1254b838e0b
Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents:
504
diff
changeset
|
527 i_unreached(); |
0 | 528 } |
529 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
530 i_assert(parser->cur_type == ARG_PARSE_NONE); |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
531 return TRUE; |
0 | 532 } |
533 | |
1010
3c30228ae095
Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents:
941
diff
changeset
|
534 /* ARG_PARSE_NONE checks that last argument isn't only partially parsed. */ |
720 | 535 #define IS_UNFINISHED(parser) \ |
536 ((parser)->cur_type != ARG_PARSE_NONE || \ | |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
537 (parser)->cur_list != &parser->root_list) |
719 | 538 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
539 static int finish_line(struct imap_parser *parser, unsigned int count, |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
540 const struct imap_arg **args_r) |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
541 { |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
542 struct imap_arg *arg; |
9151
31fe9a8740c3
imap_parser_read_args() didn't correctly return how many parameters were read.
Timo Sirainen <tss@iki.fi>
parents:
9081
diff
changeset
|
543 int ret = array_count(&parser->root_list); |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
544 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
545 parser->line_size += parser->cur_pos; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
546 i_stream_skip(parser->input, parser->cur_pos); |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
547 parser->cur_pos = 0; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
548 |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
549 if (parser->list_arg != NULL && !parser->literal_size_return) { |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
550 parser->error = "Missing ')'"; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
551 *args_r = NULL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
552 return -1; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
553 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
554 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
555 /* fill the missing parameters with NILs */ |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
556 while (count > array_count(&parser->root_list)) { |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
557 arg = array_append_space(&parser->root_list); |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
558 arg->type = IMAP_ARG_NIL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
559 } |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
560 arg = array_append_space(&parser->root_list); |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
561 arg->type = IMAP_ARG_EOL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
562 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
563 *args_r = array_get(&parser->root_list, &count); |
9151
31fe9a8740c3
imap_parser_read_args() didn't correctly return how many parameters were read.
Timo Sirainen <tss@iki.fi>
parents:
9081
diff
changeset
|
564 return ret; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
565 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
566 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
567 int imap_parser_read_args(struct imap_parser *parser, unsigned int count, |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
568 enum imap_parser_flags flags, |
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
569 const struct imap_arg **args_r) |
0 | 570 { |
571 parser->flags = flags; | |
572 | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
573 if (parser->literal_size_return) { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
574 /* delete EOL */ |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
575 array_delete(&parser->root_list, |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
576 array_count(&parser->root_list)-1, 1); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
577 parser->literal_size_return = FALSE; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
578 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
579 |
5836
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
580 while (!parser->eol && (count == 0 || IS_UNFINISHED(parser) || |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
581 array_count(&parser->root_list) < count)) { |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
582 if (!imap_parser_read_arg(parser)) |
0 | 583 break; |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
584 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
585 if (parser->line_size > parser->max_line_size) { |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
586 parser->error = "IMAP command line too large"; |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
587 break; |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
588 } |
0 | 589 } |
590 | |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
591 if (parser->error != NULL) { |
0 | 592 /* error, abort */ |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
593 parser->line_size += parser->cur_pos; |
1014
26a028e6d7d5
Externally parsed literal size always stops argument parsing now. Input
Timo Sirainen <tss@iki.fi>
parents:
1010
diff
changeset
|
594 i_stream_skip(parser->input, parser->cur_pos); |
26a028e6d7d5
Externally parsed literal size always stops argument parsing now. Input
Timo Sirainen <tss@iki.fi>
parents:
1010
diff
changeset
|
595 parser->cur_pos = 0; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
596 *args_r = NULL; |
0 | 597 return -1; |
735
ce93054db96b
All SEARCH arguments still may not have been parsed.
Timo Sirainen <tss@iki.fi>
parents:
720
diff
changeset
|
598 } else if ((!IS_UNFINISHED(parser) && count > 0 && |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
599 array_count(&parser->root_list) >= count) || |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
600 parser->eol || parser->literal_size_return) { |
1010
3c30228ae095
Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents:
941
diff
changeset
|
601 /* all arguments read / end of line. */ |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
602 return finish_line(parser, count, args_r); |
0 | 603 } else { |
604 /* need more data */ | |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
605 *args_r = NULL; |
0 | 606 return -2; |
607 } | |
608 } | |
609 | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
610 static struct imap_arg * |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
611 imap_parser_get_last_literal_size(struct imap_parser *parser, |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
612 ARRAY_TYPE(imap_arg_list) **list_r) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
613 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
614 ARRAY_TYPE(imap_arg_list) *list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
615 struct imap_arg *args; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
616 unsigned int count; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
617 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
618 list = &parser->root_list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
619 args = array_get_modifiable(&parser->root_list, &count); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
620 i_assert(count > 1 && args[count-1].type == IMAP_ARG_EOL); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
621 count--; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
622 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
623 while (args[count-1].type != IMAP_ARG_LITERAL_SIZE && |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
624 args[count-1].type != IMAP_ARG_LITERAL_SIZE_NONSYNC) { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
625 if (args[count-1].type != IMAP_ARG_LIST) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
626 return NULL; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
627 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
628 /* maybe the list ends with literal size */ |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
629 list = &args[count-1]._data.list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
630 args = array_get_modifiable(list, &count); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
631 if (count == 0) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
632 return NULL; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
633 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
634 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
635 *list_r = list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
636 return &args[count-1]; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
637 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
638 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
639 bool imap_parser_get_literal_size(struct imap_parser *parser, uoff_t *size_r) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
640 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
641 ARRAY_TYPE(imap_arg_list) *list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
642 struct imap_arg *last_arg; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
643 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
644 last_arg = imap_parser_get_last_literal_size(parser, &list); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
645 if (last_arg == NULL) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
646 return FALSE; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
647 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
648 *size_r = IMAP_ARG_LITERAL_SIZE(last_arg); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
649 return TRUE; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
650 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
651 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
652 void imap_parser_read_last_literal(struct imap_parser *parser) |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
653 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
654 ARRAY_TYPE(imap_arg_list) *list; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
655 struct imap_arg *last_arg; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
656 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
657 i_assert(parser->literal_size_return); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
658 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
659 last_arg = imap_parser_get_last_literal_size(parser, &list); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
660 i_assert(last_arg != NULL); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
661 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
662 parser->cur_type = ARG_PARSE_LITERAL_DATA_FORCED; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
663 i_assert(parser->literal_size == last_arg->_data.literal_size); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
664 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
665 /* delete EOL */ |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
666 array_delete(&parser->root_list, array_count(&parser->root_list)-1, 1); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
667 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
668 /* delete literal size */ |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
669 array_delete(list, array_count(list)-1, 1); |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
670 parser->literal_size_return = FALSE; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
671 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
672 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
673 int imap_parser_finish_line(struct imap_parser *parser, unsigned int count, |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
674 enum imap_parser_flags flags, |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
675 const struct imap_arg **args_r) |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
676 { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
677 const unsigned char *data; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
678 size_t data_size; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
679 int ret; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
680 |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
681 ret = imap_parser_read_args(parser, count, flags, args_r); |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
682 if (ret == -2) { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
683 /* we should have noticed end of everything except atom */ |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
684 if (parser->cur_type == ARG_PARSE_ATOM) { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
685 data = i_stream_get_data(parser->input, &data_size); |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
686 imap_parser_save_arg(parser, data, data_size); |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
687 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
688 } |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
689 return finish_line(parser, count, args_r); |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
690 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
691 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
692 const char *imap_parser_read_word(struct imap_parser *parser) |
0 | 693 { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
694 const unsigned char *data; |
184 | 695 size_t i, data_size; |
0 | 696 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
697 data = i_stream_get_data(parser->input, &data_size); |
0 | 698 |
699 for (i = 0; i < data_size; i++) { | |
700 if (data[i] == ' ' || data[i] == '\r' || data[i] == '\n') | |
701 break; | |
702 } | |
703 | |
704 if (i < data_size) { | |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
705 data_size = i + (data[i] == ' ' ? 1 : 0); |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
706 parser->line_size += data_size; |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
707 i_stream_skip(parser->input, data_size); |
0 | 708 return p_strndup(parser->pool, data, i); |
709 } else { | |
710 return NULL; | |
711 } | |
712 } | |
713 | |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
714 const char *imap_arg_string(const struct imap_arg *arg) |
0 | 715 { |
716 switch (arg->type) { | |
717 case IMAP_ARG_NIL: | |
718 return ""; | |
719 | |
720 case IMAP_ARG_ATOM: | |
721 case IMAP_ARG_STRING: | |
5837
5cd5f65a8dad
imap_arg_string() should handle IMAP_ARG_LITERAL also.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
722 case IMAP_ARG_LITERAL: |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
723 return arg->_data.str; |
0 | 724 |
725 default: | |
726 return NULL; | |
727 } | |
728 } | |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
729 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
730 char *imap_arg_str_error(const struct imap_arg *arg) |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
731 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
732 i_panic("Tried to access imap_arg type %d as string", arg->type); |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6351
diff
changeset
|
733 #ifndef ATTRS_DEFINED |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
734 return NULL; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
735 #endif |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
736 } |
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
737 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
738 uoff_t imap_arg_literal_size_error(const struct imap_arg *arg) |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
739 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
740 i_panic("Tried to access imap_arg type %d as literal size", arg->type); |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6351
diff
changeset
|
741 #ifndef ATTRS_DEFINED |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
742 return 0; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
743 #endif |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
744 } |
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
745 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
746 ARRAY_TYPE(imap_arg_list) *imap_arg_list_error(const struct imap_arg *arg) |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
747 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
748 i_panic("Tried to access imap_arg type %d as list", arg->type); |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6351
diff
changeset
|
749 #ifndef ATTRS_DEFINED |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
750 return NULL; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
751 #endif |
877
7935347f54f1
Don't access ImapArg's union members directly - too easy to mess up. Fixes a
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
752 } |