Skip to content

imagetops passes a NULL image to cfImageClose #79

Open

Description

@kimaiden1984-boop

Summary

When image opening fails, ppdFilterImageToPS() calls cfImageClose(img) while img == NULL. cfImageClose() immediately dereferences img->cachefile.

Reproduction

Build current upstream with ASan/UBSan. A compact binary PGM is sufficient to reach the image-open failure path in the tested build:

printf 'P5\n1 1\n255\n\001' > document.ppm
ASAN_OPTIONS=detect_leaks=0 PPD=candidate.ppd CONTENT_TYPE=image/x-portable-anymap 
  imagetops 1 fuzzer fuzzer 1 'Resolution=300dpi PageSize=Letter' document.ppm >/dev/null

Result

Reproduced through the real imagetops CLI with an ASan/UBSan build from libppd HEAD 522af8dd135f4dde66b1aac8b9d067808bbe122d and libcupsfilters HEAD d63939da08eaef622a2443b7c9638d22c4d9831d on 2026-07-19. ASan reports a SEGV in cupsfilters/image.c:75 (cfImageClose), called by ppd/imagetops-pstops.c:1181.

Cause and expected behavior

This is an error-cleanup bug: the image-open operation has already returned NULL, but its cleanup path dereferences that NULL value. Do not call cfImageClose for NULL, or make it tolerate NULL, and return a normal filter error.

Activity

  1. kimaiden1984-boop commented on Jul 19, 2026

    @kimaiden1984-boop
    Author

    Exact reproduction files:

    Decode candidate.ppd and document.ppm
    base64 -d > candidate.ppd <<'EOF'
    KlBQRC1BZG9iZTogIjQuMyIKKkZvcm1hdFZlcnNpb246ICI0LjMiCipGaWxlVmVyc2lvbjogIjEu
    MCIKKkxhbmd1YWdlVmVyc2lvbjogRW5nbGlzaAoqTGFuZ3VhZ2VFbmNvZGluZzogSVNPTGF0aW4x
    CipNYW51ZmFjdHVyZXI6ICJPcGVuUHJpbnRpbmciCipNb2RlbE5hbWU6ICJjdXBzLWZpbHRlcnMg
    ZnV6eiBwcm9maWxlIgoqU2hvcnROaWNrTmFtZTogImN1cHMtZmlsdGVycyBmdXp6IgoqTmlja05h
    bWU6ICJjdXBzLWZpbHRlcnMgZnV6eiBwcm9maWxlIgoqUENGaWxlTmFtZTogIkZVWlouUFBEIgoq
    UHJvZHVjdDogIihjdXBzLWZpbHRlcnMgZnV6eiBwcm9maWxlKSIKKlBTVmVyc2lvbjogIigzMDEw
    KSAwIgoqY3Vwc1ZlcnNpb246IDEuMAoqY3Vwc01vZGVsTnVtYmVyOiAyCipjdXBzTWFudWFsQ29w
    aWVzOiBGYWxzZQoqY3Vwc0ZpbHRlcjogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAwIGltYWdl
    dG9wcyIKKk9wZW5VSSAqUGFnZVNpemU6IFBpY2tPbmUKKkRlZmF1bHRQYWdlU2l6ZTogTGV0dGVy
    CipQYWdlU2l6ZSBBNC9BNDogIjw8L1BhZ2VTaXplWzU5NSA4NDJdL0ltYWdpbmdCQm94IG51bGw+
    PnNldHBhZ2VkZXZpY2UiCipQYWdlU2l6ZSBMZXR0ZXIvTGV0dGVyOiAiPDwvUGFnZVNpemVbNjEy
    IDc5Ml0vSW1hZ2luZ0JCb3ggbnVsbD4+c2V0cGFnZWRldmljZSIKKkNsb3NlVUk6ICpQYWdlU2l6
    ZQoqRGVmYXVsdEltYWdlYWJsZUFyZWE6IDE4IDM2IDU5NCA3NTYKKkltYWdlYWJsZUFyZWEgQTQ6
    ICIxMiAxMiA1ODMgODMwIgoqSW1hZ2VhYmxlQXJlYSBMZXR0ZXI6ICIxOCAzNiA1OTQgNzU2Igoq
    RGVmYXVsdFBhcGVyRGltZW5zaW9uOiA2MTIgNzkyCipQYXBlckRpbWVuc2lvbiBBNDogIjU5NSA4
    NDIiCipQYXBlckRpbWVuc2lvbiBMZXR0ZXI6ICI2MTIgNzkyIgoqT3BlblVJICpDb2xvck1vZGVs
    OiBQaWNrT25lCipEZWZhdWx0Q29sb3JNb2RlbDogUkdCCipDb2xvck1vZGVsIEdyYXkvR3JheTog
    Ijw8L2N1cHNDb2xvclNwYWNlIDE4L2N1cHNCaXRzUGVyQ29sb3IgOC9jdXBzQml0c1BlclBpeGVs
    IDg+PnNldHBhZ2VkZXZpY2UiCipDb2xvck1vZGVsIFJHQi9SR0I6ICI8PC9jdXBzQ29sb3JTcGFj
    ZSAxL2N1cHNCaXRzUGVyQ29sb3IgOC9jdXBzQml0c1BlclBpeGVsIDI0Pj5zZXRwYWdlZGV2aWNl
    IgoqQ29sb3JNb2RlbCBDTVlLL0NNWUs6ICI8PC9jdXBzQ29sb3JTcGFjZSA2L2N1cHNCaXRzUGVy
    Q29sb3IgOC9jdXBzQml0c1BlclBpeGVsIDMyPj5zZXRwYWdlZGV2aWNlIgoqQ2xvc2VVSTogKkNv
    bG9yTW9kZWwKKk9wZW5VSSAqUmVzb2x1dGlvbjogUGlja09uZQoqRGVmYXVsdFJlc29sdXRpb246
    IDYwMGRwaQoqUmVzb2x1dGlvbiAzMDBkcGkvMzAwIGRwaTogIjw8L0hXUmVzb2x1dGlvblszMDAg
    MzAwXT4+c2V0cGFnZWRldmljZSIKKlJlc29sdXRpb24gNjAwZHBpLzYwMCBkcGk6ICI8PC9IV1Jl
    c29sdXRpb25bNjAwIDYwMF0+PnNldHBhZ2VkZXZpY2UiCipDbG9zZVVJOiAqUmVzb2x1dGlvbgo=
    EOF
    base64 -d > document.ppm <<'EOF'
    UDUKMSAxCjI1NQoB
    EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions