1/*
2 * Test program, which tests negative strides in compositing with fence_malloc
3 * to check for out-of-bounds memory access.
4 */
5#include "utils.h"
6
7#if FENCE_MALLOC_ACTIVE
8
9#include <stdio.h>
10#include <stdlib.h>
11#include <sys/mman.h>
12
13typedef struct
14{
15    int                     width;
16    int                     height;
17    int                     stride;
18    pixman_format_code_t    format;
19} image_info_t;
20
21typedef struct
22{
23    pixman_op_t     op;
24
25    image_info_t    src;
26    image_info_t    dest;
27
28    int             src_x;
29    int             src_y;
30    int             dest_x;
31    int             dest_y;
32    int             width;
33    int             height;
34} composite_info_t;
35
36const composite_info_t info =
37{
38    PIXMAN_OP_SRC,
39    { 16, 1000, -16, PIXMAN_a8r8g8b8 },
40    { 16, 1000, -16, PIXMAN_a8r8g8b8 },
41    0, 0,
42    0, 0,
43    16, 1000
44};
45
46static pixman_image_t *
47make_image (const image_info_t *info, char **buf)
48{
49    int size = info->height * abs (info->stride);
50    char *data = fence_malloc (size);
51    int i;
52
53    for (i = 0; i < size; ++i)
54        data[i] = (i % 255) ^ (((i % 16) << 4) | (i & 0xf0));
55
56    *buf = data;
57    if (info->stride < 0)
58        /* Move to the start of the last scanline. */
59        data += size + info->stride;
60
61    return pixman_image_create_bits (info->format,
62                                     info->width,
63                                     info->height,
64                                     (uint32_t *)data,
65                                     info->stride);
66}
67
68static void
69test_composite (const composite_info_t *info)
70{
71    char *src_buf;
72    char *dest_buf;
73    pixman_image_t *src = make_image (&info->src, &src_buf);
74    pixman_image_t *dest = make_image (&info->dest, &dest_buf);
75
76    pixman_image_composite (PIXMAN_OP_SRC, src, NULL, dest,
77                            info->src_x, info->src_y,
78                            0, 0,
79                            info->dest_x, info->dest_y,
80                            info->width, info->height);
81
82    fence_free (src_buf);
83    fence_free (dest_buf);
84    pixman_image_unref (src);
85    pixman_image_unref (dest);
86}
87
88int
89main (int argc, char **argv)
90{
91    test_composite (&info);
92
93    return 0;
94}
95
96#else /* FENCE_MALLOC_ACTIVE */
97
98int
99main (int argc, char **argv)
100{
101    /* Automake return code for test SKIP. */
102    return 77;
103}
104
105#endif /* FENCE_MALLOC_ACTIVE */
106