LINUX.ORG.RU

core dump - не сохраняется корка


0

0

Никак не могу понять почему не генерится коредамп. Ниже последовательность попыток сгенерить корку.
Что неправильно? Причем как-то у меня получилось её сгенерить, такими же действиями. Но только раз.
Я уже не попимаю что не правильно. Может кто ткнет мордой лица в ошибку.

$ cd
$ uname -a
Linux n1 2.6.26-1-amd64 #1 SMP Fri Mar 13 17:46:45 UTC 2009 x86_64 GNU/Linux
$ cat /etc/security/limits.conf | grep core
# - core - limits the core file size (KB)
#* soft core 0
* hard core 600000
$ ulimit -S -s
8192
$ ulimit -H -s
unlimited
$ ulimit -S -s 100000
$ ulimit -S -s
100000
$ cat /proc/sys/kernel/core_pattern
core
$ cat /proc/sys/kernel/core_uses_pid
0
$ yes & kill -ABRT `jobs -p`
[1]+ Aborted yes

-- Должно было написать Aborted (core dumped)
-- ладно. попробуем сделать сегфолтную прогу...

$ vim a.c
$ cat a.c
int main()
{
int * p = 0;
*p = 1;
}
$ gcc a.c
$ ./a.out
Segmentation fault

-- Должно было написать Segmentation fault (core dumped)

-- Попробуем под рутом...

$ sudo -i
# cd /home/ghisguth/
# ./a.out
Segmentation fault
# ulimit -s 1000000
# ./a.out
Segmentation fault
# yes & kill -ABRT `jobs -p`
[1] 32666
[1]+ Aborted yes
# ulimit -s unlimited
# ulimit -s
unlimited
# yes & kill -ABRT `jobs -p`
[1] 627
[1]+ Aborted yes


Второй вопрос. Почему если в процессе сделать setuid - то корки не герятся.

1. меняем RLIMIT_CORE на 100000

2. если запущены под рутом - то

* если в конфике указано меняем группу setgid

* если в конфике указано меняем пользователя делаем initgroups и setuid

3. проеряем лимит getrlimit(RLIMIT_CORE, &rlmt)

Если отключить изменение группы, либо пользоваителя - корка сохраняется. Если запустить в конфиге включить смену пользователя - корка не генерится.

Немного упрощенный код:

struct rlimit     rlmt;
rlmt.rlim_cur = (rlim_t) settings_.PROCESS_CORE_LIMIT;
rlmt.rlim_max = (rlim_t) settings_.PROCESS_CORE_LIMIT;
if (setrlimit(RLIMIT_CORE, &rlmt) == -1)
...
if (geteuid() == 0)
{
  gid_t group = 0;
  struct group   *grp;
  grp = getgrnam(settings_.PROCESS_GROUP.c_str());
  if (grp == NULL)
    throw ...
  if (setgid(grp->gr_gid) == -1)
    throw ...
    group = grp->gr_gid;
  }

  struct passwd  *pwd;
  pwd = getpwnam(settings_.PROCESS_USER.c_str());
  if (pwd == NULL)
    throw ...
  if (initgroups(settings_.PROCESS_USER.c_str(), group) == -1)
    throw ...
  if (setuid(pwd->pw_uid) == -1)
    throw ...
  }
}
if (getrlimit(RLIMIT_CORE, &rlmt) == -1)
...
LOG4CPLUS_INFO(logger_, "getrlimit(RLIMIT_CORE) "<<rlmt.rlim_cur);

Вывод strace:

Без изменения пользователя:

...
20065 setrlimit(RLIMIT_CORE, {rlim_cur=100000, rlim_max=100000}) = 0
20065 getrlimit(RLIMIT_CORE, {rlim_cur=100000, rlim_max=100000}) = 0
...
20065 --- SIGABRT (Aborted) @ 0 (0) ---
20093 +++ killed by SIGABRT (core dumped) +++
...

C изменением пользователя:

...
20097 open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 8
...
20097 open("/proc/sys/kernel/ngroups_max", O_RDONLY) = 8
...
20097 open("/etc/group", O_RDONLY|O_CLOEXEC) = 8
...
20097 setgroups(8, [0, 4, 20, 24, 46, 106, 117, 118]) = 0
...
20097 setuid(1000)                      = 0
20097 setrlimit(RLIMIT_CORE, {rlim_cur=100000, rlim_max=100000}) = 0
20097 getrlimit(RLIMIT_CORE, {rlim_cur=100000, rlim_max=100000}) = 0
...
20097 --- SIGABRT (Aborted) @ 0 (0) ---
20125 +++ killed by SIGABRT +++
20123 +++ killed by SIGABRT +++
...

stpg
() автор топика
Ответ на: комментарий от kemm

> core(5) читал? Ничего не подходит?

> The process is executing a set-user-ID (set-group-ID) program that is owned by a user (group) other than the real user (group) ID of the process. (How‐ever, see the description of the prctl(2) PR_SET_DUMPABLE operation...

Ещё раз спасибо.

stpg
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.