diff --git a/cursor/os-compatibility.c b/cursor/os-compatibility.c index 002bb5cd88c5063a0c5f8d41e938b859ce4f7aaf..9eac22978863ffe0350380a16b80e6feb49405b3 100644 --- a/cursor/os-compatibility.c +++ b/cursor/os-compatibility.c @@ -119,7 +119,6 @@ os_create_anonymous_file(off_t size) const char *path; char *name; int fd; - int ret; #ifdef HAVE_MEMFD_CREATE fd = memfd_create("wayland-cursor", MFD_CLOEXEC | MFD_ALLOW_SEALING); @@ -155,25 +154,30 @@ os_create_anonymous_file(off_t size) return -1; } + if (os_resize_anonymous_file(fd, size) < 0) { + close(fd); + return -1; + } + + return fd; +} + +int +os_resize_anonymous_file(int fd, off_t size) +{ #ifdef HAVE_POSIX_FALLOCATE /* * Filesystems that do support fallocate will return EINVAL or * EOPNOTSUPP. In this case we need to fall back to ftruncate */ - ret = posix_fallocate(fd, 0, size); - if (ret == 0) { - return fd; - } else if (ret != EINVAL && ret != EOPNOTSUPP) { - close(fd); - errno = ret; + errno = posix_fallocate(fd, 0, size); + if (errno == 0) + return 0; + else if (errno != EINVAL && errno != EOPNOTSUPP) return -1; - } #endif - ret = ftruncate(fd, size); - if (ret < 0) { - close(fd); + if (ftruncate(fd, size) < 0) return -1; - } - return fd; + return 0; } diff --git a/cursor/os-compatibility.h b/cursor/os-compatibility.h index d0e69acd939e6928cd9cf3321ffad70a71fdb163..fdfeb78b143309915956de3ea92303776a3743b0 100644 --- a/cursor/os-compatibility.h +++ b/cursor/os-compatibility.h @@ -31,4 +31,7 @@ int os_create_anonymous_file(off_t size); +int +os_resize_anonymous_file(int fd, off_t size); + #endif /* OS_COMPATIBILITY_H */ diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c index ca5be8ddb4b45261f8af6a9fe74e0bd68764dce3..4e2dc5020a5376f9bc570dbbc4c2a30dc7d14222 100644 --- a/cursor/wayland-cursor.c +++ b/cursor/wayland-cursor.c @@ -83,17 +83,7 @@ err_free: static int shm_pool_resize(struct shm_pool *pool, int size) { -#ifdef HAVE_POSIX_FALLOCATE - /* - * Filesystems that do support fallocate will return EINVAL or - * EOPNOTSUPP. In this case we need to fall back to ftruncate - */ - errno = posix_fallocate(pool->fd, 0, size); - if (errno != 0 && errno != EINVAL && errno != EOPNOTSUPP) - return 0; -#endif - - if (ftruncate(pool->fd, size) < 0) + if (os_resize_anonymous_file(pool->fd, size) < 0) return 0; wl_shm_pool_resize(pool->pool, size);