ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: "Slava Semushin" <slava.semushin@gmail.com>
To: "ALT Devel discussion list" <devel@lists.altlinux.org>
Subject: Re: [devel] [git update] packages/katrin: heads/master
Date: Wed, 22 Aug 2007 16:13:02 +0700
Message-ID: <75e139a00708220213r5e7d709bg50614cb09a556a2@mail.gmail.com> (raw)
In-Reply-To: <20070822041318.EDBBD8E80D5@ssh.git.local.altlinux.org>

2007/8/22, Denis Klimov <zver / altlinux.org>:
> Update of /people/zver/packages/katrin.git
[...]
> --- a/src/tc/katrin-tc.c
> +++ b/src/tc/katrin-tc.c
> @@ -59,7 +59,8 @@ if (argc == 2 && (strcmp(argv[1], "remove") == 0 || strcmp(argv[1], "reload") ==
>         //open tmp script file
>         char prog[25] = "";
>         strlcpy(prog, "/tmp/katrin-tc.XXXXXX", sizeof prog);
> -       mktemp(prog);
> +       mkstemp(prog);
> +

Предлагаю избавиться от strlcpy() и сразу инициализировать массив значением:

- char prog[25] = "";
- strlcpy(prog, "/tmp/katrin-tc.XXXXXX", sizeof prog);
+ char prog[] = "/tmp/katrin-tc.XXXXXX";

Также:
- надо проверять возвращаемое от mkstemp() значение
- mkstemp() возвращает файловый дескриптор для временного файла,
поэтому надо не надо открывать файл с помощью fopen(). Вместо этого
можно преобразовать дескриптор для open() в дескриптор для fopen() с
помощью fdopen() и потом записывать данные файл с помощью простого
fprintf(). Ну или не преобразовывать и писать с помощью write().

>         FILE *fh = fopen(prog,"w");
>
>         fwrite("#!/bin/sh\n",strlen("#!/bin/sh\n"),1,fh);
> @@ -111,15 +112,18 @@ if (argc == 2 && (strcmp(argv[1], "remove") == 0 || strcmp(argv[1], "reload") ==
>         ret = chmod(prog, S_IRUSR | S_IWUSR | S_IXUSR);
>         if (ret == -1) {
>                 err("Can't do chmod(2) for temporary file!");
> +               unlink(prog);
>                 return EXIT_FAILURE;
>         }
>
>         if (fork() == 0)
>                 execl (prog, prog, NULL);
> +       unlink(prog);
[...]

А вот тут получается нехорошая ситуация:
- Процесс форкается и его ребёнок запускает скрипт на выполнение
- Родитель тут же удаляет скрипт, который его ребёнок исполняет

Надо:
- либо в родителе ждать когда ребёнок закончит выполнение скрипта
- либо добавить в конец скрипта строчку "rm -f $0", то скрипт после
выполнения сам себя удалит (но кажется это не самая лучшая идея,
потому что значение переменной $0 не всегда будет являеться полным
путём к скрипту)
- либо вообще не делать форк (действительно, зачем?) и выполнить
скрипт как-нибудь иначе чем exec() а потом его удалить.

Кстати, можно также попробовать избавиться от chmod(2), если выставить
верный umask(2) перед созданием временного файла, с помощью
mkstemp(3).

-- 
+ Slava Semushin | slava.semushin @ gmail.com
+ ALT Linux Team | php-coder @ altlinux.ru

       reply	other threads:[~2007-08-22  9:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-22  9:13 ` Slava Semushin [this message]
2007-08-22  9:41   ` Denis Klimov

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=75e139a00708220213r5e7d709bg50614cb09a556a2@mail.gmail.com \
    --to=slava.semushin@gmail.com \
    --cc=devel@lists.altlinux.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

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git