Страница 3 из 5

Добавлено: 15 июн 2010, 22:22
mariner
Сегодня вот разбирал код нашего любимого PPK и набрел на такую конмтрукцию, вызывающую косяки непомерные(во всяком случае на несвежем gcc и glibc)

Код: Выделить всё

uint16_t ui16dx = ((uint16_t *)&Reg->ui32Hash)[0]; 
Немного подумав, я понял, что все сделать нормально, записав так:

Код: Выделить всё

uint32_t ui16dx = Reg->ui32Hash;
Вот в каком состоянии надо быть, чтобы такое писать?

Самое печальное, что потом происходит другая лажа, которую немного непонятка как править :( Буду думать.

Добавлено: 15 июн 2010, 23:26
nd
Как раз исходный вариант вполне корректен, а ваш ведет к обращению к памяти за пределами массива RegUser *table[65536]. В лучшем случае будет segfault, в худшем - уязвимость с возможностью выполнения произвольного кода.

Добавлено: 16 июн 2010, 00:27
mariner
обращению к памяти за пределами массива RegUser *table[65536]
А я про это и говорил:
Самое печальное, что потом происходит другая лажа
Поэтому:

Код: Выделить всё

uint16_t ui16dx = (uint16_t)Reg->ui32Hash;
Исправил до такого вида. Вообще, я догадываюсь, что PPK хотел юзать динамик каст, то сделал костыль, которые не переваривал старый gcc и/или libc (проверено на Ubuntu 8.04 и Debian Stable). В общем может не поленюсь и сделаю на dynamic_cast

dynamic_cast для примитивных типов? Не стоит ли подучить матчасть?

Добавлено: 16 июн 2010, 00:58
nd
Казалось бы, при чем здесь dynamic_cast? Здесь выделяются первые 2 байта 4-х байтного числа. Этот код вполне себе корректный и общепринятый в Си, хотя и не частый. Вот почему решили использовать именно первые, а не, скажем, младшие (как в вашем новом варианте) - это другой вопрос. И я совсем не уверен, что этот код стоит трогать.

Добавлено: 16 июн 2010, 01:04
mariner
Возможно и стоит, однако теперь все работает, пока, как надо. Я думаю еще посмотреть как все это будет работать.

Код: Выделить всё

#include <iostream>
#include <stdint.h>

int main() {
        uint32_t a = 1000;
        uint16_t b = (uint16_t)a;
        uint16_t c = ((uint16_t *)&a)[0];
        std::cout << b << " --- " << c << std::endl;
        return 0;
}
Я перед тем как править делал вот такую проверку (на всякий случай). результаты совпали, или я неверно проверял?

на счет динамик каст - просто я cказал, что похоже на него(ну вот ИМХО это) и я так уловил идею PPK

Добавлено: 16 июн 2010, 01:32
nd
Да, на little-endian архитектуре эти 2 строчик равнозначны. На big-endian будут различаться. Кстати, на big-endian будут частые коллизии при использовании 2-х первых байт их хеша (HashNick) как индекса.

Добавлено: 16 июн 2010, 01:40
mariner
нет, Little-endian, x86 в общем. Про колизии на big-endian все предельно ясно и так, но я не думаю, что тут много пользователей ARM, MiPS или Sparc. Просто когда при сборке с -O2 отваливается часть LuaAPI не комильфово, а -O2, это считай стандарт.

Добавлено: 19 июн 2010, 14:04
TiGRpp
nd писал(а): Дополнительные библиотеки Lua 5.1 можно поставить через менеджер пакетов дистрибутива.
Поставил liblua5.1-sql-mysql-2 и liblua5.1-sql-mysql-deb, однако по-прежнему никаких следов файлов mysql.lua, init.lua, и вообще каталога libs, кроме как в PtokaX, нет.

mysql.so нашелся в php5

Добавлено: 19 июн 2010, 14:11
mariner
Странно. Должно лежать тут:
/usr/lib/lua/5.1/luasql/

Добавлено: 19 июн 2010, 14:20
TiGRpp
Там тоже лежит только mysql.so, а скрипт вроде просит еще mysql.lua и init.lua

Добавлено: 19 июн 2010, 14:44
mariner
хм, у меня их тоже нет, но все пашет

Добавлено: 19 июн 2010, 14:56
TiGRpp
Вообще библиотеки Птоха подхвалила, вижу, но есть ошибки скрипта.

Вот пока не могу сообразить, что указать здесь -- Адрес сервера MySQL
Запускаю StatisticsMySQL http://mydc.ru/topic1846.html?hl=StatisticsMySQL

Добавлено: 19 окт 2010, 10:52
ExC0tiC11

Код: Выделить всё

./start_ptokax: 26: ./PtokaX: not found
Вот такая ошибочка вылетает в стартующем скрипте.

Добавлено: 19 окт 2010, 14:37
nd
Что за ОС? Есть ли dirname и readlink?

Добавлено: 19 окт 2010, 16:40
ExC0tiC11
1)ubuntu-10.04-x86_64
2)dirname (GNU coreutils) 7.4
3)readlink (GNU coreutils) 7.4

Добавлено: 20 окт 2010, 15:44
nd
Найдите строчку cd "$INSTALL_PATH" после нее добавьте строчку echo "$INSTALL_PATH" и посмотрите, что выведет при запуске.

Попробуйте первую строчку заменить с #!/bin/sh на #!/bin/bash

Ну или попробуйте INSTALL_PATH=$(dirname "$(readlink -f $0)") заменить на полный путь, например INSTALL_PATH="$HOME/ptokax-100131-i686"

Добавлено: 22 окт 2010, 00:54
mariner
так убанта же тут на 64 бита. А у нд под 32 бита сборка) Не звлетит) PS ia32-libs - шлак

Добавлено: 22 окт 2010, 14:57
nd
Ну почему же не взлетит? Про ia32 вы, вроде, знаете.
mariner писал(а):ia32-libs - шлак
Не забудьте об этом сообщить разработчикам.

В любом случае тут проблема в скрипте, а не бинарнике.

Добавлено: 24 окт 2010, 10:00
mariner
Не забудьте об этом сообщить разработчикам.
Не боись, я уже.

ну зачем плодить костылики?

Добавлено: 24 окт 2010, 12:01
exC0tic
Хм, попробовал на Ubunt-е скомпилировать сам, хаб так и не запустился, просто 0 внимания. В итоге снёс это дерьмо :-/ и поставил cent, теперь всё работает.

Добавлено: 24 окт 2010, 12:25
mariner
CentOS? Как дела с lua-socket, не падают? Lua-md5 через yum поставил, да?

Добавлено: 26 окт 2010, 13:22
exC0tic
Ну за 2 дня хаб упал 2 раза, и то ночью, и то как я понял из-за того что были проблемы с сетью, да

Добавлено: 26 окт 2010, 14:58
mariner
Кстати, таки интересует. А чо при сборке на Ubuntu писало?

Добавлено: 26 окт 2010, 19:23
exC0tic
segment failed или что-то такое), когда залезает не в свою память

Добавлено: 26 окт 2010, 23:09
mariner
странно) А из чего собирал то?) Ну оригинальные сурцы или как?