Приветствую, Александр!
Александр Читалкин писал(а):Кстати, с чего вы взяли что
- Код: Выделить всё
char *ctbody=(char *)malloc(MAX_MSG-8);
сразу даст повод для SIGSEGV? Вовсе нет. SIGSEGV случиться, если будет произведена попытка доступа к содержимому ctbody по смещению, большему чем MAX_MSG-8, imho.
Не сразу, немного позже. Я, собственно, именно это и имел в виду, когда перед этим говорил:
Константин Ошмян писал(а):Обнуление буфера ctbody длиной MAX_MSG (вскоре после комментария /* init buffer */) - при том, что места под этот буфер выделяется на 8 байт меньше
Вот код этого обнуления (расположенный вскоре после комментария /* init buffer */) :
- Код: Выделить всё
memset(ctbody,0x0,MAX_MSG);
Функция
memset как раз и производит этот "доступ к содержимому
ctbody". Места было выделено (MAX_MSG-8 ), а используются все MAX_MSG.
Александр Читалкин писал(а):И еще момент - вот ваша фраза:
Константин Ошмян писал(а):видимо, вместе с NCP-запросом он "видит" и номер коннекшена к серверу, после чего выбирает из таблицы соединений имя пользователя
В таком случае, пользователь этот должен быть подключен к службе NCP того сервера, на котором работат бордер, непосредственно? А если это не так? И как быть в случае *nix систем?
Во-первых, я же писал:
Константин Ошмян писал(а):Бордер в запросе к ClientTrust-у передаёт имя своего сервера и дерева, а также контекст сервера; ClientTrust же проверяет (через Client32), есть ли у пользователя подключение к этому дереву вообще и серверу в частности. При необходимости/возможности (подключение к дереву - есть, к серверу - нет) - делается Unlicensed-подключение серверу.
Во-вторых, оговорка "видимо" тоже снимается
- я нашёл
описание этих самых NCP Extensions, после чтения которого сомнений не осталось. Более того, зарегистрировавший NCP Extension модуль (т.е. NLM на сервере NetWare) имеет возможность не только иметь информацию о NCP-Connection-е от клиента (через который пришло обращение к этому экстеншену), но и получать уведомления в случае изменения состояния этого коннекшена (пользователь отлогинился, соединение убили и т.п.). Т.е. теоретически ничто (кроме отсутствия опыта написания NLM-ов) не мешает написать для того же Сквида модуль, совместимый со стандартным КлиентТрастом и работающий на NetWare: регистрируем себе NCP-Extension, после чего по запросу от Сквидовского хелпера с IP-адресом клиента возвращаем имя залогиненного там пользователя (ведя у себя таблицу соответствия "IP<->UserName", определяя UserName по описанной выше технологии и вычёркивая из этой таблицы по изменению состояния коннекшена). Сквидовский хелпер при этом мог бы быть совсем тупым - просто разбирать командную строку или конфиг. файл для обнаружения имени или IP-адреса сервера NetWare, на котором такой модуль загружен, и номера порта для обращения к нему.
Наверное, при наличии серверной NCP-службы на *NIX-овом сервере (например, SLES) можно каким-то образом портировать такой модуль и туда; но увы - я не специалист в данной области.