Linux Container Development
 help / color / mirror / Atom feed
From: "Serge E. Hallyn" <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
To: Sukadev Bhattiprolu
	<sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Cc: Containers
	<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: Re: [PATCH 2/6][cr-tests]: eclone-2: Fail if selected pid is in use
Date: Tue, 2 Feb 2010 14:20:38 -0600	[thread overview]
Message-ID: <20100202202038.GB32305@us.ibm.com> (raw)
In-Reply-To: <20100202193720.GA8793-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>

Quoting Sukadev Bhattiprolu (sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org):
> 
> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> Date: Sat, 30 Jan 2010 12:51:23 -0800
> Subject: [PATCH 2/6]: eclone-2: Fail if selected pid is in use
> 
> Ensure that eclone() system call fails with -EBUSY if selected pid is
> in use.
> 
> Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>  eclone/Makefile   |    2 +-
>  eclone/eclone-2.c |  117 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 118 insertions(+), 1 deletions(-)
>  create mode 100644 eclone/eclone-2.c
> 
> diff --git a/eclone/Makefile b/eclone/Makefile
> index 43cef65..95633d1 100644
> --- a/eclone/Makefile
> +++ b/eclone/Makefile
> @@ -3,7 +3,7 @@ CFLAGS = -Wall
> 
>  LDFLAGS = 
> 
> -PROGS = eclone-1
> +PROGS = eclone-1 eclone-2

Just a few nits.  I don't see any real problems with this, but like
I said I'd like the whole set re-sent along with a user-cr patch to
make a libeclone.a or .so that these tests can link against.

>  all: $(PROGS)
> 
> diff --git a/eclone/eclone-2.c b/eclone/eclone-2.c
> new file mode 100644
> index 0000000..a52bb5e
> --- /dev/null
> +++ b/eclone/eclone-2.c
> @@ -0,0 +1,117 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <unistd.h>
> +#include <signal.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <sys/syscall.h>
> +#include "clone_args.h"
> +
> +/*
> + * Verify that eclone() fails if the selected pid is in use.
> + * We try to assign parent's pid which should already be in use.
> + */
> +int verbose = 0;
> +int child_tid, parent_tid;
> +#define	CHILD_ARG	(void *)0x979797
> +
> +pid_t pids_list[2];
> +
> +int do_child(void *arg)
> +{
> +	printf("FAIL: Child created with [%d, %d], but we expected child "
> +			"creation to fail since pid is in use\n", gettid(),
> + 			getpid());
> +	exit(2);
> +}
> +
> +static int myclone(int (*child_fn)(void *), void *child_arg, 
> +		unsigned int flags_low, int nr_pids, pid_t *pids_list)
> +{
> +	int rc;
> +	void *stack;
> +	struct clone_args ca;
> +	int args_size;
> +
> +	stack = setup_stack(child_fn, child_arg, STACKSIZE);
> +	if (!stack) {
> +		printf("ERROR: setup_stack returns NULL for size %d\n",
> +				STACKSIZE);
> +		exit(1);
> +	}
> +
> +	memset(&ca, 0, sizeof(ca));
> +	ca.child_stack_base = (u64)(int)stack;
> +	ca.child_stack_size = (u64)0;
> +	ca.parent_tid_ptr = (u64)((int)&parent_tid);
> +	ca.child_tid_ptr = (u64)((int)&child_tid);
> +	ca.nr_pids = nr_pids;
> +
> +	if (verbose) {
> +		printf("[%d, %d]: Parent:\n\t child_stack 0x%p, ptidp %llx, "
> +				"ctidp %llx, pids %p\n", getpid(), gettid(),
> +				stack, ca.parent_tid_ptr, ca.child_tid_ptr,
> +				pids_list);
> +	}
> +
> +	args_size = sizeof(struct clone_args);
> +	rc = eclone(flags_low, &ca, args_size, pids_list);
> +
> +	if (verbose) {
> +		printf("[%d, %d]: eclone() returned %d, error %d\n", getpid(),
> +				gettid(), rc, errno);
> +		fflush(stdout);
> +	}
> +
> +	if (rc < 0 && errno == EAGAIN) {
> +		printf("PASS: Unable to create a process with a pid that is "
> +			"in use\n");
> +		exit(0);
> +	} else {
> +		printf("ERROR: ");
> +		return rc;
> +	}
> +}
> +
> +int main()
> +{
> +	int rc, pid, status;
> +	unsigned long flags; 
> +	int nr_pids = 1;
> +
> +	flags = SIGCHLD|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID;
> +	flags = SIGCHLD;

Did you want to delete that first line?

> +
> +	/*
> +	 * Try to create a process with same pid as parent !
> +	 */
> +	pids_list[0] = pids_list[1] = getpid();

Any reason you're setting pids_list[1]?  Shouldn't be used, right?

> +	pid = myclone(do_child, (void *)CHILD_ARG, flags, nr_pids, pids_list);

CHILD_ARG is already cast btw

> +
> +	if (verbose) {
> +		printf("[%d, %d]: Parent waiting for %d\n", getpid(),
> +					gettid(), pid);
> +	}
> +
> +	rc = waitpid(pid, &status, __WALL);
> +	if (rc < 0) {
> +		printf("ERROR: ");
> +		verbose = 1;
> +	}
> +
> +	if (verbose) {
> +		printf("\twaitpid(): child %d, rc %d, error %d, status 0x%x\n",
> +				getpid(), rc, errno, status);
> +		if (rc >=0) {
> +			if (WIFEXITED(status)) {
> +				printf("\t EXITED, %d\n", WEXITSTATUS(status));
> +			} else if (WIFSIGNALED(status)) {
> +				printf("\t SIGNALED, %d\n", WTERMSIG(status));
> +			} 
> +		}
> +	}
> +	return 0;
> +}
> -- 
> 1.6.6.1

  parent reply	other threads:[~2010-02-02 20:20 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-02 19:35 [PATCH][cr-tests]: eclone-1: Test basic functionality Sukadev Bhattiprolu
     [not found] ` <20100202193508.GA8542-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-02-02 19:37   ` [PATCH 2/6][cr-tests]: eclone-2: Fail if selected pid is in use Sukadev Bhattiprolu
     [not found]     ` <20100202193720.GA8793-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-02-02 20:20       ` Serge E. Hallyn [this message]
2010-02-02 19:38   ` [PATCH 3/6][cr-tests]: eclone-3: Fail if reserved fields are not 0 Sukadev Bhattiprolu
     [not found]     ` <20100202193822.GB8793-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-02-02 21:09       ` Serge E. Hallyn
2010-02-02 19:39   ` [PATCH 4/6][cr-tests]: eclone-4: Fail if clone_flags_high is non-zero Sukadev Bhattiprolu
     [not found]     ` <20100202193931.GC8793-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-02-02 21:05       ` Serge E. Hallyn
2010-02-02 19:41   ` [PATCH 5/6][cr-tests]: eclone-5: nr_pids must not exceed nesting level Sukadev Bhattiprolu
     [not found]     ` <20100202194106.GD8793-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-02-02 21:09       ` Serge E. Hallyn
2010-02-02 19:43   ` [PATCH 6/6][cr-tests]: eclone/runtests.sh: Wrapper script for eclone tests Sukadev Bhattiprolu
2010-02-02 20:07   ` [PATCH][cr-tests]: eclone-1: Test basic functionality Serge E. Hallyn

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=20100202202038.GB32305@us.ibm.com \
    --to=serue-r/jw6+rmf7hqt0dzr+alfa@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
    /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