aboutsummaryrefslogtreecommitdiffstats
path: root/cursor/xcursor.c
Commit message (Collapse)AuthorAgeFilesLines
* cursor: Ignore invalid cursor filesTobias Stoeckmann2025-06-081-0/+2
| | | | | | | The header offset must not be smaller than file header length. Ignore such invalid files. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
* cursor: Gracefully handle out of memory conditionTobias Stoeckmann2025-06-081-1/+5
| | | | | | | If the full path could not be constructed, avoid calling opendir(NULL) which, depending on library, might trigger undefined behavior. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
* cursor: Fix undefined behavior with huge namesTobias Stoeckmann2025-06-081-1/+1
| | | | | | | | | | | If an index.theme contains a theme name which gets close to INT_MAX, then creation of full path can lead to a signed integer overflow, which is undefined behavior. Fix this by turning one of the values to size_t. Easy solution for a probably never occurring issue. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
* Fix typosTobias Stoeckmann2025-05-201-3/+3
| | | | | | Typos found with codespell and during code audit. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
* xcursor: catch theme inheritance loopsChloé Vulquin2024-04-241-24/+66
| | | | | | | | | | | | | | | | | | | | | | | As of currently, when an xcursor theme depends on itself or another theme that will eventually depend on it, `xcursor_load_theme` will recurse infinitely while processing the inherits. This change introduces a stack-allocated linked list of visited nodes by name, and skips any already visited nodes in the inherit list. Side effects: * Since the linked list is stack-allocated, there is a potential for an overflow if there is a very long list of dependencies. If this turns out to be a legitimate concern, the linked list is trivial to convert to being heap-allocated. * There is an existing linked list (technically doubly linked list) implementation in the wayland codebase. As of currently, the xcursor codebase does not refer to it. Consequently, this change writes a minimal single linked list implementation to utilize directly. This changeset fixes #317. Signed-off-by: Chloé Vulquin <toast@bunkerlabs.net>
* cursor: check return value of snprintf()Simon Ser2023-08-021-1/+6
| | | | | | | | | | | | | | | | | | | | Fixes a new warning in GCC 7: FAILED: cursor/libwayland-cursor.so.0.22.90.p/xcursor.c.o cc -Icursor/libwayland-cursor.so.0.22.90.p -Icursor -I../cursor -I. -I.. -Isrc -I../src -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Werror -std=c99 -O3 -D_POSIX_C_SOURCE=200809L -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -fvisibility=hidden -fPIC '-DICONDIR="/usr/share/X11/icons"' -MD -MQ cursor/libwayland-cursor.so.0.22.90.p/xcursor.c.o -MF cursor/libwayland-cursor.so.0.22.90.p/xcursor.c.o.d -o cursor/libwayland-cursor.so.0.22.90.p/xcursor.c.o -c ../cursor/xcursor.c ../cursor/xcursor.c: In function 'xcursor_load_theme': ../cursor/xcursor.c:596:39: error: '%s' directive output between 7 and 7 bytes may cause result to exceed 'INT_MAX' [-Werror=format-truncation=] 596 | snprintf(full, full_size, "%s/%s/%s", dir, subdir, file); | ^~ ...... 764 | full = xcursor_build_fullname(dir, "cursors", ""); | ~~~~~~~~~ ../cursor/xcursor.c:596:41: error: '/' directive output between 1 and 1 bytes may cause result to exceed 'INT_MAX' [-Werror=format-truncation=] 596 | snprintf(full, full_size, "%s/%s/%s", dir, subdir, file); | ^ cc1: all warnings being treated as errors Signed-off-by: Simon Ser <contact@emersion.fr>
* Check that XDG base directories paths are absoluteAntonin Décimo2022-06-091-1/+1
| | | | | | | | | | | | | | | | | | | The [spec][1] reads: > All paths set in these environment variables must be absolute. If an > implementation encounters a relative path in any of these variables it should > consider the path invalid and ignore it. and > If $XDG_DATA_HOME is either not set or empty, a default equal to > $HOME/.local/share should be used. Testing that the path is absolute also entails that is is non-empty. [1]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html Signed-off-by: Antonin Décimo <antonin.decimo@gmail.com>
* cursor: move xcursor_theme_inherits declarations at the topSimon Ser2022-05-271-2/+4
| | | | | | | | Per code style, declarations need to be at the start of the block. And make l const while at it. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop xcursor_add_path_eltSimon Ser2022-05-271-38/+13
| | | | | | | Just use snprintf instead. It doesn't really matter if we have some duplicate slashes in filenames. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop unused XCursor comment declarationsSimon Ser2022-05-271-33/+0
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix indentation of xcursor_load_theme declarationSimon Ser2022-05-271-2/+2
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: simplify xcursor_library_pathSimon Ser2022-05-271-16/+16
| | | | | | | | | | - Use early returns - De-duplicate XDG_DATA_HOME code-paths - Don't crash on allocation failure - Use size_t when appropriate - Fix indentation Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove unnecessary ifs in xcursor_load_themeSimon Ser2022-05-271-10/+5
| | | | | | | load_all_cursors_from_dir and xcursor_theme_inherits already have the NULL checks we want. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop xcursor_images_set_nameSimon Ser2022-05-271-19/+1
| | | | | | | | We don't ever need to set the name multiple times for a single struct xcursor_images, so we can just set the field directly. Also replace the hand-rolled logic with strdup. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: use getline instead of fgetsSimon Ser2022-05-271-2/+5
| | | | | | | This avoids storing 8KiB on the stack, and removes the line length limit. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove unnecessary parentheses in load_all_cursors_from_dirSimon Ser2022-05-271-1/+2
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove xcursor_file_load_images wrapperSimon Ser2022-05-271-10/+1
| | | | | | It's just calling xcursor_xc_file_load_images. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: rename local variables to snake caseSimon Ser2022-05-231-75/+75
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop xcursor_file abstractionSimon Ser2022-05-231-50/+10
| | | | | | Just use FILE * directly instead. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: refactor xcursor_theme_inheritsSimon Ser2022-05-231-29/+33
| | | | | | | Use early returns and breaks to avoid dealing with very long indentation lines. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: convert macros to functionsSimon Ser2022-05-231-3/+16
| | | | | | | | Improves readability since there's no need for so many parentheses anymore, adds type safety. The compiler will inline the function automatically as necessary. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: rename functions to snake caseSimon Ser2022-05-231-96/+96
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix whitespace in function args definitionsSimon Ser2022-05-231-15/+13
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove struct typedefs, rename to snake caseSimon Ser2022-05-231-69/+67
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix spacing around conditions and loopsSimon Ser2022-05-231-53/+33
| | | | Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix indentationSimon Ser2022-05-231-409/+409
| | | | | | Use tabs. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove unnecessary if before freeSimon Ser2022-05-231-7/+3
| | | | | | free(NULL) is valid and is a no-op. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix variable declaration styleSimon Ser2022-05-231-46/+46
| | | | | | Use a single space between type and variable name. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix struct declaration styleSimon Ser2022-05-231-21/+21
| | | | | | Use tabs for indentation, don't use tabs to align field names. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix define styleSimon Ser2022-05-231-18/+18
| | | | | | Don't use tabs, don't align. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop whitespace before parens in function callsSimon Ser2022-05-231-124/+124
| | | | | | This is in line with the rest of the Wayland code style. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop XCURSOR_LIB_* definesSimon Ser2022-05-231-12/+0
| | | | | | These are unused. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: drop XcursorTrue and XcursorFalseSimon Ser2022-05-231-20/+13
| | | | | | Just use <stdbool.h> instead. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: remove private Xcursor int typedefsSimon Ser2022-05-231-34/+35
| | | | | | Just use the types directly instead. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: Remove unused XcursorLibraryLoadImages() functionVlad Zahorodnii2022-02-051-77/+0
| | | | | | | XcursorLibraryLoadImages() function is unused and not exported according to objdump, so its removal should be an ABI compatible change. Signed-off-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
* build: don't rely on implicit GNU extensionsSimon Ser2022-01-101-0/+1
| | | | | | | | | Currently libwayland assumes GNU extensions will be available, but doesn't define the C standard to use. Instead, let's unconditionally enable POSIX extensions, and enable GNU extensions on a case-by-case basis as needed. Signed-off-by: Simon Ser <contact@emersion.fr>
* cursor: fix CVE-2013-2003Tobias Stoeckmann2021-05-021-1/+1
| | | | | | | | | | The libXcursor fix for CVE-2013-2003 has never been imported into wayland, leaving it vulnerable to it. Changing the argument type to an unsigned type is an effective merge of Ilja Van Sprundel's commit in libXcursor. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
* cursor: add one more directory to XCURSORPATHAlexander Dunaev2021-04-271-8/+42
| | | | | | | | | | | | | | | | The user may install cursor themes manually, and the desktop environment may provide a special directory for storing them. For instance, GTK puts those themes into ~/.local/share/icons, and many Linux distributions suggest using that directory for user-specific themes. However, users of libwayland-cursor cannot load these themes using the API provided by the library because the latter does not look into that directory. This patch adds ~/.local/share/icons to the search path, so user-specific themes can be loaded through the API provided by libwayland-cursor. Signed-off-by: Alexander Dunaev <adunaev@igalia.com> Reviewed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Reviewed-by: Simon Ser <contact@emersion.fr>
* Fix undefined behaviorValentin2020-09-041-4/+5
| | | | | | | | Without the casts the bytes accesses get converted to int. but int is not guaranteed to be 4 bytes large. Even when it is 4 bytes large `bytes[3] << 24` does not fit because int is signed. Signed-off-by: Valentin Kettner <vakevk@gmail.com>
* cursor: Fix heap overflows when parsing malicious files.Tobias Stoeckmann2017-11-291-1/+7
| | | | | | | | | | | | | | | | | It is possible to trigger heap overflows due to an integer overflow while parsing images. The integer overflow occurs because the chosen limit 0x10000 for dimensions is too large for 32 bit systems, because each pixel takes 4 bytes. Properly chosen values allow an overflow which in turn will lead to less allocated memory than needed for subsequent reads. See also: https://cgit.freedesktop.org/xorg/lib/libXcursor/commit/?id=4794b5dd34688158fb51a2943032569d3780c4b8 Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=103961 Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> [Pekka: add link to the corresponding libXcursor commit] Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
* xcursor: Change keithp licensed code from X11 to Expat licenseBryce Harrington2015-06-121-16/+19
| | | | | | | | | | | The license text for this file mentions Keith Packard specifically, however it is otherwise identical to all the other MIT X11 licensed code in Wayland, and so can be changed to the substantially identical MIT Expat license. Signed-off-by: Bryce Harrington <bryce@osg.samsung.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Acked-by: Keith Packard <keithp@keithp.com>
* xcursor: don't proceed if XcursorImageCreate failedU. Artie Eoff2014-01-151-0/+2
| | | | Signed-off-by: U. Artie Eoff <ullysses.a.eoff@intel.com>
* xcursor: Fix allocation based on string lengthRob Bradford2012-10-091-1/+1
| | | | | | | | strlen() doesn't include the terminating NUL. Therefore when allocating a block of memory to hold something equivalent to the length of the string we must increment to take the NUL byte into consideration. Signed-off-by: Rob Bradford <rob@linux.intel.com>
* Add support for X cursor themes.Christopher Michael2012-08-131-1/+1
| | | | | | | | | This patch adds a few more directories to search for xcursor themes. Along with the weston patch, this adds the ability to configure weston to use an X11 cursor theme. Previously, wayland cursor would just look in the icons and pixmaps directories for cursor images to load. This adds the ability to also search in the x cursors directory.
* Don't skip the first directory entry when reading cursors.Dima Ryazanov2012-07-261-1/+0
| | | | I end up missing the "bottom_right_corner" cursor.
* wayland-cursor: Plug leak of filename on load_all_cursors_from_dir()Ander Conselvan de Oliveira2012-06-191-1/+4
|
* Xcursor: Don't ignore unknown file typesDaniel Stone2012-06-181-1/+2
| | | | | | | | | XFS doesn't return the file type with opendir(), and instead only returns it when you stat() the file itself. c66f2602 introduced a check to ensure that only files and symlinks were loaded, while not checking for DT_UNKNOWN. Properly handle DT_UNKNOWN by just proceeding anyway. Signed-off-by: Daniel Stone <daniel@fooishbar.org>
* wayland-cursor: load all cursors from a theme on wl_cursor_theme_loadAnder Conselvan de Oliveira2012-05-251-0/+107
|
* cursor: Fix unsigned/signed comparisonsKristian Høgsberg2012-05-221-3/+3
|
* Introduce libwayland-cursor, a cursor helper libraryAnder Conselvan de Oliveira2012-05-221-0/+856
The purpose of this library is to be the equivalent of libXcursor in the X world. This library is compatible with X cursor themes and loads them directly into an shm pool making it easy for the clients to get buffer for each cursor image. The code for handling the X cursor theme was taken from libXcursor. The files cursor/xcursor.[ch] are a stripped down version of that library containing only the interfaces necessary for implementing the wayland counterpart.