public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@redhat.com>
To: Ulrich Drepper <drepper@redhat.com>
Cc: Glibc hackers <libc-hacker@sources.redhat.com>
Subject: [PATCH] Fix mq_unlink (?), some testsuite changes
Date: Mon, 19 Apr 2004 09:32:00 -0000	[thread overview]
Message-ID: <20040419072121.GQ514@sunsite.ms.mff.cuni.cz> (raw)

Hi!

POSIX only lists EACCES error if mq_unlink fails because of permission
problems (current kernels have the mqueue directory with rwxrwxrwt
permissions, unlink is allowed to return both EPERM and EACCESS in that
case and returns EPERM).  So I think we need something like this.
If so, we also should change sem_unlink and shm_unlink in the same way.

2004-04-19  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/mq_unlink.c (mq_unlink): Change EPERM into
	EACCES.
	* rt/Makefile (tests): Add tst-mqueue9.
	* rt/tst-mqueue9.c: New test.
	* rt/tst-mqueue4.c (do_test): Add test for mq_unlink of a too long
	name component.
	* rt/tst-mqueue7.c (do_test): Make newargv const char *[] to shut up
	warnings.

--- libc/sysdeps/unix/sysv/linux/mq_unlink.c.jj	2004-04-13 04:13:56.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/mq_unlink.c	2004-04-19 11:26:46.436052520 +0200
@@ -31,7 +31,15 @@ mq_unlink (const char *name)
       __set_errno (EINVAL);
       return -1;
     }
-  return INLINE_SYSCALL (mq_unlink, 1, name + 1);
+
+  int ret = INLINE_SYSCALL (mq_unlink, 1, name + 1);
+
+  /* While unlink can return either EPERM or EACCES, mq_unlink should
+     return just EACCES.  */
+  if (ret < 0 && errno == EPERM)
+    __set_errno (EACCES);
+
+  return ret;
 }
 
 #else
--- libc/rt/Makefile.jj	2004-04-19 11:20:12.000000000 +0200
+++ libc/rt/Makefile	2004-04-19 11:20:27.234010463 +0200
@@ -44,7 +44,7 @@ librt-routines = $(aio-routines) \
 tests := tst-shm tst-clock tst-clock_nanosleep tst-timer tst-timer2 \
 	 tst-aio tst-aio64 tst-aio2 tst-aio3 tst-aio4 tst-aio5 tst-aio6 \
 	 tst-aio7 tst-mqueue1 tst-mqueue2 tst-mqueue3 tst-mqueue4 \
-	 tst-mqueue5 tst-mqueue6 tst-mqueue7 tst-mqueue8 \
+	 tst-mqueue5 tst-mqueue6 tst-mqueue7 tst-mqueue8 tst-mqueue9 \
 	 tst-timer3 tst-timer4
 
 extra-libs := librt
--- libc/rt/tst-mqueue9.c.jj	2004-04-19 11:07:29.436401922 +0200
+++ libc/rt/tst-mqueue9.c	2004-04-19 11:21:32.526309233 +0200
@@ -0,0 +1,92 @@
+/* Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <mqueue.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "tst-mqueue.h"
+
+#define TEST_FUNCTION do_test ()
+static int
+do_test (void)
+{
+  if (geteuid () != 0)
+    {
+      puts ("this test requires root");
+      return 0;
+    }
+
+  char name[sizeof "/tst-mqueue9-" + sizeof (pid_t) * 3];
+  snprintf (name, sizeof (name), "/tst-mqueue9-%u", getpid ());
+
+  struct mq_attr attr = { .mq_maxmsg = 1, .mq_msgsize = 1 };
+  mqd_t q = mq_open (name, O_CREAT | O_EXCL | O_RDWR, 0600, &attr);
+
+  if (q == (mqd_t) -1)
+    {
+      printf ("mq_open failed with: %m\n");
+      return 0;
+    }
+  else
+    add_temp_mq (name);
+
+  if (seteuid (1) != 0)
+    {
+      printf ("failed to seteuid (1): %m\n");
+      mq_unlink (name);
+      return 0;
+    }
+
+  int result;
+  if (mq_unlink (name) == 0)
+    {
+      puts ("mq_unlink unexpectedly succeeded");
+      result = 1;
+    }
+  else if (errno != EACCES)
+    {
+      printf ("mq_unlink did not fail with EACCES: %m\n");
+      result = 1;;
+    }
+
+  if (seteuid (0) != 0)
+    {
+      printf ("failed to seteuid (0): %m\n");
+      result = 1;
+    }
+
+  if (mq_unlink (name) != 0)
+    {
+      printf ("mq_unlink failed with: %m\n");
+      result = 1;
+    }
+
+  if (mq_close (q) != 0)
+    {
+      printf ("mq_close failed with: %m\n");
+      result = 1;
+    }
+
+  return result;
+}
+
+#include "../test-skeleton.c"
--- libc/rt/tst-mqueue4.c.jj	2004-04-13 04:06:21.000000000 +0200
+++ libc/rt/tst-mqueue4.c	2004-04-19 11:11:33.448671746 +0200
@@ -93,6 +93,18 @@ do_test (void)
       result = 1;
     }
 
+  if (mq_unlink (name) == 0)
+    {
+      puts ("mq_unlink with too long name component unexpectedly succeeded");
+      result = 1;
+    }
+  else if (errno != ENAMETOOLONG)
+    {
+      printf ("mq_unlink with too long name component did not fail with "
+	      "ENAMETOOLONG: %m\n");
+      result = 1;
+    }
+
   *p = '\0';
   attr.mq_maxmsg = 1;
   attr.mq_msgsize = 3;
--- libc/rt/tst-mqueue7.c.jj	2004-04-19 11:05:40.022010405 +0200
+++ libc/rt/tst-mqueue7.c	2004-04-19 11:05:40.022010405 +0200
@@ -93,7 +93,7 @@ do_test (int argc, char **argv)
   snprintf (after_exec_arg, sizeof (after_exec_arg),
 	    "--after-exec=0x%lx", (long) q);
 
-  char *newargv[argc + 2];
+  const char *newargv[argc + 2];
   for (int i = 1; i < argc; ++i)
     newargv[i - 1] = argv[i];
   newargv[argc - 1] = "--direct";

	Jakub

             reply	other threads:[~2004-04-19  9:32 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-19  9:32 Jakub Jelinek [this message]
2004-04-19 17:30 ` Ulrich Drepper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040419072121.GQ514@sunsite.ms.mff.cuni.cz \
    --to=jakub@redhat.com \
    --cc=drepper@redhat.com \
    --cc=libc-hacker@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).