Commit graph

626 commits

Author SHA1 Message Date
Albert Astals Cid
b94bf30f03 _cairo_pdf_surface_finish: Fix leak in error conditions
Make sure surface->object_stream.stream is cleaned up even if things
failed

In poppler oss-fuzz tests we are getting this leak reported

Direct leak of 64 byte(s) in 1 object(s) allocated from:
	    #0 0x5747417eabd9 in __interceptor_calloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:74:3
	    #1 0x574742706f5b in _cairo_memory_stream_create cairo/src/cairo-output-stream.c:741:14
	    #2 0x5747426757b8 in _cairo_pdf_surface_open_object_stream cairo/src/cairo-pdf-surface.c:2307:34
	    #3 0x57474266b880 in _cairo_pdf_surface_finish cairo/src/cairo-pdf-surface.c:2700:14
	    #4 0x57474261afc6 in _cairo_surface_finish cairo/src/cairo-surface.c:1043:11
	    #5 0x57474261afc6 in cairo_surface_finish cairo/src/cairo-surface.c:1092:5
	    #6 0x57474270808a in _cairo_paginated_surface_finish cairo/src/cairo-paginated-surface.c:215:2
	    #7 0x5747426175c2 in _cairo_surface_finish cairo/src/cairo-surface.c:1043:11
	    #8 0x5747426175c2 in cairo_surface_destroy cairo/src/cairo-surface.c:978:2

This fixes it.

_cairo_pdf_surface_finish was succeeding past
_cairo_pdf_surface_open_object_stream that allocates surface->object_stream.stream,
failing when calling _cairo_pdf_surface_emit_font_subsets
and that memory was never freed
2026-01-24 11:37:50 +01:00
Adrian Johnson
0cae2a4a74 Use _cairo_calloc() to allocate structs
To avoid any possibility of uninitialized memory.

The exceptions are:
 - where the allocation is immediately overwritten by a memcpy or struct copy.
 - arrays of structs to avoid any performance impact (except when the
   array is returned by the public API).
2024-06-21 10:32:23 +09:30
Adrian Johnson
8da24bf7fb Make _cairo_calloc() consistent with _cairo_malloc()
ie

  _cairo_calloc(size)
  _cairo_calloc_ab(a, size)
2024-06-21 08:53:01 +09:30
Adrian Johnson
212f458949 Merge branch 'cff-global-subs-fix' into 'master'
CFF Fix crash when allocating zero size array

See merge request cairo/cairo!553
2024-05-24 21:44:13 +00:00
Adrian Johnson
e29bd3f642 pdf: return subset status and always cleanup
_cairo_pdf_surface_finish() was not returning the status when
subsetting fails. Also ensure the surface is always cleaned up when
there is an error.
2024-05-22 07:38:18 +09:30
Adrian Johnson
3715d93bdf Create _cairo_calloc() macro to replace calloc()
Not all platforms handle a zero sized allocation in calloc the
same. This macro ensures that _cairo_calloc(0) always returns NULL
similar to _cairo_malloc(0).
2024-05-21 20:20:49 +09:30
Adrian Johnson
754f431642 Allow links to specify 'dest' and 'uri'
- If a link has both 'dest' and 'uri', the 'dest' will be used if it
  exists, otherwise it will fallback to using the 'uri'.

- Ensure that a missing 'dest' does not result in an error. Instead a
  warning is printed if CAIRO_DEBUG_TAG is set, and a link to the
  current location is embedded in the PDF. ie the link does
  nothing. Cairo needs to embed a link even if no destination is
  available because when links are embedded at the end of the
  document, the content stream already contains link tags.

- Remove cairo_pdf_interchange_write_forward_links. This code was
  originally used prior to !463 when cairo wrote the links at the end
  of each page. Now the links are written at the end of the document
  so there are no longer any forward links with an unknown
  destination, unless the destination does not exist.

- When 'internal' is not used, use the 'dest' name to reference the
  link. Ensure non ASCII names are correctly encoded.
2024-05-11 19:52:02 +09:30
Behdad Esfahbod
10fffac83c [pdf] Set both fill and stroke colors in show_text_glyphs
Since a user-font might be calling stroke, and PDF has separate
stroke and fill colors.

Note that this bug was not exposed in Poppler. It's probably a
bug there. But multiple other viewers expoed this bug.

Fixes https://gitlab.freedesktop.org/cairo/cairo/-/issues/813
2023-11-30 21:54:07 -05:00
Bobby Rong
50c5f3cc76 Fix building with -Werror=format-security
../src/cairo-pdf-surface.c: In function '_cairo_pdf_surface_open_content_stream':
../src/cairo-pdf-surface.c:2537:45: error: format not a string literal and no format arguments [-Werror=format-security]
 2537 |                                             str);
      |                                             ^~~
cc1: some warnings being treated as errors
2023-09-02 00:46:45 +00:00
Adrian Johnson
de9452438e pdf: Don't use snprintf() to print floats
It is not locale independent.
2023-04-18 18:27:12 +09:30
Adrian Johnson
b53b48116e Make cairo_tag_begin/end work correctly in groups
Fixes #508
2023-04-18 18:27:12 +09:30
Khaled Hosny
288843ef5d Fix -Wsometimes-uninitialized warning
../src/cairo-pdf-surface.c:2505:9: warning: variable 'status' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
    if (surface->base.status != CAIRO_STATUS_SUCCESS)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../src/cairo-pdf-surface.c:2573:9: note: uninitialized use occurs here
    if (status == CAIRO_STATUS_SUCCESS)
        ^~~~~~
../src/cairo-pdf-surface.c:2505:5: note: remove the 'if' if its condition is always false
    if (surface->base.status != CAIRO_STATUS_SUCCESS)
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../src/cairo-pdf-surface.c:2497:5: note: variable 'status' is declared here
    cairo_status_t status, status2;
    ^
2023-02-06 11:39:08 +02:00
Adrian Johnson
79501baaa1 PDF Type 3 color fonts
This implements Type 3 color fonts for PDF for any font with a
CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE. This includes user-fonts,
SVG fonts, and COLR fonts.

Glyphs with foreground colors are not yet implemented as Type 3 glyphs
and will be rendered as images by cairo-surface.
2023-01-29 18:08:42 +10:30
Adrian Johnson
5786d960e9 Mime type updates 2023-01-28 15:02:31 +10:30
Adrian Johnson
7146358250 Fix shared use of recording surface with paginated targets
The problem is _cairo_recording_surface_replay_and_create_regions()
stores the cairo_recording_region_type_t in the same structure as the
recording commands. This does not work well when the recording surface
is used as source by multiple surfaces

Fix this by moving the cairo_recording_region_type_t into a separate
struct cairo_recording_regions_array_t. This struct is stored in a
list that allows multiple create regions results to be store in the
surface.

The new function _cairo_recording_surface_region_array_attach() is
used to create a new cairo_recording_regions_array_t, attach it to the
recording surface and return a unique region id.

The _cairo_recording_surface_replay_and_create_regions() and
_cairo_recording_surface_replay_region() functions use this region id
to identify the cairo_recording_regions_array_t.

To handle nested recording surfaces, when replaying a recording, the
region id is passed to the target as an extra parameter in the surface
pattern. The wrapper surface makes a temporary copy of the pattern to
ensure the snapshot pattern in the recording surface is not modified.

cairo_recording_regions_array_t has a reference count so the target
can hold on to the cairo_recording_regions_array_t after the paginated
surface has called _cairo_recording_surface_region_array_remove().
2023-01-15 19:29:28 +10:30
Adrian Johnson
13a0474641 Merge branch 'mingw-fixes' into 'master'
Fix mingw build failure when SVG fonts enabled

See merge request cairo/cairo!389
2023-01-03 19:03:50 +00:00
Adrian Johnson
f0ce8658f9 Fix user-font with foreground in group failures on image, PDF, and PS 2023-01-03 17:37:36 +10:30
Adrian Johnson
3d102f25c9 Use _cairo_strndup where appropriate 2023-01-03 16:01:51 +10:30
Adrian Johnson
3a60f6e138 Merge branch 'ft-svg-fonts' into 'master'
Support SVG fonts in FT backend

See merge request cairo/cairo!319
2022-12-31 09:27:57 +00:00
Jonathan Kew
4f9b637123 Fix x/y typo in _cairo_pdf_surface_analyze_operation
This can result in spuriously returning UNSUPPORTED and generating rasterized output in cases where this isn't actually necessary.
2022-12-28 13:22:00 +10:30
Uli Schlachter
53ee809ad9 cairo_pdf_version_to_string: Check for negative values
Before this commit, cairo_pdf_version_to_string() would return the
result of an out-of-bounds array access when called with a negative
value. This commit adds a check against this.

No unit test added since there are no tests for
cairo_pdf_version_to_string() that I could easily add such a test to.

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/590
Signed-off-by: Uli Schlachter <psychon@znc.in>
2022-09-16 07:47:18 +02:00
Jussi Pakkanen
ffc133f703 Add missing commas to array values. 2022-08-03 13:56:15 +03:00
Adrian Johnson
f07d539c07 Merge branch 'issue-514' into 'master'
pdf: reset current operator when resetting clip

Closes #514

See merge request cairo/cairo!256
2022-04-26 12:58:41 +00:00
Adrian Johnson
e15a1e9a06 Fix mingw warning
it doesn't like '%lld' in snprintf
2022-04-19 19:58:44 +09:30
Adrian Johnson
895b249b0a pdf: ensure filenames are correctly encoded 2022-01-16 13:49:53 +10:30
Adrian Johnson
a4d8eb98ba pdf: ensure url strings are correctly encoded
Fixes #526
2022-01-09 17:49:25 +10:30
Adrian Johnson
059f044e62 pdf: reset gstate in groups 2021-10-04 14:30:33 +10:30
Adrian Johnson
58aadd1481 pdf: reset current operator when resetting clip
PDF output uses q/Q operators to reset the clip path. This also resets
the PDF graphics state including the current blend mode.

When resetting the clip path, reset the current blend mode tracked by
the PDF surface so that if a non-default blend mode is required, the
surface will emit the correct blend mode.

Fixes #514
2021-10-03 14:48:06 +10:30
Adrian Johnson
4c520fea21 Merge branch 'custom-metadata' into 'master'
Add cairo_pdf_surface_set_custom_metadata()

See merge request cairo/cairo!240
2021-09-16 20:47:50 +00:00
Adrian Johnson
6e3c7431ff Allow > 2GB PDF files on platforms with 32-bit long 2021-09-02 18:39:53 +09:30
Adrian Johnson
0ce4c0fc29 Add cairo_pdf_surface_set_custom_metadata() 2021-08-22 13:43:34 +09:30
Adrian Johnson
ca1fb44dd3 pdf links: fix forward references to dest names with 'internal' flag 2021-07-29 07:31:31 +09:30
Adrian Johnson
4e3f6bf0c2 Merge branch 'pdf-object-streams' into 'master'
pdf: use cross-reference stream for PDF >= 1.5

See merge request cairo/cairo!197
2021-07-28 20:27:45 +00:00
Adrian Johnson
6fbfc9d927 pdf: use floating point widths when emitting fonts 2021-07-27 20:13:23 +00:00
Adrian Johnson
90193cc3a2 pdf: convert all document interchange features to use object streams 2021-07-26 18:31:57 +09:30
Adrian Johnson
bd514f6b08 pdf: add support for object streams for PDF >= 1.5
This allows all objects that were previously emitted uncompressed to
be compressed into a an object stream.

Currently only /Page, /Pages, and /Catalog have been converted to use
object streams.
2021-07-26 18:31:47 +09:30
Adrian Johnson
0f382eb087 pdf: use cross-reference stream for PDF >= 1.5
This reduces the output size and is required for object streams.
2021-07-26 18:31:33 +09:30
Adrian Johnson
f7c7bcb603 tags: allow links to page numbers not yet created
Previously, forward references were required to use named destinations.

This patch is based on the patch in #336 by Guillaume Ayoub <guillaume.ayoub@kozea.fr>
that converted all links to indirect objects written at the end of the document.

I have reworked the patch so that only forward references to future page numbers are
written as indirect objects. Backward references and named destinations remain as they
are. This is to minimize the number of objects written to the PDF file.

Fixes #336
2021-07-24 21:33:09 +09:30
Uli Schlachter
2fbd53a6b3 pdf: Properly pass on stdio write errors
cairo-pdf was silently ignoring write errors in
_cairo_pdf_surface_finish(). Any write errors that happened here ended
up setting a "status" variable, but the value in this variable was then
unused.

This commit fixes this bug by passing this error on to the caller.

Additionally, this also adds a test case for this behaviour based on
writing to /dev/full. This file is non-standard and thus the test first
checks that this file exists and is writable before trying to write to
it.

This bug was found based on a report from Knut Petersen [0].

[0]: https://lists.cairographics.org/archives/cairo/2021-July/029281.html

Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-07-23 17:22:16 +02:00
Adrian Johnson
1c64d2635b Remove all gstate from _cairo_surface_tag
The gstate is not required and was causing some tag operations to be
ignored.
2021-07-18 18:13:10 +09:30
Uli Schlachter
a3b69a0215 pdf font subset: Generate valid font names
A hash value is encoded in base 26 with upper case letters for font
names.

Commit ed984146 replaced "numerator = abs (hash);" with "numerator =
hash;" in this code, because hash has type uint32_t and the compiler
warned about taking the absolute value of an unsigned value.  However,
abs() is actually defined to take an int argument. Thus, there was some
implicit cast.

Since numerator has type long, i.e. is signed, it is now actually
possible to get an overflow in the implicit cast and then have a
negative number. The following code is not prepared for this and
produces non-letters when encoding the hash.

This commit fixes that problem by not using ldiv() and instead using /
and % to directly compute the needed values. This gets rid of the need
to convert to type long. Since now everything works with uint32_t, there
is no more chance for negative numbers messing things up.

Fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/449
Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-02-09 16:54:35 +01:00
Uli Schlachter
4e2e876be1 'Fix' a NULL pointer 'dereference' in cairo-pdf-surface
The expression &image_surface->base basically just casts the
cairo_image_surface_t* to cairo_surface_t*. However, technically it is a
NULL pointer dereference and UndefinedBehaviorSanitizer flags it as
such:

runtime error: member access within null pointer of type 'cairo_image_surface_t' (aka 'struct _cairo_image_surface')

This commit fixes this by adding a NULL check.

Signed-off-by: Uli Schlachter <psychon@znc.in>
2021-01-17 20:59:58 +01:00
Félix Poisot
8913b6e2fc The array introduced in bff47b43 isn't cleared on surface finish 2020-11-21 11:58:59 +00:00
George Matsumura
ed98414686 build: Fix various compiler warnings
This fixes a few compiler warnings that were encountered with gcc 9.3.0.

Signed-off-by: George Matsumura <gmmatsumura01@bvsd.org>
2020-11-07 06:45:01 -07:00
Adrian Johnson
4c8813f0ea pdf: add missing flush
Issue #342
2018-10-25 18:46:17 +10:30
Bryce Harrington
bf597b8928 Revert "Correctly decode Adobe CMYK JPEGs in PDF export"
From further testing and investigation it appears that many PDF viewers
already have a workaround to invert Adobe CMYK JPEGs, so our generated
PDFs display incorrectly with those viewers due to double-inversion.

Further investigation will be needed to find a better solution that
doesn't cause regression for some PDF viewers; perhaps PDF viewers that
lack this inversion workaround should be changed to include it.  For now
we'll drop the patch to avoid shipping the regression in 1.16.0.

This reverts commit b207a932a2.

Reference: https://bugs.freedesktop.org/show_bug.cgi?id=97612
Fixes: https://gitlab.freedesktop.org/cairo/cairo/issues/156
2018-10-16 09:53:00 -07:00
Bryce Harrington
9b0355a591 pdf: Fix potential null ptr deref when creating smask groups (CID #1159559)
Patch 37a22669 improved performance by using bounding box extents.
However, the code appears to be incorrect.  If extents is non-NULL it
copies its contents to group->extents, otherwise it sets group->extents
to sensible defaults, but then goes ahead and tries to copy the
undefined contents.  This second copy is unnecessary if extents is
non-NULL and will cause a crash if it is NULL.

Drop the extra copy, guessing it's just a typo.

Coverity ID: #1159559
Signed-off-by: Bryce Harrington <bryce@bryceharrington.org>
Reviewed-By: Uli Schlachter <psychon@znc.in>
2018-06-13 15:21:50 -07:00
Adrian Johnson
1998239387 Use _cairo_malloc instead of malloc
_cairo_malloc(0) always returns NULL, but has not been used
consistently.  This patch replaces many calls to malloc() with
_cairo_malloc().

Fixes:  fdo# 101547
CVE: CVE-2017-9814 Heap buffer overflow at cairo-truetype-subset.c:1299
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2018-05-07 16:35:51 -07:00
Unknown
12cb59be7d Cairo trivial typos
Found using `codespell -q 3 -I cairo-whitelist.txt`
whereby whitelist contained:
```
amin
iff
lod
writen
```

Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
2018-04-02 17:46:58 -07:00
Adrian Johnson
a709197121 pdf: fix some annotation bugs
- each annotation was emitted on every page instead of just the page
  that contains the annotation

- the document structure did not correctly link to annotation objects

- fix some annotation related memory leaks
2017-11-26 13:03:18 +10:30