[12:18:54] <subjrs> strcpy, strcat, ой, они небезопасны, используйте безопасные strncpy, strncat. Ах да, они тоже не безопасные, используйте безопасные strlcpy, strlcat, только учтите что они не стандартные. пиздец какойто а не язык
[12:21:19] <gour> это не язык, это библиотека.
[12:22:11] <subjrs> а что за язык такой, в котором чтобы два массива сконкатенировать - целый говнокод приходитца ваять и вылавливать еще сегфаулты из него? ))
[12:23:43] <gour> ну так чего вы хотите от языка, который писался как замена ассемблера? ну давайте его ещё обвиним что он не умеет границы массивов определять.
=)
[12:24:19] <gour> .. и пытается писать в память без проверки, а его ли это память вообще
[12:29:57] <subjrs> ых, пичаль-беда
[12:33:00] <subjrs> все больше склоняюсь написать функцию на аде и импортировать ее в си-код
[12:34:09] <gour> хм. а нельзя ли просто написать на си так чтобы оно правильно работало?
[12:34:54] <subjrs> учитывая что я на си толком никогда ничего не писал - не получается пока написать так чтобы хотя бы работало)
[12:35:24] <gour> а что именно необходимо сделать так, чтобы работало?
[12:36:58] <subjrs>
char       *context;
const char *prefix = "unconfined_u:unconfined_r:unconfined_t:";
char       *seuser=NULL;
char       *level=NULL;

if (context = (char*)calloc(strlen(prefix)+strlen(level)+1, sizeof(char)) == NULL){
  ereport(FATAL, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("SELinux: Allocate memory error")));
}
strncpy(context, prefix, strlen(prefix)); // На этой строчке происходит segfault
strncat(context, level, strlen(level));
context[strlen(prefix)+strlen(level)]='\0';
free(seuser);
free(level);
[12:38:11] <gour> скобочки добавить в if, чтобы context = (char*)calloc(… внутри оказались, а == NULL - снаружи
[12:38:39] <gour> а то сейчас context-у присваивается результат сравнения.
[12:38:57] <subjrs> == приоритетней чем = ?
[12:39:08] <subjrs> ща попробую
[12:39:27] <gour> http://www.isthe.com/chongo/tech/comp/c/c-precedence.html
[12:40:24] <gour> я вообще во избежание неоднозначностей напихиваю скобочек, не надеясь на собственное знание приоритетов в языке :)
[12:41:09] <gour> ... ну и если вынести context = ... - то код станет читабельнее, при этом не потеряв в производительности :)
[12:43:33] <subjrs> надо же, заработало))
[12:43:41] <gour> грац =)
[12:44:02] <yeo> Я на такую же хрень недавно в Аде наступил, спасибо стандарту 2012 года :-/
[12:44:41] <subjrs> gour: благодарствую)
[12:45:18] <gour> «кушайте на здоровье»© князь Мышкин, программист. =)
[12:46:50] <subjrs> надо бы наверна еще free(context) пихнуть, а то протекет программа
[12:48:42] <subjrs> хотяя, оно потом уходит в другие функции и видимо живет еще долго
[13:01:17] <gour> ну так-то да
[13:03:06] <gour> сделать глобальной переменной (да, это плохо, я в курсе, но где-то надо ж ей жить. =) ) и где-нибудь на выходе её free()
или вообще сделать функцию удаляющую всё глобальное и науськать на неё atexit()
[13:03:36] <subjrs> gour: я просто вставку в функцию сделал, эта переменная context и до меня не освобождалась. так что работает - не буду трогать)
[13:03:49] <gour> =)
[13:10:34] <landgraf> yeo, а где Ада2012 дров наломала?
[13:11:11] <landgraf> subjrs, ты уже купил себе майку "setenforce 1"  ?
[13:16:56] <subjrs> landgraf: неа
[13:17:10] <nordwind_> дня
[13:30:44] <yeo> landgraf, ладно, это я сглупил, но вообще меня синтаксис для 'X in A|B|C' оператора, когда в A, B или C случаются and/or/xor
[13:31:31] <landgraf> да ваша ada2012 все больше на питон становится похожа синтаксисом :D
[13:31:40] <landgraf> всякие case в скобочках, брррр
[13:32:56] <yeo> "и все таки она наша"? :)