Coverage Report

Created: 2026-07-24 07:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/pdf/pdf_int.c
Line
Count
Source
1
/* Copyright (C) 2018-2026 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
/* The PDF interpreter written in C */
17
18
#include "pdf_int.h"
19
#include "pdf_file.h"
20
#include "strmio.h"
21
#include "stream.h"
22
#include "pdf_misc.h"
23
#include "pdf_path.h"
24
#include "pdf_colour.h"
25
#include "pdf_image.h"
26
#include "pdf_shading.h"
27
#include "pdf_font.h"
28
#include "pdf_font_types.h"
29
#include "pdf_cmap.h"
30
#include "pdf_text.h"
31
#include "pdf_gstate.h"
32
#include "pdf_stack.h"
33
#include "pdf_xref.h"
34
#include "pdf_dict.h"
35
#include "pdf_array.h"
36
#include "pdf_trans.h"
37
#include "pdf_optcontent.h"
38
#include "pdf_sec.h"
39
#include <stdlib.h>
40
41
#include "gsstate.h"    /* for gs_gstate_free */
42
43
/* we use -ve returns for error, 0 for success and +ve for 'take an action' */
44
/* Defining tis return so we do not need to define a new error */
45
77.1M
#define REPAIRED_KEYWORD 1
46
47
/***********************************************************************************/
48
/* 'token' reading functions. Tokens in this sense are PDF logical objects and the */
49
/* related keywords. So that's numbers, booleans, names, strings, dictionaries,    */
50
/* arrays, the  null object and indirect references. The keywords are obj/endobj   */
51
/* stream/endstream, xref, startxref and trailer.                                  */
52
53
/***********************************************************************************/
54
/* Some simple functions to find white space, delimiters and hex bytes             */
55
static bool iswhite(char c)
56
4.85G
{
57
4.85G
    if (c == 0x00 || c == 0x09 || c == 0x0a || c == 0x0c || c == 0x0d || c == 0x20)
58
755M
        return true;
59
4.09G
    else
60
4.09G
        return false;
61
4.85G
}
62
63
static bool isdelimiter(char c)
64
2.80G
{
65
2.80G
    if (c == '/' || c == '(' || c == ')' || c == '[' || c == ']' || c == '<' || c == '>' || c == '{' || c == '}' || c == '%')
66
66.5M
        return true;
67
2.73G
    else
68
2.73G
        return false;
69
2.80G
}
70
71
/* The 'read' functions all return the newly created object on the context's stack
72
 * which means these objects are created with a reference count of 0, and only when
73
 * pushed onto the stack does the reference count become 1, indicating the stack is
74
 * the only reference.
75
 */
76
int pdfi_skip_white(pdf_context *ctx, pdf_c_stream *s)
77
1.10G
{
78
1.10G
    int c;
79
80
1.32G
    do {
81
1.32G
        c = pdfi_read_byte(ctx, s);
82
1.32G
        if (c < 0)
83
347k
            return 0;
84
1.32G
    } while (iswhite(c));
85
86
1.10G
    pdfi_unread_byte(ctx, s, (byte)c);
87
1.10G
    return 0;
88
1.10G
}
89
90
int pdfi_skip_eol(pdf_context *ctx, pdf_c_stream *s)
91
2.68M
{
92
2.68M
    int c;
93
94
2.86M
    do {
95
2.86M
        c = pdfi_read_byte(ctx, s);
96
2.86M
        if (c < 0 || c == 0x0a)
97
1.21M
            return 0;
98
2.86M
    } while (c != 0x0d);
99
1.47M
    c = pdfi_read_byte(ctx, s);
100
1.47M
    if (c == 0x0a)
101
1.46M
        return 0;
102
7.94k
    if (c >= 0)
103
7.85k
        pdfi_unread_byte(ctx, s, (byte)c);
104
7.94k
    pdfi_set_warning(ctx, 0, NULL, W_PDF_STREAM_BAD_KEYWORD, "pdfi_skip_eol", NULL);
105
7.94k
    return 0;
106
1.47M
}
107
108
/* Fast(ish) but inaccurate strtof, with Adobe overflow handling,
109
 * lifted from MuPDF. */
110
static float acrobat_compatible_atof(char *s)
111
129M
{
112
129M
    int neg = 0;
113
129M
    int i = 0;
114
115
137M
    while (*s == '-') {
116
8.05M
        neg = 1;
117
8.05M
        ++s;
118
8.05M
    }
119
129M
    while (*s == '+') {
120
7
        ++s;
121
7
    }
122
123
457M
    while (*s >= '0' && *s <= '9') {
124
        /* We deliberately ignore overflow here.
125
         * Tests show that Acrobat handles * overflows in exactly the same way we do:
126
         * 123450000000000000000678 is read as 678.
127
         */
128
327M
        i = i * 10 + (*s - '0');
129
327M
        ++s;
130
327M
    }
131
132
129M
    if (*s == '.') {
133
129M
        float MAX = (MAX_FLOAT-9)/10;
134
129M
        float v = (float)i;
135
129M
        float n = 0;
136
129M
        float d = 1;
137
129M
        ++s;
138
        /* Bug 705211: Ensure that we don't overflow n here - just ignore any
139
         * trailing digits after this. This will be plenty accurate enough. */
140
550M
        while (*s >= '0' && *s <= '9' && n <= MAX) {
141
421M
            n = 10 * n + (*s - '0');
142
421M
            d = 10 * d;
143
421M
            ++s;
144
421M
        }
145
129M
        v += n / d;
146
129M
        return neg ? -v : v;
147
129M
    } else {
148
161k
        return (float)(neg ? -i : i);
149
161k
    }
150
129M
}
151
152
int pdfi_read_bare_int(pdf_context *ctx, pdf_c_stream *s, int *parsed_int)
153
105M
{
154
105M
    int index = 0;
155
105M
    int int_val = 0;
156
105M
    int negative = 0;
157
105M
    int tenth_max_int = max_int / 10, tenth_max_uint = max_uint / 10;
158
105M
    bool overflowed = false;
159
105M
    int code = 0;
160
161
105M
restart:
162
105M
    pdfi_skip_white(ctx, s);
163
164
450M
    do {
165
450M
        int c = pdfi_read_byte(ctx, s);
166
450M
        if (c == EOFC)
167
4.27k
            break;
168
169
450M
        if (c < 0)
170
6.30k
            return_error(gs_error_ioerror);
171
172
450M
        if (iswhite(c)) {
173
105M
            break;
174
345M
        } else if (c == '%' && index == 0) {
175
47.1k
            pdfi_skip_comment(ctx, s);
176
47.1k
            goto restart;
177
345M
        } else if (isdelimiter(c)) {
178
14.0k
            pdfi_unread_byte(ctx, s, (byte)c);
179
14.0k
            break;
180
14.0k
        }
181
182
345M
        if (c >= '0' && c <= '9') {
183
345M
            if (!overflowed) {
184
345M
                if ((negative && int_val <= tenth_max_int) || (!negative && int_val <= tenth_max_uint))
185
345M
                    int_val = int_val*10 + c - '0';
186
1.85k
                else {
187
1.85k
                    if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_NUMBEROVERFLOW, "pdfi_read_num", NULL)) < 0) {
188
0
                        return code;
189
0
                    }
190
1.85k
                    overflowed = true;
191
1.85k
                }
192
345M
            }
193
345M
        } else if (c == '.') {
194
2.54k
            goto error;
195
184k
        } else if (c == 'e' || c == 'E') {
196
2.50k
            pdfi_log_info(ctx, "pdfi_read_bare_int", (char *)"Invalid number format: scientific notation\n");
197
2.50k
            goto error;
198
182k
        } else if (c == '-') {
199
            /* Any - sign not at the start of the string indicates a malformed number. */
200
751
            if (index != 0 || negative) {
201
138
                pdfi_log_info(ctx, "pdfi_read_bare_int", (char *)"Invalid number format: sign not at the start\n");
202
138
                goto error;
203
138
            }
204
613
            negative = 1;
205
181k
        } else if (c == '+') {
206
112k
            if (index == 0) {
207
                /* Just drop the + it's pointless, and it'll get in the way
208
                 * of our negation handling for floats. */
209
111k
                continue;
210
111k
            } else {
211
147
                pdfi_log_info(ctx, "pdfi_read_bare_int", (char *)"Invalid number format: sign not at the start\n");
212
147
                goto error;
213
147
            }
214
112k
        } else {
215
69.2k
            if (index > 0) {
216
6.78k
                pdfi_log_info(ctx, "pdfi_read_bare_int", (char *)"Invalid number format: Ignoring missing white space while parsing number\n");
217
6.78k
                goto error;
218
6.78k
            }
219
62.4k
            pdfi_unread_byte(ctx, s, (byte)c);
220
62.4k
            goto error;
221
69.2k
        }
222
345M
        if (++index > 255)
223
210
            goto error;
224
345M
    } while(1);
225
226
105M
    *parsed_int = negative ? -int_val : int_val;
227
105M
    if (ctx->args.pdfdebug)
228
0
        outprintf(ctx->memory, " %d", *parsed_int);
229
105M
    return (index > 0);
230
231
74.7k
error:
232
74.7k
    *parsed_int = 0;
233
74.7k
    return_error(gs_error_syntaxerror);
234
105M
}
235
236
static int pdfi_read_num(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
237
299M
{
238
299M
    byte Buffer[256];
239
299M
    unsigned short index = 0;
240
299M
    bool real = false;
241
299M
    bool has_decimal_point = false;
242
299M
    bool has_exponent = false;
243
299M
    unsigned short exponent_index = 0;
244
299M
    pdf_num *num;
245
299M
    int code = 0, malformed = false, doubleneg = false, recovered = false, negative = false, overflowed = false;
246
299M
    unsigned int int_val = 0;
247
299M
    int tenth_max_int = max_int / 10, tenth_max_uint = max_uint / 10;
248
249
299M
    pdfi_skip_white(ctx, s);
250
251
1.66G
    do {
252
1.66G
        int c = pdfi_read_byte(ctx, s);
253
1.66G
        if (c == EOFC) {
254
11.9k
            Buffer[index] = 0x00;
255
11.9k
            break;
256
11.9k
        }
257
258
1.66G
        if (c < 0)
259
3.89k
            return_error(gs_error_ioerror);
260
261
1.66G
        if (iswhite(c)) {
262
266M
            Buffer[index] = 0x00;
263
266M
            break;
264
1.39G
        } else if (isdelimiter(c)) {
265
27.5M
            pdfi_unread_byte(ctx, s, (byte)c);
266
27.5M
            Buffer[index] = 0x00;
267
27.5M
            break;
268
27.5M
        }
269
1.37G
        Buffer[index] = (byte)c;
270
271
1.37G
        if (c >= '0' && c <= '9') {
272
1.21G
            if  (!(malformed && recovered) && !overflowed && !real) {
273
746M
                if ((negative && int_val <= tenth_max_int) || (!negative && int_val <= tenth_max_uint))
274
745M
                    int_val = int_val*10 + c - '0';
275
1.32M
                else {
276
1.32M
                    if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_NUMBEROVERFLOW, "pdfi_read_num", NULL)) < 0) {
277
0
                        return code;
278
0
                    }
279
1.32M
                    overflowed = true;
280
1.32M
                }
281
746M
            }
282
1.21G
        } else if (c == '.') {
283
134M
            if (has_decimal_point == true) {
284
3.22M
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", NULL)) < 0) {
285
0
                    return code;
286
0
                }
287
3.22M
                malformed = true;
288
131M
            } else {
289
131M
                has_decimal_point = true;
290
131M
                real = true;
291
131M
            }
292
134M
        } else if (c == 'e' || c == 'E') {
293
            /* TODO: technically scientific notation isn't in PDF spec,
294
             * but gs seems to accept it, so we should also?
295
             */
296
460k
            if (has_exponent == true) {
297
34.7k
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", NULL)) < 0) {
298
0
                    return code;
299
0
                }
300
34.7k
                malformed = true;
301
425k
            } else {
302
425k
                pdfi_set_warning(ctx, 0, NULL, W_PDF_NUM_EXPONENT, "pdfi_read_num", NULL);
303
425k
                has_exponent = true;
304
425k
                exponent_index = index;
305
425k
                real = true;
306
425k
            }
307
24.4M
        } else if (c == '-') {
308
            /* Any - sign not at the start of the string, or just after an exponent
309
             * indicates a malformed number. */
310
18.5M
            if (!(index == 0 || (has_exponent && index == exponent_index+1))) {
311
4.40M
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", NULL)) < 0) {
312
0
                    return code;
313
0
                }
314
4.40M
                if (Buffer[index - 1] != '-') {
315
                    /* We are parsing a number line 123-56. We should continue parsing, but
316
                     * ignore anything from the second -. */
317
770k
                    malformed = true;
318
770k
                    Buffer[index] = 0;
319
770k
                    recovered = true;
320
770k
                }
321
4.40M
            }
322
18.5M
            if (!has_exponent && !(malformed && recovered)) {
323
17.8M
                doubleneg = negative;
324
17.8M
                negative = 1;
325
17.8M
            }
326
18.5M
        } else if (c == '+') {
327
137k
            if (index == 0 || (has_exponent && index == exponent_index+1)) {
328
                /* Just drop the + it's pointless, and it'll get in the way
329
                 * of our negation handling for floats. */
330
127k
                index--;
331
127k
            } else {
332
10.3k
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", NULL)) < 0) {
333
0
                    return code;
334
0
                }
335
10.3k
                if (Buffer[index - 1] != '-') {
336
                    /* We are parsing a number line 123-56. We should continue parsing, but
337
                     * ignore anything from the second -. */
338
10.0k
                    malformed = true;
339
10.0k
                    Buffer[index] = 0;
340
10.0k
                    recovered = true;
341
10.0k
                }
342
10.3k
            }
343
5.78M
        } else {
344
5.78M
            if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MISSINGWHITESPACE, "pdfi_read_num", NULL)) < 0) {
345
0
                return code;
346
0
            }
347
5.78M
            pdfi_unread_byte(ctx, s, (byte)c);
348
5.78M
            Buffer[index] = 0x00;
349
5.78M
            break;
350
5.78M
        }
351
1.36G
        if (++index > 255)
352
44.8k
            return_error(gs_error_syntaxerror);
353
1.36G
    } while(1);
354
355
299M
    if (real && (!malformed || (malformed && recovered)))
356
130M
        code = pdfi_object_alloc(ctx, PDF_REAL, 0, (pdf_obj **)&num);
357
169M
    else
358
169M
        code = pdfi_object_alloc(ctx, PDF_INT, 0, (pdf_obj **)&num);
359
299M
    if (code < 0)
360
0
        return code;
361
362
299M
    if ((malformed && !recovered) || (!real && doubleneg)) {
363
1.63M
        if ((code = pdfi_set_warning_var(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", "Treating malformed number %s as 0", Buffer)) < 0) {
364
0
            goto exit;
365
0
        }
366
1.63M
        num->value.i = 0;
367
298M
    } else if (has_exponent) {
368
398k
        float f, exp;
369
398k
        char *p = strstr((const char *)Buffer, "e");
370
371
398k
        if (p == NULL)
372
37.5k
            p = strstr((const char *)Buffer, "E");
373
374
398k
        if (p == NULL) {
375
2.92k
            if ((code = pdfi_set_warning_var(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", "Treating malformed float %s as 0", Buffer)) < 0) {
376
0
                goto exit;
377
0
            }
378
2.92k
            num->value.d = 0;
379
396k
        } else {
380
396k
            p++;
381
382
396k
            if (sscanf((char *)p, "%g", &exp) != 1 || exp > 38) {
383
366k
                if ((code = pdfi_set_warning_var(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", "Treating malformed float %s as 0", Buffer)) < 0) {
384
0
                    goto exit;
385
0
                }
386
366k
                num->value.d = 0;
387
366k
            } else {
388
29.5k
                if (sscanf((char *)Buffer, "%g", &f) == 1) {
389
29.0k
                    num->value.d = f;
390
29.0k
                } else {
391
574
                    if ((code = pdfi_set_warning_var(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MALFORMEDNUMBER, "pdfi_read_num", "Treating malformed float %s as 0", Buffer)) < 0) {
392
0
                        goto exit;
393
0
                    }
394
574
                    num->value.d = 0;
395
574
                }
396
29.5k
            }
397
396k
        }
398
297M
    } else if (real) {
399
129M
        num->value.d = acrobat_compatible_atof((char *)Buffer);
400
168M
    } else {
401
        /* The doubleneg case is taken care of above. */
402
168M
        num->value.i = negative ? (int64_t)int_val * -1 : (int64_t)int_val;
403
168M
    }
404
299M
    if (ctx->args.pdfdebug) {
405
0
        if (real)
406
0
            outprintf(ctx->memory, " %f", num->value.d);
407
0
        else
408
0
            outprintf(ctx->memory, " %"PRIi64, num->value.i);
409
0
    }
410
299M
    num->indirect_num = indirect_num;
411
299M
    num->indirect_gen = indirect_gen;
412
413
299M
    code = pdfi_push(ctx, (pdf_obj *)num);
414
415
299M
exit:
416
299M
    if (code < 0)
417
947
        pdfi_free_object((pdf_obj *)num);
418
419
299M
    return code;
420
299M
}
421
422
static int pdfi_read_name(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
423
85.3M
{
424
85.3M
    char *Buffer, *NewBuf = NULL;
425
85.3M
    unsigned short index = 0;
426
85.3M
    short bytes = 0;
427
85.3M
    uint32_t size = 256;
428
85.3M
    pdf_name *name = NULL;
429
85.3M
    int code;
430
431
85.3M
    Buffer = (char *)gs_alloc_bytes(ctx->memory, size, "pdfi_read_name");
432
85.3M
    if (Buffer == NULL)
433
0
        return_error(gs_error_VMerror);
434
435
620M
    do {
436
620M
        int c = pdfi_read_byte(ctx, s);
437
620M
        if (c < 0)
438
11.0k
            break;
439
440
620M
        if (iswhite((char)c)) {
441
56.0M
            Buffer[index] = 0x00;
442
56.0M
            break;
443
564M
        } else if (isdelimiter((char)c)) {
444
29.3M
            pdfi_unread_byte(ctx, s, (char)c);
445
29.3M
            Buffer[index] = 0x00;
446
29.3M
            break;
447
29.3M
        }
448
535M
        Buffer[index] = (char)c;
449
450
        /* Check for and convert escaped name characters */
451
535M
        if (c == '#') {
452
238k
            byte NumBuf[2];
453
454
238k
            bytes = pdfi_read_bytes(ctx, (byte *)&NumBuf, 1, 2, s);
455
238k
            if (bytes < 2 || (!ishex(NumBuf[0]) || !ishex(NumBuf[1]))) {
456
101k
                pdfi_set_warning(ctx, 0, NULL, W_PDF_BAD_NAME_ESCAPE, "pdfi_read_name", NULL);
457
101k
                pdfi_unread(ctx, s, (byte *)NumBuf, bytes);
458
                /* This leaves the name buffer with a # in it, rather than anything sane! */
459
101k
            }
460
136k
            else
461
136k
                Buffer[index] = (fromhex(NumBuf[0]) << 4) + fromhex(NumBuf[1]);
462
238k
        }
463
464
        /* If we ran out of memory, increase the buffer size */
465
535M
        if (index++ >= size - 1) {
466
46.1k
            NewBuf = (char *)gs_alloc_bytes(ctx->memory, (size_t)size + 256, "pdfi_read_name");
467
46.1k
            if (NewBuf == NULL) {
468
0
                gs_free_object(ctx->memory, Buffer, "pdfi_read_name error");
469
0
                return_error(gs_error_VMerror);
470
0
            }
471
46.1k
            memcpy(NewBuf, Buffer, size);
472
46.1k
            gs_free_object(ctx->memory, Buffer, "pdfi_read_name");
473
46.1k
            Buffer = NewBuf;
474
46.1k
            size += 256;
475
46.1k
        }
476
535M
    } while(1);
477
478
85.3M
    code = pdfi_object_alloc(ctx, PDF_NAME, index, (pdf_obj **)&name);
479
85.3M
    if (code < 0) {
480
0
        gs_free_object(ctx->memory, Buffer, "pdfi_read_name error");
481
0
        return code;
482
0
    }
483
85.3M
    memcpy(name->data, Buffer, index);
484
85.3M
    name->indirect_num = indirect_num;
485
85.3M
    name->indirect_gen = indirect_gen;
486
487
85.3M
    if (ctx->args.pdfdebug)
488
0
        outprintf(ctx->memory, " /%s", Buffer);
489
490
85.3M
    gs_free_object(ctx->memory, Buffer, "pdfi_read_name");
491
492
85.3M
    code = pdfi_push(ctx, (pdf_obj *)name);
493
494
85.3M
    if (code < 0)
495
0
        pdfi_free_object((pdf_obj *)name);
496
497
85.3M
    return code;
498
85.3M
}
499
500
static int pdfi_read_hexstring(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
501
4.17M
{
502
4.17M
    char *Buffer, *NewBuf = NULL;
503
4.17M
    unsigned short index = 0;
504
4.17M
    uint32_t size = 256;
505
4.17M
    pdf_string *string = NULL;
506
4.17M
    int code, hex0, hex1;
507
508
4.17M
    Buffer = (char *)gs_alloc_bytes(ctx->memory, size, "pdfi_read_hexstring");
509
4.17M
    if (Buffer == NULL)
510
0
        return_error(gs_error_VMerror);
511
512
4.17M
    if (ctx->args.pdfdebug)
513
0
        outprintf(ctx->memory, " <");
514
515
146M
    do {
516
146M
        do {
517
146M
            hex0 = pdfi_read_byte(ctx, s);
518
146M
            if (hex0 < 0)
519
808
                break;
520
146M
        } while(iswhite(hex0));
521
146M
        if (hex0 < 0)
522
808
            break;
523
524
146M
        if (hex0 == '>')
525
3.85M
            break;
526
527
142M
        if (ctx->args.pdfdebug)
528
0
            outprintf(ctx->memory, "%c", (char)hex0);
529
530
142M
        do {
531
142M
            hex1 = pdfi_read_byte(ctx, s);
532
142M
            if (hex1 < 0)
533
794
                break;
534
142M
        } while(iswhite(hex1));
535
142M
        if (hex1 < 0)
536
794
            break;
537
538
142M
        if (hex1 == '>') {
539
            /* PDF Reference 1.7 page 56:
540
             * "If the final digit of a hexadecimal string is missing that is,
541
             * if there is an odd number of digits the final digit is assumed to be 0."
542
             */
543
42.4k
            hex1 = 0x30;
544
42.4k
            if (!ishex(hex0) || !ishex(hex1)) {
545
2.05k
                code = gs_note_error(gs_error_syntaxerror);
546
2.05k
                goto exit;
547
2.05k
            }
548
40.3k
            Buffer[index] = (fromhex(hex0) << 4) + fromhex(hex1);
549
40.3k
            if (ctx->args.pdfdebug)
550
0
                outprintf(ctx->memory, "%c", hex1);
551
40.3k
            break;
552
42.4k
        }
553
554
142M
        if (!ishex(hex0) || !ishex(hex1)) {
555
280k
            code = gs_note_error(gs_error_syntaxerror);
556
280k
            goto exit;
557
280k
        }
558
559
141M
        if (ctx->args.pdfdebug)
560
0
            outprintf(ctx->memory, "%c", (char)hex1);
561
562
141M
        Buffer[index] = (fromhex(hex0) << 4) + fromhex(hex1);
563
564
141M
        if (index++ >= size - 1) {
565
482k
            NewBuf = (char *)gs_alloc_bytes(ctx->memory, (size_t)size + 256, "pdfi_read_hexstring");
566
482k
            if (NewBuf == NULL) {
567
0
                code = gs_note_error(gs_error_VMerror);
568
0
                goto exit;
569
0
            }
570
482k
            memcpy(NewBuf, Buffer, size);
571
482k
            gs_free_object(ctx->memory, Buffer, "pdfi_read_hexstring");
572
482k
            Buffer = NewBuf;
573
482k
            size += 256;
574
482k
        }
575
141M
    } while(1);
576
577
3.89M
    if (ctx->args.pdfdebug)
578
0
        outprintf(ctx->memory, ">");
579
580
3.89M
    code = pdfi_object_alloc(ctx, PDF_STRING, index, (pdf_obj **)&string);
581
3.89M
    if (code < 0)
582
0
        goto exit;
583
3.89M
    memcpy(string->data, Buffer, index);
584
3.89M
    string->indirect_num = indirect_num;
585
3.89M
    string->indirect_gen = indirect_gen;
586
587
3.89M
    if (ctx->encryption.is_encrypted && ctx->encryption.decrypt_strings) {
588
2.28k
        code = pdfi_decrypt_string(ctx, string);
589
2.28k
        if (code < 0)
590
0
            return code;
591
2.28k
    }
592
593
3.89M
    code = pdfi_push(ctx, (pdf_obj *)string);
594
3.89M
    if (code < 0)
595
0
        pdfi_free_object((pdf_obj *)string);
596
597
4.17M
 exit:
598
4.17M
    gs_free_object(ctx->memory, Buffer, "pdfi_read_hexstring");
599
4.17M
    return code;
600
3.89M
}
601
602
static int pdfi_read_string(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
603
15.4M
{
604
15.4M
    char *Buffer, *NewBuf = NULL;
605
15.4M
    unsigned short index = 0;
606
15.4M
    uint32_t size = 256;
607
15.4M
    pdf_string *string = NULL;
608
15.4M
    int c, code, nesting = 0;
609
15.4M
    bool escape = false, skip_lf = false, exit_loop = false;
610
611
15.4M
    Buffer = (char *)gs_alloc_bytes(ctx->memory, size, "pdfi_read_string");
612
15.4M
    if (Buffer == NULL)
613
0
        return_error(gs_error_VMerror);
614
615
751M
    do {
616
751M
        if (index >= size - 1) {
617
1.66M
            NewBuf = (char *)gs_alloc_bytes(ctx->memory, (size_t)size + 256, "pdfi_read_string");
618
1.66M
            if (NewBuf == NULL) {
619
0
                gs_free_object(ctx->memory, Buffer, "pdfi_read_string error");
620
0
                return_error(gs_error_VMerror);
621
0
            }
622
1.66M
            memcpy(NewBuf, Buffer, size);
623
1.66M
            gs_free_object(ctx->memory, Buffer, "pdfi_read_string");
624
1.66M
            Buffer = NewBuf;
625
1.66M
            size += 256;
626
1.66M
        }
627
628
751M
        c = pdfi_read_byte(ctx, s);
629
630
751M
        if (c < 0) {
631
22.1k
            if (nesting > 0 && (code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_UNESCAPEDSTRING, "pdfi_read_string", NULL)) < 0) {
632
0
                gs_free_object(ctx->memory, Buffer, "pdfi_read_string error");
633
0
                return code;
634
0
            }
635
22.1k
            Buffer[index] = 0x00;
636
22.1k
            break;
637
22.1k
        }
638
639
751M
        if (skip_lf) {
640
3.27M
            skip_lf = false;
641
3.27M
            if (c == 0x0a)
642
1.08M
                continue;
643
3.27M
        }
644
750M
        Buffer[index] = (char)c;
645
646
750M
        if (escape) {
647
3.30M
            escape = false;
648
3.30M
            switch (Buffer[index]) {
649
56.1k
                case 0x0d:
650
56.1k
                    skip_lf = true;
651
67.9k
                case 0x0a:
652
67.9k
                    continue;
653
76.1k
                case 'n':
654
76.1k
                    Buffer[index] = 0x0a;
655
76.1k
                    break;
656
77.7k
                case 'r':
657
77.7k
                    Buffer[index] = 0x0d;
658
77.7k
                    break;
659
18.5k
                case 't':
660
18.5k
                    Buffer[index] = 0x09;
661
18.5k
                    break;
662
22.0k
                case 'b':
663
22.0k
                    Buffer[index] = 0x08;
664
22.0k
                    break;
665
23.1k
                case 'f':
666
23.1k
                    Buffer[index] = 0x0c;
667
23.1k
                    break;
668
171k
                case '(':
669
345k
                case ')':
670
430k
                case '\\':
671
430k
                    break;
672
625k
                case '0':
673
643k
                case '1':
674
1.01M
                case '2':
675
1.29M
                case '3':
676
1.30M
                case '4':
677
1.31M
                case '5':
678
1.32M
                case '6':
679
1.33M
                case '7':
680
1.33M
                {
681
                    /* Octal chars can be 1, 2 or 3 chars in length, terminated either
682
                     * by being 3 chars long, EOFC, or a non-octal char. We do not allow
683
                     * line breaks in the middle of octal chars. */
684
1.33M
                    int c1 = pdfi_read_byte(ctx, s);
685
1.33M
                    c -= '0';
686
1.33M
                    if (c1 < 0) {
687
                        /* Nothing to do, or unread */
688
1.33M
                    } else if (c1 < '0' || c1 > '7') {
689
80.9k
                        pdfi_unread_byte(ctx, s, (char)c1);
690
1.25M
                    } else {
691
1.25M
                        c = c*8 + c1 - '0';
692
1.25M
                        c1 = pdfi_read_byte(ctx, s);
693
1.25M
                        if (c1 < 0) {
694
                            /* Nothing to do, or unread */
695
1.25M
                        } else if (c1 < '0' || c1 > '7') {
696
34.1k
                            pdfi_unread_byte(ctx, s, (char)c1);
697
34.1k
                        } else
698
1.22M
                            c = c*8 + c1 - '0';
699
1.25M
                    }
700
1.33M
                    Buffer[index] = c;
701
1.33M
                    break;
702
1.32M
                }
703
1.25M
                default:
704
                    /* PDF Reference, literal strings, if the character following a
705
                     * escape \ character is not recognised, then it is ignored.
706
                     */
707
1.25M
                    escape = false;
708
1.25M
                    index++;
709
1.25M
                    continue;
710
3.30M
            }
711
747M
        } else {
712
747M
            switch(Buffer[index]) {
713
3.22M
                case 0x0d:
714
3.22M
                    Buffer[index] = 0x0a;
715
3.22M
                    skip_lf = true;
716
3.22M
                    break;
717
18.2M
                case ')':
718
18.2M
                    if (nesting == 0) {
719
15.3M
                        Buffer[index] = 0x00;
720
15.3M
                        exit_loop = true;
721
15.3M
                    } else
722
2.81M
                        nesting--;
723
18.2M
                    break;
724
3.30M
                case '\\':
725
3.30M
                    escape = true;
726
3.30M
                    continue;
727
3.39M
                case '(':
728
3.39M
                    nesting++;
729
3.39M
                    break;
730
719M
                default:
731
719M
                    break;
732
747M
            }
733
747M
        }
734
735
745M
        if (exit_loop)
736
15.3M
            break;
737
738
730M
        index++;
739
736M
    } while(1);
740
741
15.4M
    code = pdfi_object_alloc(ctx, PDF_STRING, index, (pdf_obj **)&string);
742
15.4M
    if (code < 0) {
743
0
        gs_free_object(ctx->memory, Buffer, "pdfi_read_name error");
744
0
        return code;
745
0
    }
746
15.4M
    memcpy(string->data, Buffer, index);
747
15.4M
    string->indirect_num = indirect_num;
748
15.4M
    string->indirect_gen = indirect_gen;
749
750
15.4M
    gs_free_object(ctx->memory, Buffer, "pdfi_read_string");
751
752
15.4M
    if (ctx->encryption.is_encrypted && ctx->encryption.decrypt_strings) {
753
13.1k
        code = pdfi_decrypt_string(ctx, string);
754
13.1k
        if (code < 0)
755
0
            return code;
756
13.1k
    }
757
758
15.4M
    if (ctx->args.pdfdebug) {
759
0
        int i;
760
0
        outprintf(ctx->memory, " (");
761
0
        for (i=0;i<string->length;i++)
762
0
            outprintf(ctx->memory, "%c", string->data[i]);
763
0
        outprintf(ctx->memory, ")");
764
0
    }
765
766
15.4M
    code = pdfi_push(ctx, (pdf_obj *)string);
767
15.4M
    if (code < 0) {
768
0
        pdfi_free_object((pdf_obj *)string);
769
0
        pdfi_set_error(ctx, code, NULL, 0, "pdfi_read_string", NULL);
770
0
    }
771
772
15.4M
    return code;
773
15.4M
}
774
775
int pdfi_read_dict(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
776
9.13k
{
777
9.13k
    int code, depth;
778
779
9.13k
    code = pdfi_read_token(ctx, s, indirect_num, indirect_gen);
780
9.13k
    if (code < 0)
781
12
        return code;
782
9.12k
    if (code == 0)
783
0
        return_error(gs_error_syntaxerror);
784
785
9.12k
    if (pdfi_type_of(ctx->stack_top[-1]) != PDF_DICT_MARK)
786
21
        return_error(gs_error_typecheck);
787
9.10k
    depth = pdfi_count_stack(ctx);
788
789
141k
    do {
790
141k
        code = pdfi_read_token(ctx, s, indirect_num, indirect_gen);
791
141k
        if (code < 0)
792
134
            return code;
793
141k
        if (code == 0)
794
17
            return_error(gs_error_syntaxerror);
795
141k
    } while(pdfi_count_stack(ctx) > depth);
796
8.95k
    return 0;
797
9.10k
}
798
799
int pdfi_skip_comment(pdf_context *ctx, pdf_c_stream *s)
800
1.87M
{
801
1.87M
    int c;
802
803
1.87M
    if (ctx->args.pdfdebug)
804
0
        outprintf (ctx->memory, " %%");
805
806
43.3M
    do {
807
43.3M
        c = pdfi_read_byte(ctx, s);
808
43.3M
        if (c < 0)
809
9.97k
            break;
810
811
43.3M
        if (ctx->args.pdfdebug)
812
0
            outprintf (ctx->memory, "%c", (char)c);
813
814
43.3M
    } while (c != 0x0a && c != 0x0d);
815
816
1.87M
    return 0;
817
1.87M
}
818
819
#define PARAM1(A) # A,
820
#define PARAM2(A,B) A,
821
static const char pdf_token_strings[][10] = {
822
#include "pdf_tokens.h"
823
};
824
825
123M
#define nelems(A) (sizeof(A)/sizeof(A[0]))
826
827
typedef int (*bsearch_comparator)(const void *, const void *);
828
829
int pdfi_read_bare_keyword(pdf_context *ctx, pdf_c_stream *s)
830
3.90M
{
831
3.90M
    byte Buffer[256];
832
3.90M
    int code, index = 0;
833
3.90M
    int c;
834
3.90M
    void *t;
835
836
3.90M
    pdfi_skip_white(ctx, s);
837
838
24.1M
    do {
839
24.1M
        c = pdfi_read_byte(ctx, s);
840
24.1M
        if (c < 0)
841
26.1k
            break;
842
843
24.1M
        if (iswhite(c) || isdelimiter(c)) {
844
3.87M
            pdfi_unread_byte(ctx, s, (byte)c);
845
3.87M
            break;
846
3.87M
        }
847
20.2M
        Buffer[index] = (byte)c;
848
20.2M
        index++;
849
20.2M
    } while (index < 255);
850
851
3.90M
    if (index >= 255 || index == 0) {
852
35.1k
        if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_NOERROR, "pdfi_read_bare_keyword", "")) < 0) {
853
0
            return code;
854
0
        }
855
35.1k
        return TOKEN_INVALID_KEY;
856
35.1k
    }
857
858
3.86M
    Buffer[index] = 0x00;
859
3.86M
    t = bsearch((const void *)Buffer,
860
3.86M
                (const void *)pdf_token_strings[TOKEN_INVALID_KEY+1],
861
3.86M
                nelems(pdf_token_strings)-(TOKEN_INVALID_KEY+1),
862
3.86M
                sizeof(pdf_token_strings[0]),
863
3.86M
                (bsearch_comparator)&strcmp);
864
3.86M
    if (t == NULL)
865
76.3k
        return TOKEN_INVALID_KEY;
866
867
3.79M
    if (ctx->args.pdfdebug)
868
0
        outprintf(ctx->memory, " %s\n", Buffer);
869
870
3.79M
    return (((const char *)t) - pdf_token_strings[0]) / sizeof(pdf_token_strings[0]);
871
3.86M
}
872
873
static pdf_key lookup_keyword(const byte *Buffer)
874
119M
{
875
119M
    void *t = bsearch((const void *)Buffer,
876
119M
                      (const void *)pdf_token_strings[TOKEN_INVALID_KEY+1],
877
119M
                      nelems(pdf_token_strings)-(TOKEN_INVALID_KEY+1),
878
119M
                      sizeof(pdf_token_strings[0]),
879
119M
                      (bsearch_comparator)&strcmp);
880
119M
    if (t == NULL)
881
14.6M
        return TOKEN_NOT_A_KEYWORD;
882
883
104M
    return (pdf_key)((((const char *)t) - pdf_token_strings[0]) /
884
104M
                     sizeof(pdf_token_strings[0]));
885
119M
}
886
887
/* This function is slightly misnamed. We read 'keywords' from
888
 * the stream (including null, true, false and R), and will usually
889
 * return them directly as TOKENs cast to be pointers. In the event
890
 * that we can't match what we parse to a known keyword, we'll
891
 * instead return a PDF_KEYWORD object. In the even that we parse
892
 * an 'R', we will return a PDF_INDIRECT object.
893
 */
894
static int pdfi_read_keyword(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
895
117M
{
896
117M
    byte Buffer[256];
897
117M
    unsigned short index = 0;
898
117M
    int c, code;
899
117M
    pdf_keyword *keyword;
900
117M
    pdf_key key;
901
902
117M
    pdfi_skip_white(ctx, s);
903
904
464M
    do {
905
464M
        c = pdfi_read_byte(ctx, s);
906
464M
        if (c < 0)
907
228k
            break;
908
909
464M
        if (iswhite(c) || isdelimiter(c)) {
910
116M
            pdfi_unread_byte(ctx, s, (byte)c);
911
116M
            break;
912
116M
        }
913
347M
        Buffer[index] = (byte)c;
914
347M
        index++;
915
347M
    } while (index < 255);
916
917
117M
    if (index >= 255 || index == 0) {
918
239k
        if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, 0, "pdfi_read_keyword", NULL)) < 0) {
919
0
            return code;
920
0
        }
921
239k
        key = (index >= 255 ? TOKEN_TOO_LONG : TOKEN_INVALID_KEY);
922
239k
        index = 0;
923
239k
        Buffer[0] = 0;
924
117M
    } else {
925
117M
        Buffer[index] = 0x00;
926
117M
        key = lookup_keyword(Buffer);
927
928
117M
        if (ctx->args.pdfdebug)
929
0
            outprintf(ctx->memory, " %s\n", Buffer);
930
931
117M
        switch (key) {
932
14.5M
            case TOKEN_R:
933
14.5M
            {
934
14.5M
                pdf_indirect_ref *o;
935
14.5M
                uint64_t obj_num;
936
14.5M
                uint32_t gen_num;
937
938
14.5M
                if(pdfi_count_stack(ctx) < 2) {
939
35.8k
                    pdfi_clearstack(ctx);
940
35.8k
                    return_error(gs_error_stackunderflow);
941
35.8k
                }
942
943
14.4M
                if(pdfi_type_of(ctx->stack_top[-1]) != PDF_INT || pdfi_type_of(ctx->stack_top[-2]) != PDF_INT) {
944
46.8k
                    pdfi_clearstack(ctx);
945
46.8k
                    return_error(gs_error_typecheck);
946
46.8k
                }
947
948
14.4M
                gen_num = ((pdf_num *)ctx->stack_top[-1])->value.i;
949
14.4M
                pdfi_pop(ctx, 1);
950
14.4M
                obj_num = ((pdf_num *)ctx->stack_top[-1])->value.i;
951
14.4M
                pdfi_pop(ctx, 1);
952
953
14.4M
                code = pdfi_object_alloc(ctx, PDF_INDIRECT, 0, (pdf_obj **)&o);
954
14.4M
                if (code < 0)
955
0
                    return code;
956
957
14.4M
                o->ref_generation_num = gen_num;
958
14.4M
                o->ref_object_num = obj_num;
959
14.4M
                o->indirect_num = indirect_num;
960
14.4M
                o->indirect_gen = indirect_gen;
961
962
14.4M
                code = pdfi_push(ctx, (pdf_obj *)o);
963
14.4M
                if (code < 0)
964
0
                    pdfi_free_object((pdf_obj *)o);
965
966
14.4M
                return code;
967
14.4M
            }
968
14.6M
            case TOKEN_NOT_A_KEYWORD:
969
                 /* Unexpected keyword found. We'll allocate an object for the buffer below. */
970
14.6M
                 break;
971
2.68M
            case TOKEN_STREAM:
972
2.68M
                code = pdfi_skip_eol(ctx, s);
973
2.68M
                if (code < 0)
974
0
                    return code;
975
                /* fallthrough */
976
3.34M
            case TOKEN_PDF_TRUE:
977
3.75M
            case TOKEN_PDF_FALSE:
978
3.82M
            case TOKEN_null:
979
87.8M
            default:
980
                /* This is the fast, common exit case. We just push the key
981
                 * onto the stack. No allocation required. No deallocation
982
                 * in the case of error. */
983
87.8M
                return pdfi_push(ctx, (pdf_obj *)(intptr_t)key);
984
117M
        }
985
117M
    }
986
987
    /* Unexpected keyword. We can't handle this with the fast no-allocation case. */
988
14.9M
    code = pdfi_object_alloc(ctx, PDF_KEYWORD, index, (pdf_obj **)&keyword);
989
14.9M
    if (code < 0)
990
0
        return code;
991
992
14.9M
    if (index)
993
14.6M
        memcpy(keyword->data, Buffer, index);
994
995
    /* keyword->length set as part of allocation. */
996
14.9M
    keyword->indirect_num = indirect_num;
997
14.9M
    keyword->indirect_gen = indirect_gen;
998
999
14.9M
    code = pdfi_push(ctx, (pdf_obj *)keyword);
1000
14.9M
    if (code < 0)
1001
30
        pdfi_free_object((pdf_obj *)keyword);
1002
1003
14.9M
    return code;
1004
14.9M
}
1005
1006
/* This function reads from the given stream, at the current offset in the stream,
1007
 * a single PDF 'token' and returns it on the stack.
1008
 */
1009
int pdfi_read_token(pdf_context *ctx, pdf_c_stream *s, uint32_t indirect_num, uint32_t indirect_gen)
1010
572M
{
1011
572M
    int c, code;
1012
1013
576M
rescan:
1014
576M
    pdfi_skip_white(ctx, s);
1015
1016
576M
    c = pdfi_read_byte(ctx, s);
1017
576M
    if (c == EOFC)
1018
297k
        return 0;
1019
576M
    if (c < 0)
1020
13.4k
        return_error(gs_error_ioerror);
1021
1022
576M
    switch(c) {
1023
73.7M
        case 0x30:
1024
118M
        case 0x31:
1025
152M
        case 0x32:
1026
190M
        case 0x33:
1027
222M
        case 0x34:
1028
241M
        case 0x35:
1029
259M
        case 0x36:
1030
271M
        case 0x37:
1031
278M
        case 0x38:
1032
283M
        case 0x39:
1033
283M
        case '+':
1034
298M
        case '-':
1035
299M
        case '.':
1036
299M
            pdfi_unread_byte(ctx, s, (byte)c);
1037
299M
            code = pdfi_read_num(ctx, s, indirect_num, indirect_gen);
1038
299M
            if (code < 0)
1039
49.6k
                return code;
1040
299M
            break;
1041
299M
        case '/':
1042
85.3M
            code = pdfi_read_name(ctx, s, indirect_num, indirect_gen);
1043
85.3M
            if (code < 0)
1044
0
                return code;
1045
85.3M
            return 1;
1046
0
            break;
1047
16.2M
        case '<':
1048
16.2M
            c = pdfi_read_byte(ctx, s);
1049
16.2M
            if (c < 0)
1050
366
                return (gs_error_ioerror);
1051
16.2M
            if (iswhite(c)) {
1052
49.6k
                code = pdfi_skip_white(ctx, s);
1053
49.6k
                if (code < 0)
1054
0
                    return code;
1055
49.6k
                c = pdfi_read_byte(ctx, s);
1056
49.6k
            }
1057
16.2M
            if (c == '<') {
1058
11.5M
                if (ctx->args.pdfdebug)
1059
0
                    outprintf (ctx->memory, " <<\n");
1060
11.5M
                if (ctx->object_nesting < MAX_NESTING_DEPTH) {
1061
10.9M
                    ctx->object_nesting++;
1062
10.9M
                    code = pdfi_mark_stack(ctx, PDF_DICT_MARK);
1063
10.9M
                    if (code < 0)
1064
1
                        return code;
1065
10.9M
                }
1066
564k
                else if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_limitcheck), NULL, E_PDF_NESTEDTOODEEP, "pdfi_read_token", NULL)) < 0) {
1067
0
                        return code;
1068
0
                }
1069
11.5M
                return 1;
1070
11.5M
            } else if (c == '>') {
1071
29.1k
                pdfi_unread_byte(ctx, s, (byte)c);
1072
29.1k
                code = pdfi_read_hexstring(ctx, s, indirect_num, indirect_gen);
1073
29.1k
                if (code < 0)
1074
0
                    return code;
1075
29.1k
                return 1;
1076
4.71M
            } else if (ishex(c)) {
1077
4.14M
                pdfi_unread_byte(ctx, s, (byte)c);
1078
4.14M
                code = pdfi_read_hexstring(ctx, s, indirect_num, indirect_gen);
1079
4.14M
                if (code < 0)
1080
282k
                    return code;
1081
4.14M
            }
1082
562k
            else
1083
562k
                return_error(gs_error_syntaxerror);
1084
3.86M
            break;
1085
11.9M
        case '>':
1086
11.9M
            c = pdfi_read_byte(ctx, s);
1087
11.9M
            if (c < 0)
1088
712
                return (gs_error_ioerror);
1089
11.9M
            if (c == '>') {
1090
11.1M
                if (ctx->object_nesting > 0) {
1091
10.5M
                    ctx->object_nesting--;
1092
10.5M
                    code = pdfi_dict_from_stack(ctx, indirect_num, indirect_gen, false);
1093
10.5M
                    if (code < 0)
1094
358k
                        return code;
1095
10.5M
                } else {
1096
663k
                    if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_unmatchedmark), NULL, E_PDF_UNMATCHEDMARK, "pdfi_read_token", NULL)) < 0) {
1097
0
                        return code;
1098
0
                    }
1099
663k
                    goto rescan;
1100
663k
                }
1101
10.1M
                return 1;
1102
11.1M
            } else {
1103
797k
                pdfi_unread_byte(ctx, s, (byte)c);
1104
797k
                return_error(gs_error_syntaxerror);
1105
797k
            }
1106
0
            break;
1107
15.4M
        case '(':
1108
15.4M
            code = pdfi_read_string(ctx, s, indirect_num, indirect_gen);
1109
15.4M
            if (code < 0)
1110
0
                return code;
1111
15.4M
            return 1;
1112
0
            break;
1113
13.9M
        case '[':
1114
13.9M
            if (ctx->args.pdfdebug)
1115
0
                outprintf (ctx->memory, "[");
1116
13.9M
            if (ctx->object_nesting < MAX_NESTING_DEPTH) {
1117
12.6M
                ctx->object_nesting++;
1118
12.6M
                code = pdfi_mark_stack(ctx, PDF_ARRAY_MARK);
1119
12.6M
                if (code < 0)
1120
0
                    return code;
1121
12.6M
            } else
1122
1.37M
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_NESTEDTOODEEP, "pdfi_read_token", NULL)) < 0)
1123
0
                    return code;
1124
13.9M
            return 1;
1125
0
            break;
1126
12.7M
        case ']':
1127
12.7M
            if (ctx->object_nesting > 0) {
1128
12.5M
                ctx->object_nesting--;
1129
12.5M
                code = pdfi_array_from_stack(ctx, indirect_num, indirect_gen);
1130
12.5M
                if (code < 0)
1131
215k
                    return code;
1132
12.5M
            } else {
1133
296k
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_unmatchedmark), NULL, E_PDF_UNMATCHEDMARK, "pdfi_read_token", NULL)) < 0) {
1134
0
                    return code;
1135
0
                }
1136
296k
                goto rescan;
1137
296k
            }
1138
12.2M
            break;
1139
12.2M
        case '{':
1140
486k
            if (ctx->args.pdfdebug)
1141
0
                outprintf (ctx->memory, "{");
1142
486k
            code = pdfi_mark_stack(ctx, PDF_PROC_MARK);
1143
486k
            if (code < 0)
1144
0
                return code;
1145
486k
            return 1;
1146
0
            break;
1147
324k
        case '}':
1148
324k
            pdfi_clear_to_mark(ctx);
1149
324k
            goto rescan;
1150
0
            break;
1151
1.74M
        case '%':
1152
1.74M
            pdfi_skip_comment(ctx, s);
1153
1.74M
            goto rescan;
1154
0
            break;
1155
117M
        default:
1156
117M
            if (isdelimiter(c)) {
1157
661k
                if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, 0, "pdfi_read_token", NULL)) < 0) {
1158
0
                    return code;
1159
0
                }
1160
661k
                goto rescan;
1161
661k
            }
1162
117M
            pdfi_unread_byte(ctx, s, (byte)c);
1163
117M
            code = pdfi_read_keyword(ctx, s, indirect_num, indirect_gen);
1164
117M
            if (code < 0)
1165
82.7k
                return code;
1166
117M
            return 1;
1167
0
            break;
1168
576M
    }
1169
315M
    return 1;
1170
576M
}
1171
1172
/* In contrast to the 'read' functions, the 'make' functions create an object with a
1173
 * reference count of 1. This indicates that the caller holds the reference. Thus the
1174
 * caller need not increment the reference count to the object, but must decrement
1175
 * it (pdf_countdown) before exiting.
1176
 */
1177
int pdfi_name_alloc(pdf_context *ctx, byte *n, uint32_t size, pdf_obj **o)
1178
175M
{
1179
175M
    int code;
1180
175M
    *o = NULL;
1181
1182
175M
    code = pdfi_object_alloc(ctx, PDF_NAME, size, o);
1183
175M
    if (code < 0)
1184
0
        return code;
1185
1186
175M
    memcpy(((pdf_name *)*o)->data, n, size);
1187
1188
175M
    return 0;
1189
175M
}
1190
1191
static char op_table_3[5][3] = {
1192
    "BDC", "BMC", "EMC", "SCN", "scn"
1193
};
1194
1195
static char op_table_2[39][2] = {
1196
    "b*", "BI", "BT", "BX", "cm", "CS", "cs", "EI", "d0", "d1", "Do", "DP", "ET", "EX", "f*", "gs", "ID", "MP", "re", "RG",
1197
    "rg", "ri", "SC", "sc", "sh", "T*", "Tc", "Td", "TD", "Tf", "Tj", "TJ", "TL", "Tm", "Tr", "Ts", "Tw", "Tz", "W*",
1198
};
1199
1200
static char op_table_1[27][1] = {
1201
    "b", "B", "c", "d", "f", "F", "G", "g", "h", "i", "j", "J", "K", "k", "l", "m", "n", "q", "Q", "s", "S", "v", "w", "W",
1202
    "y", "'", "\""
1203
};
1204
1205
/* forward definition for the 'split_bogus_operator' function to use */
1206
static int pdfi_interpret_stream_operator(pdf_context *ctx, pdf_c_stream *source,
1207
                                          pdf_dict *stream_dict, pdf_dict *page_dict);
1208
1209
static int
1210
make_keyword_obj(pdf_context *ctx, const byte *data, int length, pdf_keyword **pkey)
1211
2.19M
{
1212
2.19M
    byte Buffer[256];
1213
2.19M
    pdf_key key;
1214
2.19M
    int code;
1215
1216
2.19M
    if (length > 255)
1217
0
        return_error(gs_error_rangecheck);
1218
1219
2.19M
    memcpy(Buffer, data, length);
1220
2.19M
    Buffer[length] = 0;
1221
2.19M
    key = lookup_keyword(Buffer);
1222
2.19M
    if (key != TOKEN_INVALID_KEY) {
1223
        /* The common case. We've found a real key, just cast the token to
1224
         * a pointer, and return that. */
1225
2.19M
        *pkey = (pdf_keyword *)PDF_TOKEN_AS_OBJ(key);
1226
2.19M
        return 1;
1227
2.19M
    }
1228
    /* We still haven't found a real keyword. Allocate a new object and
1229
     * return it. */
1230
0
    code = pdfi_object_alloc(ctx, PDF_KEYWORD, length, (pdf_obj **)pkey);
1231
0
    if (code < 0)
1232
0
        return code;
1233
0
    if (length)
1234
0
        memcpy((*pkey)->data, Buffer, length);
1235
0
    pdfi_countup(*pkey);
1236
1237
0
    return 1;
1238
0
}
1239
1240
static int search_table_3(pdf_context *ctx, unsigned char *str, pdf_keyword **key)
1241
2.08M
{
1242
2.08M
    int i;
1243
1244
12.5M
    for (i = 0; i < 5; i++) {
1245
10.4M
        if (memcmp(str, op_table_3[i], 3) == 0)
1246
7.80k
            return make_keyword_obj(ctx, str, 3, key);
1247
10.4M
    }
1248
2.07M
    return 0;
1249
2.08M
}
1250
1251
static int search_table_2(pdf_context *ctx, unsigned char *str, pdf_keyword **key)
1252
4.43M
{
1253
4.43M
    int i;
1254
1255
171M
    for (i = 0; i < 39; i++) {
1256
167M
        if (memcmp(str, op_table_2[i], 2) == 0)
1257
273k
            return make_keyword_obj(ctx, str, 2, key);
1258
167M
    }
1259
4.16M
    return 0;
1260
4.43M
}
1261
1262
static int search_table_1(pdf_context *ctx, unsigned char *str, pdf_keyword **key)
1263
4.10M
{
1264
4.10M
    int i;
1265
1266
88.2M
    for (i = 0; i < 27; i++) {
1267
86.0M
        if (memcmp(str, op_table_1[i], 1) == 0)
1268
1.91M
            return make_keyword_obj(ctx, str, 1, key);
1269
86.0M
    }
1270
2.19M
    return 0;
1271
4.10M
}
1272
1273
static int split_bogus_operator(pdf_context *ctx, pdf_c_stream *source, pdf_dict *stream_dict, pdf_dict *page_dict)
1274
7.94M
{
1275
7.94M
    int code = 0;
1276
7.94M
    pdf_keyword *keyword = (pdf_keyword *)ctx->stack_top[-1], *key1 = NULL, *key2 = NULL;
1277
7.94M
    int length = keyword->length - 6;
1278
1279
7.94M
    if (length > 0) {
1280
        /* Longer than 2 3-character operators, we only allow for up to two
1281
         * operators. Check to see if it includes an endstream or endobj.
1282
         */
1283
2.74M
        if (memcmp(&keyword->data[length], "endobj", 6) == 0) {
1284
            /* Keyword is "<something>endobj". So make a keyword just from
1285
             * <something>, push that, execute it, then push endobj. */
1286
24
            code = make_keyword_obj(ctx, keyword->data, length, &key1);
1287
24
            if (code < 0)
1288
0
                goto error_exit;
1289
24
            pdfi_pop(ctx, 1);
1290
24
            pdfi_push(ctx, (pdf_obj *)key1);
1291
24
            pdfi_countdown(key1); /* Drop the reference returned by make_keyword_obj. */
1292
24
            code = pdfi_interpret_stream_operator(ctx, source, stream_dict, page_dict);
1293
24
            if (code < 0)
1294
15
                goto error_exit;
1295
9
            pdfi_push(ctx, PDF_TOKEN_AS_OBJ(TOKEN_ENDOBJ));
1296
9
            return 0;
1297
2.74M
        } else {
1298
2.74M
            length = keyword->length - 9;
1299
2.74M
            if (length > 0 && memcmp(&keyword->data[length], "endstream", 9) == 0) {
1300
                /* Keyword is "<something>endstream". So make a keyword just from
1301
                 * <something>, push that, execute it, then push endstream. */
1302
2
                code = make_keyword_obj(ctx, keyword->data, length, &key1);
1303
2
                if (code < 0)
1304
0
                    goto error_exit;
1305
2
                pdfi_pop(ctx, 1);
1306
2
                pdfi_push(ctx, (pdf_obj *)key1);
1307
2
                pdfi_countdown(key1); /* Drop the reference returned by make_keyword_obj. */
1308
2
                code = pdfi_interpret_stream_operator(ctx, source, stream_dict, page_dict);
1309
2
                if (code < 0)
1310
0
                    goto error_exit;
1311
2
                pdfi_push(ctx, PDF_TOKEN_AS_OBJ(TOKEN_ENDSTREAM));
1312
2
                return 0;
1313
2.74M
            } else {
1314
2.74M
                pdfi_clearstack(ctx);
1315
2.74M
                return 0;
1316
2.74M
            }
1317
2.74M
        }
1318
2.74M
    }
1319
1320
5.19M
    if (keyword->length > 3) {
1321
1.65M
        code = search_table_3(ctx, keyword->data, &key1);
1322
1.65M
        if (code < 0)
1323
0
            goto error_exit;
1324
1325
1.65M
        if (code > 0) {
1326
6.43k
            switch (keyword->length - 3) {
1327
4.95k
                case 1:
1328
4.95k
                    code = search_table_1(ctx, &keyword->data[3], &key2);
1329
4.95k
                    break;
1330
829
                case 2:
1331
829
                    code = search_table_2(ctx, &keyword->data[3], &key2);
1332
829
                    break;
1333
656
                case 3:
1334
656
                    code = search_table_3(ctx, &keyword->data[3], &key2);
1335
656
                    break;
1336
0
                default:
1337
0
                    goto error_exit;
1338
6.43k
            }
1339
6.43k
        }
1340
1.65M
        if (code < 0)
1341
0
            goto error_exit;
1342
1.65M
        if (code > 0)
1343
1.30k
            goto match;
1344
1.65M
    }
1345
5.19M
    pdfi_countdown(key1);
1346
5.19M
    pdfi_countdown(key2);
1347
5.19M
    key1 = NULL;
1348
5.19M
    key2 = NULL;
1349
1350
5.19M
    if (keyword->length > 5 || keyword->length < 2)
1351
1.31M
        goto error_exit;
1352
1353
3.87M
    code = search_table_2(ctx, keyword->data, &key1);
1354
3.87M
    if (code < 0)
1355
0
        goto error_exit;
1356
1357
3.87M
    if (code > 0) {
1358
232k
        switch(keyword->length - 2) {
1359
88.0k
            case 1:
1360
88.0k
                code = search_table_1(ctx, &keyword->data[2], &key2);
1361
88.0k
                break;
1362
87.1k
            case 2:
1363
87.1k
                code = search_table_2(ctx, &keyword->data[2], &key2);
1364
87.1k
                break;
1365
56.8k
            case 3:
1366
56.8k
                code = search_table_3(ctx, &keyword->data[2], &key2);
1367
56.8k
                break;
1368
0
            default:
1369
0
                goto error_exit;
1370
232k
        }
1371
232k
        if (code < 0)
1372
0
            goto error_exit;
1373
232k
        if (code > 0)
1374
41.6k
            goto match;
1375
232k
    }
1376
3.83M
    pdfi_countdown(key1);
1377
3.83M
    pdfi_countdown(key2);
1378
3.83M
    key1 = NULL;
1379
3.83M
    key2 = NULL;
1380
1381
3.83M
    if (keyword->length > 4)
1382
600k
        goto error_exit;
1383
1384
3.23M
    code = search_table_1(ctx, keyword->data, &key1);
1385
3.23M
    if (code <= 0)
1386
1.61M
        goto error_exit;
1387
1388
1.62M
    switch(keyword->length - 1) {
1389
772k
        case 1:
1390
772k
            code = search_table_1(ctx, &keyword->data[1], &key2);
1391
772k
            break;
1392
470k
        case 2:
1393
470k
            code = search_table_2(ctx, &keyword->data[1], &key2);
1394
470k
            break;
1395
377k
        case 3:
1396
377k
            code = search_table_3(ctx, &keyword->data[1], &key2);
1397
377k
            break;
1398
0
        default:
1399
0
            goto error_exit;
1400
1.62M
    }
1401
1.62M
    if (code <= 0)
1402
1.33M
        goto error_exit;
1403
1404
333k
match:
1405
333k
    pdfi_set_warning(ctx, 0, NULL, W_PDF_MISSING_WHITE_OPS, "split_bogus_operator", NULL);
1406
    /* If we get here, we have two PDF_KEYWORD objects. We push them on the stack
1407
     * one at a time, and execute them.
1408
     */
1409
333k
    pdfi_push(ctx, (pdf_obj *)key1);
1410
333k
    code = pdfi_interpret_stream_operator(ctx, source, stream_dict, page_dict);
1411
333k
    if (code < 0)
1412
257k
        goto error_exit;
1413
1414
75.5k
    pdfi_push(ctx, (pdf_obj *)key2);
1415
75.5k
    code = pdfi_interpret_stream_operator(ctx, source, stream_dict, page_dict);
1416
1417
75.5k
    pdfi_countdown(key1);
1418
75.5k
    pdfi_countdown(key2);
1419
75.5k
    pdfi_clearstack(ctx);
1420
75.5k
    return code;
1421
1422
5.12M
error_exit:
1423
5.12M
    pdfi_set_error(ctx, code, NULL, E_PDF_TOKENERROR, "split_bogus_operator", NULL);
1424
5.12M
    pdfi_countdown(key1);
1425
5.12M
    pdfi_countdown(key2);
1426
5.12M
    pdfi_clearstack(ctx);
1427
5.12M
    return code;
1428
333k
}
1429
1430
static int pdfi_interpret_stream_operator(pdf_context *ctx, pdf_c_stream *source,
1431
                                          pdf_dict *stream_dict, pdf_dict *page_dict)
1432
77.5M
{
1433
77.5M
    pdf_obj *keyword = ctx->stack_top[-1];
1434
77.5M
    int code = 0;
1435
1436
77.5M
    if (keyword < PDF_TOKEN_AS_OBJ(TOKEN__LAST_KEY))
1437
69.6M
    {
1438
69.6M
        switch((uintptr_t)keyword) {
1439
16.0k
            case TOKEN_b:           /* closepath, fill, stroke */
1440
16.0k
                pdfi_pop(ctx, 1);
1441
16.0k
                code = pdfi_b(ctx);
1442
16.0k
                break;
1443
40.3k
            case TOKEN_B:           /* fill, stroke */
1444
40.3k
                pdfi_pop(ctx, 1);
1445
40.3k
                code = pdfi_B(ctx);
1446
40.3k
                break;
1447
495
            case TOKEN_bstar:       /* closepath, eofill, stroke */
1448
495
                pdfi_pop(ctx, 1);
1449
495
                code = pdfi_b_star(ctx);
1450
495
                break;
1451
1.78k
            case TOKEN_Bstar:       /* eofill, stroke */
1452
1.78k
                pdfi_pop(ctx, 1);
1453
1.78k
                code = pdfi_B_star(ctx);
1454
1.78k
                break;
1455
255k
            case TOKEN_BI:       /* begin inline image */
1456
255k
                pdfi_pop(ctx, 1);
1457
255k
                code = pdfi_BI(ctx);
1458
255k
                break;
1459
314k
            case TOKEN_BDC:   /* begin marked content sequence with property list */
1460
314k
                pdfi_pop(ctx, 1);
1461
314k
                code = pdfi_op_BDC(ctx, stream_dict, page_dict);
1462
314k
                break;
1463
17.5k
            case TOKEN_BMC:   /* begin marked content sequence */
1464
17.5k
                pdfi_pop(ctx, 1);
1465
17.5k
                code = pdfi_op_BMC(ctx);
1466
17.5k
                break;
1467
1.78M
            case TOKEN_BT:       /* begin text */
1468
1.78M
                pdfi_pop(ctx, 1);
1469
1.78M
                code = pdfi_BT(ctx);
1470
1.78M
                break;
1471
49.8k
            case TOKEN_BX:       /* begin compatibility section */
1472
49.8k
                pdfi_pop(ctx, 1);
1473
49.8k
                break;
1474
10.0M
            case TOKEN_c:           /* curveto */
1475
10.0M
                pdfi_pop(ctx, 1);
1476
10.0M
                code = pdfi_curveto(ctx);
1477
10.0M
                break;
1478
2.56M
            case TOKEN_cm:       /* concat */
1479
2.56M
                pdfi_pop(ctx, 1);
1480
2.56M
                code = pdfi_concat(ctx);
1481
2.56M
                break;
1482
28.8k
            case TOKEN_CS:       /* set stroke colour space */
1483
28.8k
                pdfi_pop(ctx, 1);
1484
28.8k
                code = pdfi_setstrokecolor_space(ctx, stream_dict, page_dict);
1485
28.8k
                break;
1486
236k
            case TOKEN_cs:       /* set non-stroke colour space */
1487
236k
                pdfi_pop(ctx, 1);
1488
236k
                code = pdfi_setfillcolor_space(ctx, stream_dict, page_dict);
1489
236k
                break;
1490
726k
            case TOKEN_d:           /* set dash params */
1491
726k
                pdfi_pop(ctx, 1);
1492
726k
                code = pdfi_setdash(ctx);
1493
726k
                break;
1494
3.26k
            case TOKEN_d0:       /* set type 3 font glyph width */
1495
3.26k
                pdfi_pop(ctx, 1);
1496
3.26k
                code = pdfi_d0(ctx);
1497
3.26k
                break;
1498
39.9k
            case TOKEN_d1:       /* set type 3 font glyph width and bounding box */
1499
39.9k
                pdfi_pop(ctx, 1);
1500
39.9k
                code = pdfi_d1(ctx);
1501
39.9k
                break;
1502
260k
            case TOKEN_Do:       /* invoke named XObject */
1503
260k
                pdfi_pop(ctx, 1);
1504
260k
                code = pdfi_Do(ctx, stream_dict, page_dict);
1505
260k
                break;
1506
783
            case TOKEN_DP:       /* define marked content point with property list */
1507
783
                pdfi_pop(ctx, 1);
1508
783
                code = pdfi_op_DP(ctx, stream_dict, page_dict);
1509
783
                break;
1510
250k
            case TOKEN_EI:       /* end inline image */
1511
250k
                pdfi_pop(ctx, 1);
1512
250k
                code = pdfi_EI(ctx);
1513
250k
                break;
1514
1.75M
            case TOKEN_ET:       /* end text */
1515
1.75M
                pdfi_pop(ctx, 1);
1516
1.75M
                code = pdfi_ET(ctx);
1517
1.75M
                break;
1518
324k
            case TOKEN_EMC:   /* end marked content sequence */
1519
324k
                pdfi_pop(ctx, 1);
1520
324k
                code = pdfi_op_EMC(ctx);
1521
324k
                break;
1522
47.5k
            case TOKEN_EX:       /* end compatibility section */
1523
47.5k
                pdfi_pop(ctx, 1);
1524
47.5k
                break;
1525
2.17M
            case TOKEN_f:           /* fill */
1526
2.17M
                pdfi_pop(ctx, 1);
1527
2.17M
                code = pdfi_fill(ctx);
1528
2.17M
                break;
1529
14.6k
            case TOKEN_F:           /* fill (obselete operator) */
1530
14.6k
                pdfi_pop(ctx, 1);
1531
14.6k
                code = pdfi_fill(ctx);
1532
14.6k
                break;
1533
66.3k
            case TOKEN_fstar:       /* eofill */
1534
66.3k
                pdfi_pop(ctx, 1);
1535
66.3k
                code = pdfi_eofill(ctx);
1536
66.3k
                break;
1537
479k
            case TOKEN_G:           /* setgray for stroke */
1538
479k
                pdfi_pop(ctx, 1);
1539
479k
                code = pdfi_setgraystroke(ctx);
1540
479k
                break;
1541
594k
            case TOKEN_g:           /* setgray for non-stroke */
1542
594k
                pdfi_pop(ctx, 1);
1543
594k
                code = pdfi_setgrayfill(ctx);
1544
594k
                break;
1545
355k
            case TOKEN_gs:       /* set graphics state from dictionary */
1546
355k
                pdfi_pop(ctx, 1);
1547
355k
                code = pdfi_setgstate(ctx, stream_dict, page_dict);
1548
355k
                break;
1549
487k
            case TOKEN_h:           /* closepath */
1550
487k
                pdfi_pop(ctx, 1);
1551
487k
                code = pdfi_closepath(ctx);
1552
487k
                break;
1553
151k
            case TOKEN_i:           /* setflat */
1554
151k
                pdfi_pop(ctx, 1);
1555
151k
                code = pdfi_setflat(ctx);
1556
151k
                break;
1557
255k
            case TOKEN_ID:       /* begin inline image data */
1558
255k
                pdfi_pop(ctx, 1);
1559
255k
                code = pdfi_ID(ctx, stream_dict, page_dict, source);
1560
255k
                break;
1561
711k
            case TOKEN_j:           /* setlinejoin */
1562
711k
                pdfi_pop(ctx, 1);
1563
711k
                code = pdfi_setlinejoin(ctx);
1564
711k
                break;
1565
850k
            case TOKEN_J:           /* setlinecap */
1566
850k
                pdfi_pop(ctx, 1);
1567
850k
                code = pdfi_setlinecap(ctx);
1568
850k
                break;
1569
43.1k
            case TOKEN_K:           /* setcmyk for non-stroke */
1570
43.1k
                pdfi_pop(ctx, 1);
1571
43.1k
                code = pdfi_setcmykstroke(ctx);
1572
43.1k
                break;
1573
142k
            case TOKEN_k:           /* setcmyk for non-stroke */
1574
142k
                pdfi_pop(ctx, 1);
1575
142k
                code = pdfi_setcmykfill(ctx);
1576
142k
                break;
1577
11.3M
            case TOKEN_l:           /* lineto */
1578
11.3M
                pdfi_pop(ctx, 1);
1579
11.3M
                code = pdfi_lineto(ctx);
1580
11.3M
                break;
1581
5.85M
            case TOKEN_m:           /* moveto */
1582
5.85M
                pdfi_pop(ctx, 1);
1583
5.85M
                code = pdfi_moveto(ctx);
1584
5.85M
                break;
1585
41.5k
            case TOKEN_M:           /* setmiterlimit */
1586
41.5k
                pdfi_pop(ctx, 1);
1587
41.5k
                code = pdfi_setmiterlimit(ctx);
1588
41.5k
                break;
1589
2.58k
            case TOKEN_MP:       /* define marked content point */
1590
2.58k
                pdfi_pop(ctx, 1);
1591
2.58k
                code = pdfi_op_MP(ctx);
1592
2.58k
                break;
1593
1.11M
            case TOKEN_n:           /* newpath */
1594
1.11M
                pdfi_pop(ctx, 1);
1595
1.11M
                code = pdfi_newpath(ctx);
1596
1.11M
                break;
1597
2.89M
            case TOKEN_q:           /* gsave */
1598
2.89M
                pdfi_pop(ctx, 1);
1599
2.89M
                code = pdfi_op_q(ctx);
1600
2.89M
                break;
1601
2.81M
            case TOKEN_Q:           /* grestore */
1602
2.81M
                pdfi_pop(ctx, 1);
1603
2.81M
                code = pdfi_op_Q(ctx);
1604
2.81M
                break;
1605
47.0k
            case TOKEN_r:       /* non-standard set rgb colour for non-stroke */
1606
47.0k
                pdfi_pop(ctx, 1);
1607
47.0k
                code = pdfi_setrgbfill_array(ctx);
1608
47.0k
                break;
1609
2.57M
            case TOKEN_re:       /* append rectangle */
1610
2.57M
                pdfi_pop(ctx, 1);
1611
2.57M
                code = pdfi_rectpath(ctx);
1612
2.57M
                break;
1613
829k
            case TOKEN_RG:       /* set rgb colour for stroke */
1614
829k
                pdfi_pop(ctx, 1);
1615
829k
                code = pdfi_setrgbstroke(ctx);
1616
829k
                break;
1617
904k
            case TOKEN_rg:       /* set rgb colour for non-stroke */
1618
904k
                pdfi_pop(ctx, 1);
1619
904k
                code = pdfi_setrgbfill(ctx);
1620
904k
                break;
1621
87.3k
            case TOKEN_ri:       /* set rendering intent */
1622
87.3k
                pdfi_pop(ctx, 1);
1623
87.3k
                code = pdfi_ri(ctx);
1624
87.3k
                break;
1625
76.5k
            case TOKEN_s:           /* closepath, stroke */
1626
76.5k
                pdfi_pop(ctx, 1);
1627
76.5k
                code = pdfi_closepath_stroke(ctx);
1628
76.5k
                break;
1629
2.77M
            case TOKEN_S:           /* stroke */
1630
2.77M
                pdfi_pop(ctx, 1);
1631
2.77M
                code = pdfi_stroke(ctx);
1632
2.77M
                break;
1633
36.8k
            case TOKEN_SC:       /* set colour for stroke */
1634
36.8k
                pdfi_pop(ctx, 1);
1635
36.8k
                code = pdfi_setstrokecolor(ctx);
1636
36.8k
                break;
1637
151k
            case TOKEN_sc:       /* set colour for non-stroke */
1638
151k
                pdfi_pop(ctx, 1);
1639
151k
                code = pdfi_setfillcolor(ctx);
1640
151k
                break;
1641
12.5k
            case TOKEN_SCN:   /* set special colour for stroke */
1642
12.5k
                pdfi_pop(ctx, 1);
1643
12.5k
                code = pdfi_setcolorN(ctx, stream_dict, page_dict, false);
1644
12.5k
                break;
1645
129k
            case TOKEN_scn:   /* set special colour for non-stroke */
1646
129k
                pdfi_pop(ctx, 1);
1647
129k
                code = pdfi_setcolorN(ctx, stream_dict, page_dict, true);
1648
129k
                break;
1649
64.1k
            case TOKEN_sh:       /* fill with sahding pattern */
1650
64.1k
                pdfi_pop(ctx, 1);
1651
64.1k
                code = pdfi_shading(ctx, stream_dict, page_dict);
1652
64.1k
                break;
1653
137k
            case TOKEN_Tstar:       /* Move to start of next text line */
1654
137k
                pdfi_pop(ctx, 1);
1655
137k
                code = pdfi_T_star(ctx);
1656
137k
                break;
1657
715k
            case TOKEN_Tc:       /* set character spacing */
1658
715k
                pdfi_pop(ctx, 1);
1659
715k
                code = pdfi_Tc(ctx);
1660
715k
                break;
1661
1.28M
            case TOKEN_Td:       /* move text position */
1662
1.28M
                pdfi_pop(ctx, 1);
1663
1.28M
                code = pdfi_Td(ctx);
1664
1.28M
                break;
1665
394k
            case TOKEN_TD:       /* Move text position, set leading */
1666
394k
                pdfi_pop(ctx, 1);
1667
394k
                code = pdfi_TD(ctx);
1668
394k
                break;
1669
1.25M
            case TOKEN_Tf:       /* set font and size */
1670
1.25M
                pdfi_pop(ctx, 1);
1671
1.25M
                code = pdfi_Tf(ctx, stream_dict, page_dict);
1672
1.25M
                break;
1673
1.66M
            case TOKEN_Tj:       /* show text */
1674
1.66M
                pdfi_pop(ctx, 1);
1675
1.66M
                code = pdfi_Tj(ctx);
1676
1.66M
                break;
1677
1.82M
            case TOKEN_TJ:       /* show text with individual glyph positioning */
1678
1.82M
                pdfi_pop(ctx, 1);
1679
1.82M
                code = pdfi_TJ(ctx);
1680
1.82M
                break;
1681
12.1k
            case TOKEN_TL:       /* set text leading */
1682
12.1k
                pdfi_pop(ctx, 1);
1683
12.1k
                code = pdfi_TL(ctx);
1684
12.1k
                break;
1685
1.69M
            case TOKEN_Tm:       /* set text matrix */
1686
1.69M
                pdfi_pop(ctx, 1);
1687
1.69M
                code = pdfi_Tm(ctx);
1688
1.69M
                break;
1689
581k
            case TOKEN_Tr:       /* set text rendering mode */
1690
581k
                pdfi_pop(ctx, 1);
1691
581k
                code = pdfi_Tr(ctx);
1692
581k
                break;
1693
4.03k
            case TOKEN_Ts:       /* set text rise */
1694
4.03k
                pdfi_pop(ctx, 1);
1695
4.03k
                code = pdfi_Ts(ctx);
1696
4.03k
                break;
1697
154k
            case TOKEN_Tw:       /* set word spacing */
1698
154k
                pdfi_pop(ctx, 1);
1699
154k
                code = pdfi_Tw(ctx);
1700
154k
                break;
1701
102k
            case TOKEN_Tz:       /* set text matrix */
1702
102k
                pdfi_pop(ctx, 1);
1703
102k
                code = pdfi_Tz(ctx);
1704
102k
                break;
1705
152k
            case TOKEN_v:           /* append curve (initial point replicated) */
1706
152k
                pdfi_pop(ctx, 1);
1707
152k
                code = pdfi_v_curveto(ctx);
1708
152k
                break;
1709
1.94M
            case TOKEN_w:           /* setlinewidth */
1710
1.94M
                pdfi_pop(ctx, 1);
1711
1.94M
                code = pdfi_setlinewidth(ctx);
1712
1.94M
                break;
1713
616k
            case TOKEN_W:           /* clip */
1714
616k
                pdfi_pop(ctx, 1);
1715
616k
                ctx->clip_active = true;
1716
616k
                ctx->do_eoclip = false;
1717
616k
                break;
1718
58.2k
            case TOKEN_Wstar:       /* eoclip */
1719
58.2k
                pdfi_pop(ctx, 1);
1720
58.2k
                ctx->clip_active = true;
1721
58.2k
                ctx->do_eoclip = true;
1722
58.2k
                break;
1723
170k
            case TOKEN_y:           /* append curve (final point replicated) */
1724
170k
                pdfi_pop(ctx, 1);
1725
170k
                code = pdfi_y_curveto(ctx);
1726
170k
                break;
1727
18.2k
            case TOKEN_APOSTROPHE:          /* move to next line and show text */
1728
18.2k
                pdfi_pop(ctx, 1);
1729
18.2k
                code = pdfi_singlequote(ctx);
1730
18.2k
                break;
1731
5.70k
            case TOKEN_QUOTE:           /* set word and character spacing, move to next line, show text */
1732
5.70k
                pdfi_pop(ctx, 1);
1733
5.70k
                code = pdfi_doublequote(ctx);
1734
5.70k
                break;
1735
4.19k
            default:
1736
                /* Shouldn't we return an error here? Original code didn't seem to. */
1737
4.19k
                break;
1738
69.6M
        }
1739
        /* We use a return value of 1 to indicate a repaired keyword (a pair of operators
1740
         * was concatenated, and we split them up). We must not return a value > 0 from here
1741
         * to avoid tripping that test.
1742
         */
1743
69.6M
        if (code > 0)
1744
0
            code = 0;
1745
69.6M
        return code;
1746
69.6M
    } else {
1747
        /* This means we either have a corrupted or illegal operator. The most
1748
         * usual corruption is two concatented operators (eg QBT instead of Q BT)
1749
         * I plan to tackle this by trying to see if I can make two or more operators
1750
         * out of the mangled one.
1751
         */
1752
7.94M
        code = split_bogus_operator(ctx, source, stream_dict, page_dict);
1753
7.94M
        if (code < 0)
1754
305k
            return code;
1755
7.63M
        if (pdfi_count_stack(ctx) > 0) {
1756
11
            keyword = ctx->stack_top[-1];
1757
11
            if (keyword != PDF_TOKEN_AS_OBJ(TOKEN_NOT_A_KEYWORD))
1758
11
                return REPAIRED_KEYWORD;
1759
11
        }
1760
7.63M
    }
1761
7.63M
    return 0;
1762
77.5M
}
1763
1764
void local_save_stream_state(pdf_context *ctx, stream_save *local_save)
1765
638k
{
1766
    /* copy the 'save_stream' data from the context to a local structure */
1767
638k
    local_save->stream_offset = ctx->current_stream_save.stream_offset;
1768
638k
    local_save->gsave_level = ctx->current_stream_save.gsave_level;
1769
638k
    local_save->stack_count = ctx->current_stream_save.stack_count;
1770
638k
    local_save->group_depth = ctx->current_stream_save.group_depth;
1771
638k
}
1772
1773
void cleanup_context_interpretation(pdf_context *ctx, stream_save *local_save)
1774
638k
{
1775
638k
    pdfi_seek(ctx, ctx->main_stream, ctx->current_stream_save.stream_offset, SEEK_SET);
1776
    /* The transparency group implenetation does a gsave, so the end group does a
1777
     * grestore. Therefore we need to do this before we check the saved gstate depth
1778
     */
1779
638k
    if (ctx->current_stream_save.group_depth != local_save->group_depth) {
1780
9
        pdfi_set_warning(ctx, 0, NULL, W_PDF_GROUPERROR, "pdfi_cleanup_context_interpretation", NULL);
1781
18
        while (ctx->current_stream_save.group_depth > local_save->group_depth)
1782
9
            pdfi_trans_end_group(ctx);
1783
9
    }
1784
638k
    if (ctx->pgs->level > ctx->current_stream_save.gsave_level)
1785
21.6k
        pdfi_set_warning(ctx, 0, NULL, W_PDF_TOOMANYq, "pdfi_cleanup_context_interpretation", NULL);
1786
638k
    if (pdfi_count_stack(ctx) > ctx->current_stream_save.stack_count)
1787
7.87k
        pdfi_set_warning(ctx, 0, NULL, W_PDF_STACKGARBAGE, "pdfi_cleanup_context_interpretation", NULL);
1788
829k
    while (ctx->pgs->level > ctx->current_stream_save.gsave_level)
1789
191k
        pdfi_grestore(ctx);
1790
638k
    pdfi_clearstack(ctx);
1791
638k
}
1792
1793
void local_restore_stream_state(pdf_context *ctx, stream_save *local_save)
1794
638k
{
1795
    /* Put the entries stored in the context back to what they were on entry
1796
     * We shouldn't really need to do this, the cleanup above should mean all the
1797
     * entries are properly reset.
1798
     */
1799
638k
    ctx->current_stream_save.stream_offset = local_save->stream_offset;
1800
638k
    ctx->current_stream_save.gsave_level = local_save->gsave_level;
1801
638k
    ctx->current_stream_save.stack_count = local_save->stack_count;
1802
638k
    ctx->current_stream_save.group_depth = local_save->group_depth;
1803
638k
}
1804
1805
void initialise_stream_save(pdf_context *ctx)
1806
638k
{
1807
    /* Set up the values in the context to the current values */
1808
638k
    ctx->current_stream_save.stream_offset = pdfi_tell(ctx->main_stream);
1809
638k
    ctx->current_stream_save.gsave_level = ctx->pgs->level;
1810
638k
    ctx->current_stream_save.stack_count = pdfi_count_total_stack(ctx);
1811
638k
}
1812
1813
/* Run a stream in a sub-context (saves/restores DefaultQState) */
1814
int pdfi_run_context(pdf_context *ctx, pdf_stream *stream_obj,
1815
                     pdf_dict *page_dict, bool stoponerror, const char *desc)
1816
300k
{
1817
300k
    int code = 0, code1 = 0;
1818
300k
    gs_gstate *DefaultQState = NULL;
1819
    /* Save any existing Default* colour spaces */
1820
300k
    gs_color_space *PageDefaultGray = ctx->page.DefaultGray_cs;
1821
300k
    gs_color_space *PageDefaultRGB = ctx->page.DefaultRGB_cs;
1822
300k
    gs_color_space *PageDefaultCMYK = ctx->page.DefaultCMYK_cs;
1823
1824
300k
    ctx->page.DefaultGray_cs = NULL;
1825
300k
    ctx->page.DefaultRGB_cs = NULL;
1826
300k
    ctx->page.DefaultCMYK_cs = NULL;
1827
1828
#if DEBUG_CONTEXT
1829
    dbgmprintf(ctx->memory, "pdfi_run_context BEGIN\n");
1830
#endif
1831
    /* If the stream has any Default* colour spaces, replace the page level ones.
1832
     * This will derement the reference counts to the current spaces if they are replaced.
1833
     */
1834
300k
    code = pdfi_setup_DefaultSpaces(ctx, stream_obj->stream_dict);
1835
300k
    if (code < 0)
1836
0
        goto exit;
1837
1838
    /* If no Default* space found, try using the Page level ones (if any) */
1839
300k
    if (ctx->page.DefaultGray_cs == NULL) {
1840
300k
        ctx->page.DefaultGray_cs = PageDefaultGray;
1841
300k
        rc_increment(PageDefaultGray);
1842
300k
    }
1843
300k
    if (ctx->page.DefaultRGB_cs == NULL) {
1844
300k
        ctx->page.DefaultRGB_cs = PageDefaultRGB;
1845
300k
        rc_increment(PageDefaultRGB);
1846
300k
    }
1847
300k
    if (ctx->page.DefaultCMYK_cs == NULL) {
1848
300k
        ctx->page.DefaultCMYK_cs = PageDefaultCMYK;
1849
300k
        rc_increment(PageDefaultCMYK);
1850
300k
    }
1851
1852
300k
    code = pdfi_copy_DefaultQState(ctx, &DefaultQState);
1853
300k
    if (code < 0)
1854
0
        goto exit;
1855
1856
300k
    code = pdfi_set_DefaultQState(ctx, ctx->pgs);
1857
300k
    if (code < 0)
1858
0
        goto exit;
1859
1860
300k
    code = pdfi_interpret_inner_content_stream(ctx, stream_obj, page_dict, stoponerror, desc);
1861
1862
300k
    code1 = pdfi_restore_DefaultQState(ctx, &DefaultQState);
1863
300k
    if (code >= 0)
1864
300k
        code = code1;
1865
1866
300k
exit:
1867
300k
    if (DefaultQState != NULL) {
1868
0
        gs_gstate_free(DefaultQState);
1869
0
        DefaultQState = NULL;
1870
0
    }
1871
1872
    /* Count down any Default* colour spaces */
1873
300k
    rc_decrement(ctx->page.DefaultGray_cs, "pdfi_run_context");
1874
300k
    rc_decrement(ctx->page.DefaultRGB_cs, "pdfi_run_context");
1875
300k
    rc_decrement(ctx->page.DefaultCMYK_cs, "pdfi_run_context");
1876
1877
    /* And restore the page level ones (if any) */
1878
300k
    ctx->page.DefaultGray_cs = PageDefaultGray;
1879
300k
    ctx->page.DefaultRGB_cs = PageDefaultRGB;
1880
300k
    ctx->page.DefaultCMYK_cs = PageDefaultCMYK;
1881
1882
#if DEBUG_CONTEXT
1883
    dbgmprintf(ctx->memory, "pdfi_run_context END\n");
1884
#endif
1885
300k
    return code;
1886
300k
}
1887
1888
1889
/* Interpret a sub-content stream, with some handling of error recovery, clearing stack, etc.
1890
 * This temporarily turns on pdfstoponerror if requested.
1891
 * It will make sure the stack is cleared and the gstate is matched.
1892
 */
1893
static int
1894
pdfi_interpret_inner_content(pdf_context *ctx, pdf_c_stream *content_stream, pdf_stream *stream_obj,
1895
                             pdf_dict *page_dict, bool stoponerror, const char *desc)
1896
335k
{
1897
335k
    int code = 0;
1898
335k
    bool saved_stoponerror = ctx->args.pdfstoponerror;
1899
335k
    stream_save local_entry_save;
1900
1901
335k
    local_save_stream_state(ctx, &local_entry_save);
1902
335k
    initialise_stream_save(ctx);
1903
1904
    /* This causes several files to render 'incorrectly', even though they are in some sense
1905
     * invalid. It doesn't seem to provide any benefits so I have, for now, removed it. If
1906
     * there is a good reason for it we can put it back again.
1907
     * FIXME - either restore or remove these lines
1908
     * /tests_private/pdf/PDF_2.0_FTS/fts_23_2310.pdf
1909
     * /tests_private/pdf/PDF_2.0_FTS/fts_23_2311.pdf
1910
     * /tests_private/pdf/PDF_2.0_FTS/fts_23_2312.pdf
1911
     * /tests_private/pdf/sumatra/recursive_colorspace.pdf
1912
     * /tests_private/pdf/uploads/Bug696410.pdf
1913
     * /tests_private/pdf/sumatra/1900_-_cairo_transparency_inefficiency.pdf (with pdfwrite)
1914
     */
1915
#if 0
1916
    /* Stop on error in substream, and also be prepared to clean up the stack */
1917
    if (stoponerror)
1918
        ctx->args.pdfstoponerror = true;
1919
#endif
1920
1921
#if DEBUG_CONTEXT
1922
    dbgmprintf1(ctx->memory, "BEGIN %s stream\n", desc);
1923
#endif
1924
335k
    code = pdfi_interpret_content_stream(ctx, content_stream, stream_obj, page_dict);
1925
#if DEBUG_CONTEXT
1926
    dbgmprintf1(ctx->memory, "END %s stream\n", desc);
1927
#endif
1928
1929
335k
    if (code < 0)
1930
335k
        dbgmprintf1(ctx->memory, "ERROR: inner_stream: code %d when rendering stream\n", code);
1931
1932
335k
    ctx->args.pdfstoponerror = saved_stoponerror;
1933
1934
    /* Put our state back the way it was on entry */
1935
#if PROBE_STREAMS
1936
    if (ctx->pgs->level > ctx->current_stream_save.gsave_level ||
1937
        pdfi_count_stack(ctx) > ctx->current_stream_save.stack_count)
1938
        code = ((pdf_context *)0)->first_page;
1939
#endif
1940
1941
335k
    cleanup_context_interpretation(ctx, &local_entry_save);
1942
335k
    local_restore_stream_state(ctx, &local_entry_save);
1943
335k
    if (code < 0)
1944
7.14k
        code = pdfi_set_error_stop(ctx, code, NULL, 0, "pdfi_interpret_inner_content", NULL);
1945
335k
    return code;
1946
335k
}
1947
1948
/* Interpret inner content from a buffer
1949
 */
1950
int
1951
pdfi_interpret_inner_content_buffer(pdf_context *ctx, byte *content_data,
1952
                                      uint32_t content_length,
1953
                                      pdf_dict *stream_dict, pdf_dict *page_dict,
1954
                                      bool stoponerror, const char *desc)
1955
34.7k
{
1956
34.7k
    int code = 0;
1957
34.7k
    pdf_c_stream *stream = NULL;
1958
34.7k
    pdf_stream *stream_obj = NULL;
1959
1960
34.7k
    if (content_length == 0)
1961
0
        return 0;
1962
1963
34.7k
    code = pdfi_open_memory_stream_from_memory(ctx, content_length,
1964
34.7k
                                               content_data, &stream, true);
1965
34.7k
    if (code < 0)
1966
0
        goto exit;
1967
1968
34.7k
    code = pdfi_obj_dict_to_stream(ctx, stream_dict, &stream_obj, false);
1969
34.7k
    if (code < 0)
1970
0
        return code;
1971
1972
    /* NOTE: stream gets closed in here */
1973
34.7k
    code = pdfi_interpret_inner_content(ctx, stream, stream_obj, page_dict, stoponerror, desc);
1974
34.7k
    pdfi_countdown(stream_obj);
1975
34.7k
 exit:
1976
34.7k
    return code;
1977
34.7k
}
1978
1979
/* Interpret inner content from a C string
1980
 */
1981
int
1982
pdfi_interpret_inner_content_c_string(pdf_context *ctx, char *content_string,
1983
                                      pdf_dict *stream_dict, pdf_dict *page_dict,
1984
                                      bool stoponerror, const char *desc)
1985
20.4k
{
1986
20.4k
    uint32_t length = (uint32_t)strlen(content_string);
1987
20.4k
    bool decrypt_strings;
1988
20.4k
    int code;
1989
1990
20.4k
    if (length == 0)
1991
0
        return 0;
1992
1993
    /* Underlying buffer limit is uint32, so handle the extremely unlikely case that
1994
     * our string is too big.
1995
     */
1996
20.4k
    if (length != strlen(content_string))
1997
0
        return_error(gs_error_limitcheck);
1998
1999
    /* Since this is a constructed string content, not part of the file, it can never
2000
     * be encrypted. So disable decryption during this call.
2001
     */
2002
20.4k
    decrypt_strings = ctx->encryption.decrypt_strings;
2003
20.4k
    ctx->encryption.decrypt_strings = false;
2004
20.4k
    code = pdfi_interpret_inner_content_buffer(ctx, (byte *)content_string, length,
2005
20.4k
                                               stream_dict, page_dict, stoponerror, desc);
2006
20.4k
    ctx->encryption.decrypt_strings = decrypt_strings;
2007
2008
20.4k
    return code;
2009
20.4k
}
2010
2011
/* Interpret inner content from a string
2012
 */
2013
int
2014
pdfi_interpret_inner_content_string(pdf_context *ctx, pdf_string *content_string,
2015
                                    pdf_dict *stream_dict, pdf_dict *page_dict,
2016
                                    bool stoponerror, const char *desc)
2017
14.2k
{
2018
14.2k
    return pdfi_interpret_inner_content_buffer(ctx, content_string->data, content_string->length,
2019
14.2k
                                               stream_dict, page_dict, stoponerror, desc);
2020
14.2k
}
2021
2022
/* Interpret inner content from a stream_dict
2023
 */
2024
int
2025
pdfi_interpret_inner_content_stream(pdf_context *ctx, pdf_stream *stream_obj,
2026
                                    pdf_dict *page_dict, bool stoponerror, const char *desc)
2027
300k
{
2028
300k
    return pdfi_interpret_inner_content(ctx, NULL, stream_obj, page_dict, stoponerror, desc);
2029
300k
}
2030
2031
/*
2032
 * Interpret a content stream.
2033
 * content_stream -- content to parse.  If NULL, get it from the stream_dict
2034
 * stream_dict -- dict containing the stream
2035
 */
2036
int
2037
pdfi_interpret_content_stream(pdf_context *ctx, pdf_c_stream *content_stream,
2038
                              pdf_stream *stream_obj, pdf_dict *page_dict)
2039
487k
{
2040
487k
    int code;
2041
487k
    pdf_c_stream *stream = NULL, *SubFile_stream = NULL;
2042
487k
    pdf_keyword *keyword;
2043
487k
    pdf_stream *s = ctx->current_stream;
2044
487k
    pdf_obj_type type;
2045
487k
    char EODString[] = "endstream";
2046
2047
    /* Check this stream, and all the streams currently being executed, to see
2048
     * if the stream we've been given is already in train. If it is, then we
2049
     * have encountered recursion. This can happen if a non-page stream such
2050
     * as a Form or Pattern uses a Resource, but does not declare it in it's
2051
     * Resources, and instead inherits it from the parent. We cannot detect that
2052
     * before the Resource is used, so all we can do is check here.
2053
     */
2054
677k
    while (s != NULL && pdfi_type_of(s) == PDF_STREAM) {
2055
190k
        if (s->object_num > 0) {
2056
189k
            if (s->object_num == stream_obj->object_num) {
2057
259
                pdf_dict *d = NULL;
2058
259
                bool known = false;
2059
2060
259
                code = pdfi_dict_from_obj(ctx, (pdf_obj *)stream_obj, &d);
2061
259
                if (code >= 0) {
2062
259
                    code = pdfi_dict_known(ctx, d, "Parent", &known);
2063
259
                    if (code >= 0 && known)
2064
60
                        (void)pdfi_dict_delete(ctx, d, "Parent");
2065
259
                }
2066
259
                pdfi_set_error(ctx, 0, NULL, E_PDF_CIRCULARREF, "pdfi_interpret_content_stream", "Aborting stream");
2067
259
                return_error(gs_error_circular_reference);
2068
259
            }
2069
189k
        }
2070
189k
        s = (pdf_stream *)s->parent_obj;
2071
189k
    }
2072
2073
487k
    if (content_stream != NULL) {
2074
78.6k
        stream = content_stream;
2075
408k
    } else {
2076
408k
        code = pdfi_seek(ctx, ctx->main_stream, pdfi_stream_offset(ctx, stream_obj), SEEK_SET);
2077
408k
        if (code < 0)
2078
0
            return code;
2079
2080
408k
        if (stream_obj->length_valid) {
2081
401k
            if (stream_obj->Length == 0)
2082
2.61k
                return 0;
2083
399k
            code = pdfi_apply_SubFileDecode_filter(ctx, stream_obj->Length, NULL, ctx->main_stream, &SubFile_stream, false);
2084
399k
        }
2085
6.78k
        else
2086
6.78k
            code = pdfi_apply_SubFileDecode_filter(ctx, 0, EODString, ctx->main_stream, &SubFile_stream, false);
2087
405k
        if (code < 0)
2088
0
            return code;
2089
2090
405k
        code = pdfi_filter(ctx, stream_obj, SubFile_stream, &stream, false);
2091
405k
        if (code < 0) {
2092
556
            pdfi_close_file(ctx, SubFile_stream);
2093
556
            return code;
2094
556
        }
2095
405k
    }
2096
2097
484k
    pdfi_set_stream_parent(ctx, stream_obj, ctx->current_stream);
2098
484k
    ctx->current_stream = stream_obj;
2099
2100
283M
    do {
2101
283M
        code = pdfi_read_token(ctx, stream, stream_obj->object_num, stream_obj->generation_num);
2102
283M
        if (code < 0) {
2103
698k
            if (code == gs_error_ioerror || code == gs_error_VMerror || ctx->args.pdfstoponerror) {
2104
14.8k
                if (code == gs_error_ioerror) {
2105
14.8k
                    pdfi_set_error(ctx, code, NULL, E_PDF_BADSTREAM, "pdfi_interpret_content_stream", (char *)"**** Error reading a content stream.  The page may be incomplete");
2106
14.8k
                } else if (code == gs_error_VMerror) {
2107
0
                    pdfi_set_error(ctx, code, NULL, E_PDF_OUTOFMEMORY, "pdfi_interpret_content_stream", (char *)"**** Error ran out of memory reading a content stream.  The page may be incomplete");
2108
0
                }
2109
14.8k
                goto exit;
2110
14.8k
            }
2111
683k
            continue;
2112
698k
        }
2113
2114
283M
        if (pdfi_count_stack(ctx) <= 0) {
2115
251k
            if(stream->eof == true)
2116
229k
                break;
2117
251k
        }
2118
2119
282M
repaired_keyword:
2120
282M
        type = pdfi_type_of(ctx->stack_top[-1]);
2121
282M
        if (type == PDF_FAST_KEYWORD) {
2122
69.2M
            keyword = (pdf_keyword *)ctx->stack_top[-1];
2123
2124
69.2M
            switch((uintptr_t)keyword) {
2125
43.8k
                case TOKEN_ENDSTREAM:
2126
43.8k
                    pdfi_pop(ctx,1);
2127
43.8k
                    goto exit;
2128
0
                    break;
2129
164
                case TOKEN_ENDOBJ:
2130
164
                    pdfi_clearstack(ctx);
2131
164
                    code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MISSINGENDSTREAM, "pdfi_interpret_content_stream", NULL);
2132
164
                    goto exit;
2133
0
                    break;
2134
0
                case TOKEN_INVALID_KEY:
2135
0
                    pdfi_clearstack(ctx);
2136
0
                    if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_limitcheck), NULL, E_PDF_KEYWORDTOOLONG, "pdfi_interpret_content_stream", NULL)) < 0)
2137
0
                        goto exit;
2138
0
                    break;
2139
0
                case TOKEN_TOO_LONG:
2140
0
                    pdfi_clearstack(ctx);
2141
0
                    if ((code = pdfi_set_error_stop(ctx, gs_note_error(gs_error_syntaxerror), NULL, E_PDF_MISSINGENDSTREAM, "pdfi_interpret_content_stream", NULL)) < 0)
2142
0
                        goto exit;
2143
0
                    break;
2144
69.2M
                default:
2145
69.2M
                    goto execute;
2146
69.2M
            }
2147
69.2M
        }
2148
213M
        else if (type == PDF_KEYWORD)
2149
7.94M
        {
2150
77.1M
execute:
2151
77.1M
            {
2152
77.1M
                pdf_dict *stream_dict = NULL;
2153
2154
77.1M
                code = pdfi_dict_from_obj(ctx, (pdf_obj *)stream_obj, &stream_dict);
2155
77.1M
                if (code < 0)
2156
0
                    goto exit;
2157
2158
77.1M
                code = pdfi_interpret_stream_operator(ctx, stream, stream_dict, page_dict);
2159
77.1M
                if (code == REPAIRED_KEYWORD)
2160
11
                    goto repaired_keyword;
2161
2162
77.1M
                if (code < 0) {
2163
3.96M
                    if ((code = pdfi_set_error_stop(ctx, code, NULL, E_PDF_TOKENERROR, "pdf_interpret_content_stream", NULL)) < 0) {
2164
785
                        pdfi_clearstack(ctx);
2165
785
                        goto exit;
2166
785
                    }
2167
3.96M
                }
2168
77.1M
            }
2169
77.1M
        }
2170
282M
        if(stream->eof == true)
2171
194k
            break;
2172
283M
    }while(1);
2173
2174
484k
exit:
2175
484k
    ctx->current_stream = pdfi_stream_parent(ctx, stream_obj);
2176
484k
    pdfi_clear_stream_parent(ctx, stream_obj);
2177
484k
    pdfi_close_file(ctx, stream);
2178
484k
    if (SubFile_stream != NULL)
2179
405k
        pdfi_close_file(ctx, SubFile_stream);
2180
484k
    return code;
2181
484k
}