Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-imap/imap-parser.c @ 7182:efc78f6db374 HEAD
Added tag 1.1.beta14 for changeset 88de748a2f17
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 20 Jan 2008 14:55:38 +0200 |
parents | 0355a4603e80 |
children | b9faf4db2a9f |
rev | line source |
---|---|
7086
7ed926ed7aa4
Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents:
6946
diff
changeset
|
1 /* Copyright (c) 2002-2008 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.. */ | |
307 if (is_linebreak(data[i])) { | |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
308 parser->error = "Missing '\"'"; |
0 | 309 return FALSE; |
310 } | |
311 } | |
312 | |
313 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
|
314 return parser->cur_type == ARG_PARSE_NONE; |
0 | 315 } |
316 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
317 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
|
318 { |
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
|
319 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
|
320 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
|
321 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
|
322 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
|
323 /* 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
|
324 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
|
325 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
|
326 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
|
327 } |
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 |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 } |
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
|
333 } |
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 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
|
336 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
|
337 |
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 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
|
339 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
|
340 } |
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 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
342 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
|
343 const unsigned char *data, |
184 | 344 size_t data_size) |
0 | 345 { |
184 | 346 size_t i, prev_size; |
0 | 347 |
348 /* expecting digits + "}" */ | |
349 for (i = parser->cur_pos; i < data_size; i++) { | |
350 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
|
351 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
|
352 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
|
353 return imap_parser_literal_end(parser); |
0 | 354 } |
355 | |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
356 if (parser->literal_nonsync) { |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
357 parser->error = "Expecting '}' after '+'"; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
358 return FALSE; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
359 } |
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 if (data[i] == '+') { |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
362 parser->literal_nonsync = TRUE; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
363 continue; |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
364 } |
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
365 |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
366 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
|
367 parser->error = "Invalid literal size"; |
0 | 368 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
|
369 } |
0 | 370 |
371 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
|
372 parser->literal_size = parser->literal_size*10 + (data[i]-'0'); |
0 | 373 |
374 if (parser->literal_size < prev_size) { | |
375 /* 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
|
376 parser->error = "Literal size too large"; |
0 | 377 return FALSE; |
378 } | |
379 } | |
380 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
381 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
|
382 return FALSE; |
0 | 383 } |
384 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
385 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
|
386 const unsigned char *data, |
184 | 387 size_t data_size) |
0 | 388 { |
389 if (parser->literal_skip_crlf) { | |
390 /* 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
|
391 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
|
392 return FALSE; |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
393 |
0 | 394 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
|
395 parser->line_size++; |
0 | 396 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
|
397 i_stream_skip(parser->input, 1); |
719 | 398 |
399 if (data_size == 0) | |
400 return FALSE; | |
0 | 401 } |
402 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
403 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
|
404 parser->error = "Missing LF after literal size"; |
0 | 405 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
|
406 } |
0 | 407 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
408 parser->line_size++; |
0 | 409 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
|
410 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
|
411 |
0 | 412 parser->literal_skip_crlf = FALSE; |
413 | |
414 i_assert(parser->cur_pos == 0); | |
415 } | |
416 | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
417 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
|
418 parser->cur_type == ARG_PARSE_LITERAL_DATA_FORCED) { |
0 | 419 /* 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
|
420 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
|
421 return FALSE; |
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
422 else { |
0 | 423 imap_parser_save_arg(parser, data, |
184 | 424 (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
|
425 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
|
426 return TRUE; |
0 | 427 } |
428 } else { | |
429 /* 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
|
430 parser->literal_size_return = TRUE; |
0 | 431 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
|
432 return FALSE; |
0 | 433 } |
434 } | |
435 | |
436 /* Returns TRUE if argument was fully processed. Also returns TRUE if | |
437 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
|
438 static int imap_parser_read_arg(struct imap_parser *parser) |
0 | 439 { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
440 const unsigned char *data; |
184 | 441 size_t data_size; |
0 | 442 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
443 data = i_stream_get_data(parser->input, &data_size); |
0 | 444 if (data_size == 0) |
445 return FALSE; | |
446 | |
447 while (parser->cur_type == ARG_PARSE_NONE) { | |
448 /* 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
|
449 if (!imap_parser_skip_to_next(parser, &data, &data_size)) |
0 | 450 return FALSE; |
451 i_assert(parser->cur_pos == 0); | |
452 | |
453 switch (data[0]) { | |
454 case '\r': | |
455 case '\n': | |
456 /* unexpected end of line */ | |
457 parser->eol = TRUE; | |
458 return FALSE; | |
459 case '"': | |
460 parser->cur_type = ARG_PARSE_STRING; | |
461 parser->str_first_escape = -1; | |
462 break; | |
463 case '{': | |
464 parser->cur_type = ARG_PARSE_LITERAL; | |
465 parser->literal_size = 0; | |
1022
09bac2875ed8
Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents:
1014
diff
changeset
|
466 parser->literal_nonsync = FALSE; |
0 | 467 break; |
468 case '(': | |
469 imap_parser_open_list(parser); | |
470 break; | |
471 case ')': | |
472 if (!imap_parser_close_list(parser)) | |
473 return FALSE; | |
474 | |
444
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
475 if (parser->list_arg == NULL) { |
0 | 476 /* end of argument */ |
477 parser->cur_pos++; | |
478 return TRUE; | |
479 } | |
480 break; | |
481 default: | |
1169
0eaf51e01ccd
Allow wildcards anyway in atoms, they're needed with LIST.
Timo Sirainen <tss@iki.fi>
parents:
1167
diff
changeset
|
482 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
|
483 return FALSE; |
0 | 484 parser->cur_type = ARG_PARSE_ATOM; |
485 break; | |
486 } | |
487 | |
488 parser->cur_pos++; | |
489 } | |
490 | |
491 i_assert(data_size > 0); | |
492 | |
493 switch (parser->cur_type) { | |
494 case ARG_PARSE_ATOM: | |
495 if (!imap_parser_read_atom(parser, data, data_size)) | |
496 return FALSE; | |
497 break; | |
498 case ARG_PARSE_STRING: | |
499 if (!imap_parser_read_string(parser, data, data_size)) | |
500 return FALSE; | |
501 break; | |
502 case ARG_PARSE_LITERAL: | |
503 if (!imap_parser_read_literal(parser, data, data_size)) | |
504 return FALSE; | |
505 | |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
735
diff
changeset
|
506 /* pass through to parsing data. since input->skip was |
0 | 507 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
|
508 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
|
509 |
85ab93a7693b
ImapArgList changed from linked list to array. easier to handle that way.
Timo Sirainen <tss@iki.fi>
parents:
424
diff
changeset
|
510 /* fall through */ |
0 | 511 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
|
512 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
|
513 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
|
514 return FALSE; |
0 | 515 break; |
516 default: | |
546
e1254b838e0b
Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents:
504
diff
changeset
|
517 i_unreached(); |
0 | 518 } |
519 | |
717
3f817df5eba4
Input parsing was a bit broken in some conditions. Mostly visible with
Timo Sirainen <tss@iki.fi>
parents:
546
diff
changeset
|
520 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
|
521 return TRUE; |
0 | 522 } |
523 | |
1010
3c30228ae095
Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents:
941
diff
changeset
|
524 /* ARG_PARSE_NONE checks that last argument isn't only partially parsed. */ |
720 | 525 #define IS_UNFINISHED(parser) \ |
526 ((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
|
527 (parser)->cur_list != &parser->root_list) |
719 | 528 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
529 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
|
530 const struct imap_arg **args_r) |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
531 { |
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
|
532 struct imap_arg *arg; |
9f869a7a3d73
Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents:
5835
diff
changeset
|
533 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
534 parser->line_size += parser->cur_pos; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
535 i_stream_skip(parser->input, parser->cur_pos); |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
536 parser->cur_pos = 0; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
537 |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
538 if (parser->list_arg != NULL && !parser->literal_size_return) { |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
539 parser->error = "Missing ')'"; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
540 *args_r = NULL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
541 return -1; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
542 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
543 |
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 /* 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
|
545 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
|
546 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
|
547 arg->type = IMAP_ARG_NIL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
548 } |
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
|
549 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
|
550 arg->type = IMAP_ARG_EOL; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
551 |
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
|
552 *args_r = array_get(&parser->root_list, &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
|
553 return count; |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
554 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
555 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
556 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
|
557 enum imap_parser_flags flags, |
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
558 const struct imap_arg **args_r) |
0 | 559 { |
560 parser->flags = flags; | |
561 | |
6739
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
562 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
|
563 /* 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
|
564 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
|
565 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
|
566 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
|
567 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
568 |
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
|
569 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
|
570 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
|
571 if (!imap_parser_read_arg(parser)) |
0 | 572 break; |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
573 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1311
diff
changeset
|
574 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
|
575 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
|
576 break; |
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
577 } |
0 | 578 } |
579 | |
768
8b3518bb327e
Limited max. command argument elements to 128. Added more verbose error
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
580 if (parser->error != NULL) { |
0 | 581 /* 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
|
582 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
|
583 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
|
584 parser->cur_pos = 0; |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
585 *args_r = NULL; |
0 | 586 return -1; |
735
ce93054db96b
All SEARCH arguments still may not have been parsed.
Timo Sirainen <tss@iki.fi>
parents:
720
diff
changeset
|
587 } 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
|
588 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
|
589 parser->eol || parser->literal_size_return) { |
1010
3c30228ae095
Missing ')' wasn't reported correctly.
Timo Sirainen <tss@iki.fi>
parents:
941
diff
changeset
|
590 /* all arguments read / end of line. */ |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
591 return finish_line(parser, count, args_r); |
0 | 592 } else { |
593 /* need more data */ | |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
594 *args_r = NULL; |
0 | 595 return -2; |
596 } | |
597 } | |
598 | |
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 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
|
600 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
|
601 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
|
602 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
603 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
|
604 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
|
605 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
|
606 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
607 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
|
608 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
|
609 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
|
610 count--; |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
611 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
612 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
|
613 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
|
614 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
|
615 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
|
616 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
617 /* 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
|
618 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
|
619 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
|
620 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
|
621 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
|
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 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
624 *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
|
625 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
|
626 } |
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 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
|
629 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
630 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
|
631 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
|
632 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
633 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
|
634 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
|
635 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
|
636 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
637 *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
|
638 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
|
639 } |
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 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
|
642 { |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
643 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
|
644 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
|
645 |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
646 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
|
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 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
|
649 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
|
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 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
|
652 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
|
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 /* 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
|
655 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
|
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 /* 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
|
658 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
|
659 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
|
660 } |
d145669ed45a
Added imap_parser_get_literal_size() and imap_parser_read_last_literal() to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
661 |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
662 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
|
663 enum imap_parser_flags flags, |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
664 const struct imap_arg **args_r) |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
665 { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
666 const unsigned char *data; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
667 size_t data_size; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
668 int ret; |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
669 |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
670 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
|
671 if (ret == -2) { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
672 /* we should have noticed end of everything except atom */ |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
673 if (parser->cur_type == ARG_PARSE_ATOM) { |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
674 data = i_stream_get_data(parser->input, &data_size); |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
675 imap_parser_save_arg(parser, data, data_size); |
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 } |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
678 return finish_line(parser, count, args_r); |
1661
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
679 } |
566fb4bf7066
Fixes for parsing BODYSTRUCTURE
Timo Sirainen <tss@iki.fi>
parents:
1591
diff
changeset
|
680 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
681 const char *imap_parser_read_word(struct imap_parser *parser) |
0 | 682 { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
683 const unsigned char *data; |
184 | 684 size_t i, data_size; |
0 | 685 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
686 data = i_stream_get_data(parser->input, &data_size); |
0 | 687 |
688 for (i = 0; i < data_size; i++) { | |
689 if (data[i] == ' ' || data[i] == '\r' || data[i] == '\n') | |
690 break; | |
691 } | |
692 | |
693 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
|
694 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
|
695 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
|
696 i_stream_skip(parser->input, data_size); |
0 | 697 return p_strndup(parser->pool, data, i); |
698 } else { | |
699 return NULL; | |
700 } | |
701 } | |
702 | |
5835
d59ed6a31b66
Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents:
5024
diff
changeset
|
703 const char *imap_arg_string(const struct imap_arg *arg) |
0 | 704 { |
705 switch (arg->type) { | |
706 case IMAP_ARG_NIL: | |
707 return ""; | |
708 | |
709 case IMAP_ARG_ATOM: | |
710 case IMAP_ARG_STRING: | |
5837
5cd5f65a8dad
imap_arg_string() should handle IMAP_ARG_LITERAL also.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
711 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
|
712 return arg->_data.str; |
0 | 713 |
714 default: | |
715 return NULL; | |
716 } | |
717 } | |
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
|
718 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
719 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
|
720 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
721 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
|
722 #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
|
723 return NULL; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
724 #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
|
725 } |
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
|
726 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
727 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
|
728 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
729 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
|
730 #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
|
731 return 0; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
732 #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
|
733 } |
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 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
735 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
|
736 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
737 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
|
738 #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
|
739 return NULL; |
4823
414c0c45040e
Added some noreturn attributes and fixed warnings caused by them.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
740 #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
|
741 } |