Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update subtree: libglnx 2024-12-06 #6043

Merged
merged 7 commits into from
Jan 2, 2025
Prev Previous commit
Next Next commit
Add a test for glnx_shutil_mkdir_p_at with an unusable parent
This is a slight generalization of the reproducer contributed by Will
Thompson: as well as exercising the case where the parent is a dangling
symlink (reproducing GNOME/libglnx#1), this also exercises the case where
the parent is a non-directory non-symlink (in this case a regular file).

Reproduces: GNOME/libglnx#1
Co-authored-by: Will Thompson <[email protected]>
Signed-off-by: Simon McVittie <[email protected]>
  • Loading branch information
smcv and wjt committed Dec 6, 2024
commit e6151ffbc0c42736a0d506283e1cb6844a5f54ef
41 changes: 40 additions & 1 deletion tests/test-libglnx-shutil.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright © 2017 Endless OS Foundation LLC
* Copyright © 2017-2019 Endless OS Foundation LLC
* Copyright © 2024 Collabora Ltd.
* SPDX-License-Identifier: LGPL-2.0-or-later
*
* This library is free software; you can redistribute it and/or
Expand Down Expand Up @@ -29,6 +30,43 @@

#include "libglnx-testlib.h"

static void
test_mkdir_p_parent_unsuitable (void)
{
_GLNX_TEST_SCOPED_TEMP_DIR;
_GLNX_TEST_DECLARE_ERROR(local_error, error);
glnx_autofd int dfd = -1;

if (!glnx_ensure_dir (AT_FDCWD, "test", 0755, error))
return;
if (!glnx_opendirat (AT_FDCWD, "test", FALSE, &dfd, error))
return;

if (!glnx_file_replace_contents_at (dfd, "file",
(const guint8 *) "", 0,
GLNX_FILE_REPLACE_NODATASYNC,
NULL, error))
return;

if (symlinkat ("nosuchtarget", dfd, "link") < 0)
{
glnx_throw_errno_prefix (error, "symlinkat");
return;
}

glnx_shutil_mkdir_p_at (dfd, "file/baz", 0755, NULL, error);
g_test_message ("mkdir %s -> %s", "file/baz",
local_error ? local_error->message : "success");
g_assert_error (local_error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY);
g_clear_error (&local_error);

glnx_shutil_mkdir_p_at (dfd, "link/baz", 0755, NULL, error);
g_test_message ("mkdir %s -> %s", "link/baz",
local_error ? local_error->message : "success");
g_assert_error (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND);
g_clear_error (&local_error);
}

static void
test_mkdir_p_enoent (void)
{
Expand Down Expand Up @@ -58,6 +96,7 @@ main (int argc,
g_test_init (&argc, &argv, NULL);

g_test_add_func ("/mkdir-p/enoent", test_mkdir_p_enoent);
g_test_add_func ("/mkdir-p/parent-unsuitable", test_mkdir_p_parent_unsuitable);

ret = g_test_run();

Expand Down