Re: [pull] some sys-utils improvements

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 14, 2011 at 10:21:53AM -0300, Davidlohr Bueso wrote:
> On Tue, 2011-09-13 at 23:13 +0200, Sami Kerola wrote:
> Please try the following patch, it fixed it for me. In the case when the
> errors were shown, the msgctl(2) was returning 0 (success), so errno
> shouldn't be checked. Remember, this isn't reseted afterwards, so we are
> running into bogus messages (the msgid's are being correctly deleted).
> 
> Thanks,
> Davidlohr
> 
> From 952d6100c28505005c0a335e3e64f384bd941859 Mon Sep 17 00:00:00 2001
> From: Davidlohr Bueso <dave@xxxxxxx>
> Date: Wed, 14 Sep 2011 10:17:15 -0300
> Subject: [PATCH] ipcrm: check IPC syscalls
> 
> It's not enough to check errno for errors as the variable is not reset, we also need to check the last syscall return value to verify a problem.
> This addresses bogus msgqueue errors when deleting keys.
> 
> Signed-off-by: Davidlohr Bueso <dave@xxxxxxx>
> ---
>  sys-utils/ipcrm.c |    9 +++++----
>  1 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/sys-utils/ipcrm.c b/sys-utils/ipcrm.c
> index a8d6623..c794cbe 100644
> --- a/sys-utils/ipcrm.c
> +++ b/sys-utils/ipcrm.c
> @@ -65,6 +65,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
>  
>  int remove_id(int type, int iskey, int id)
>  {
> +	int ret;
>  	char *errmsg;
>  	/* needed to delete semaphores */
>  	union semun arg;
> @@ -75,24 +76,24 @@ int remove_id(int type, int iskey, int id)
>  	case SHM:
>  		if (verbose)
>  			printf(_("removing shared memory segment id `%d'\n"), id);
> -		shmctl(id, IPC_RMID, NULL);
> +		ret = shmctl(id, IPC_RMID, NULL);
>  		break;
>  	case MSG:
>  		if (verbose)
>  			printf(_("removing message queue id `%d'\n"), id);
> -		msgctl(id, IPC_RMID, NULL);
> +		ret = msgctl(id, IPC_RMID, NULL);
>  		break;
>  	case SEM:
>  		if (verbose)
>  			printf(_("removing semaphore id `%d'\n"), id);
> -		semctl(id, 0, IPC_RMID, arg);
> +		ret = semctl(id, 0, IPC_RMID, arg);
>  		break;
>  	default:
>  		errx(EXIT_FAILURE, "impossible occurred");
>  	}
>  
>  	/* how did the removal go? */
> -	switch (errno) {
> +	switch (errno && ret) {

 so true/false only ... why we need the "case EACCES" (etc.)?

>  	case 0:
>  		return 0;
>  	case EACCES:

 why we cannot use:

  if (ret < 0) 
    switch(errno) {
      case EACCES:
         ...
         break;

      ....
  }

    Karel


-- 
 Karel Zak  <kzak@xxxxxxxxxx>
 http://karelzak.blogspot.com
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux