metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-03-24 11:16 pm

А теперь о Ruby и Redmine

Я таки нашел, в чем причина вот этого бага:
no method error [] for class nil
https://bugs.launchpad.net/ubuntu/+source/ruby1.8/+bug/949011

Вкратце: недавно в большинстве реализаций хэш таблиц была найдена имманентная уязвимость к потенциальным DDOS атакам на веб-приложения, связанная с тем что атакующий мог посылать запросы такого вида, что внутри приложения они приводили к обращению к хэш-таблице всегда к одному bucket. Т.е. передавать ключи, которые после обработки hash-функцией всегда давали одно и то же значение, убивая эту таблицу из O(1) в O(N) и съедая тем самым процессор.

В руби это дело исправили:
https://launchpad.net/ubuntu/+source/ruby1.8/1.8.7.249-2ubuntu0.1
http://launchpadlibrarian.net/94639065/ruby1.8_1.8.7.249-2_1.8.7.249-2ubuntu0.1.diff.gz

конкретно эти строки:
++extern unsigned long rb_genrand_int32(void);
++
++void
++Init_st(void)
++{
++ hash_seed = rb_genrand_int32();
++}

+- register int key = 0;
++ register unsigned long key = hash_seed;

Формально, в норме бы ничего не поменялось, после этого.
НО: в редмайне оказалось место, где работа зависит от порядка элементов в хэше:
/usr/share/redmine/app/models/setting.rb,166
setting ||= new(:name => name, :value => @@available_settings[name]['default'])

тут происходит примерно такое: создается новый объект Setting и ему устанавливаются атрибуты name и value. И, это ключевой момент, установка атрибута value ЗАВИСИТ от наличия уже установленного атрибута name:
  def value=(v)
    v = v.to_yaml if v && @@available_settings[name]['serialized']
    write_attribute(:value, v.to_s)
  end

т.е. оно использует name чтобы получить значение по умолчанию из @@available_settings и далее пытается из него получить значение атрибута 'serialized'

Раньше это работало, а после секьюрити-фикса - работает в зависимости от rb_genrand_int32.

Так что ошибка, вообще говоря, в редмайне. Надеятся на порядок в хэш-таблице, это бред.

PS: а вот и фикс, месяц назад: http://www.redmine.org/projects/redmine/repository/revisions/8909/diff/trunk/app/models/setting.rb

[identity profile] metaclass.livejournal.com 2012-03-24 08:32 pm (UTC)(link)
Кстати в последнем редмайне исправили уже:
private
# Returns the Setting instance for the setting named name
# (record found in database or new record with default value)
def self.find_or_default(name)
name = name.to_s
raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
setting = find_by_name(name)
unless setting
setting = new(:name => name)
setting.value = @@available_settings[name]['default']
end
setting
end
end

[identity profile] avnik.livejournal.com 2012-03-24 08:47 pm (UTC)(link)
Закладываться на порядок в хеше, супер чо. Очень агильненько.
и эти люди запрещают мне ковырять в носу.

[identity profile] familom.livejournal.com 2012-03-24 08:50 pm (UTC)(link)
А потом они пишут статьи про то, как ужасно разговаривать на собеседованиях про классические алгоритмы и структуры данных.
Edited 2012-03-24 20:50 (UTC)

[identity profile] skif-by.livejournal.com 2012-03-24 08:53 pm (UTC)(link)
Полный бред. Авторы редмайн укуренные.

[identity profile] mr-s-o-u-l.livejournal.com 2012-03-24 08:53 pm (UTC)(link)
я пока сидю на 1.10 версии (там чето после 1.20 они конфиги вроде координально поменяли), гемы ставил ручками, редмайн из исходника в отдельного пользователя. Обновление ведра убунты пережило спокойно и не поперхнулось.

[identity profile] metaclass.livejournal.com 2012-03-24 09:04 pm (UTC)(link)
ядро ок.
ломается после апдейта руби.

если сломается, прикрутишь фикс отсюда: http://www.redmine.org/projects/redmine/repository/revisions/8909/diff/trunk/app/models/setting.rb

:)

[identity profile] mr-s-o-u-l.livejournal.com 2012-03-24 09:12 pm (UTC)(link)
оу сенкс! тока я руби вроде тоже руками ставил, не из репозитория.Оно нихрена и не обновлялось :))
задача в принципе стояла не постоянно держать боевую проапдейеченную и пропатченную систему, а приучить дикарей пользоваться унитазом приобщить ограниченный контингент НИИ ГиТ к таск-менеджменту.

[identity profile] metaclass.livejournal.com 2012-03-24 09:37 pm (UTC)(link)
Все версии редмайна до 1.3.2 сломаются при этом апдейте рубей, ошибка проявляется рандомно :)

[identity profile] metaclass.livejournal.com 2012-03-24 09:48 pm (UTC)(link)
А, руби не из репы, точно. Айсед ликует :)

[identity profile] dnnx.livejournal.com 2012-03-24 09:57 pm (UTC)(link)
Немного ортогональный комент, но тоже про руби хэши.

Неоднократно сталкивался с тем, что в рубёвых гемах начинают валиться тесты при переходе с руби 1.8 на руби 1.9 только по той причине, что код основывается на порядке элементов в хэше. Кучу примеров видел и фиксил.

В 1.9 хэши стали сохранять порядок, в котором добавляются элементы. Такое изменение логично, потому что с теорией знакомы не все (пичаль-пичаль), а руби старается следовать принципу least surprise.

➜  ~  rvm use ruby-1.9.3-p125 && ruby -e "h = {}; h[:b]=2; h[:a]=1; p h"       
Using /home/dnnx/.rvm/gems/ruby-1.9.3-p125
{:b=>2, :a=>1}
➜  ~  rvm use ree-1.8.7-head && ruby -e "h = {}; h[:b]=2; h[:a]=1; p h" 
Using /home/dnnx/.rvm/gems/ree-1.8.7-head
{:a=>1, :b=>2}
Edited 2012-03-24 21:59 (UTC)

[identity profile] mr-s-o-u-l.livejournal.com 2012-03-24 09:57 pm (UTC)(link)
Внутренний или внешний?? :)

[identity profile] darkdrip.livejournal.com 2012-03-24 10:10 pm (UTC)(link)
нужно использовать пыхыпышный mantis!

[identity profile] avnik.livejournal.com 2012-03-24 11:07 pm (UTC)(link)
Равнение на идиотов -- это правильно.

PS Пока что из языков только питон предсказуем до тошноты, может луа еще (хотя там в стандартных библиотеках undefined поведение местами)

[identity profile] avnik.livejournal.com 2012-03-24 11:08 pm (UTC)(link)
А потом айсед из за таких граждан псит на бебеан

[identity profile] x-a-e-p.livejournal.com 2012-03-24 11:28 pm (UTC)(link)
питон пусть с таймзонами работать научится сначала нормально, ну и нифига он не предсказуем(например, изменения в 3.x по сравнению с 2.x).
lua да, весьма стабилен, хотя тут ещё все зависит от конкретной реализации

[identity profile] teewoon.livejournal.com 2012-03-24 11:32 pm (UTC)(link)
А я чота всё больше смотрю в сторону chiliproject. Хотя там тоже не шоколадно. Полгода назад поломали древовидное отображение подтасков и родительских, обещают в следущем релизе поправить (к лету вроде), а пока что патч. Т.е. хотят - ломают, хотят - фишки прикручивают. Ну и в догонку - пачка core-девелоперов из редмайна ушла в chili, поэтому и там и сям случаются косяки.
Edited 2012-03-24 23:33 (UTC)

[identity profile] avnik.livejournal.com 2012-03-25 12:27 am (UTC)(link)
Во первых про совместимость 2-3 говорили за несколько лет до выхода питонов 3.x, ,было заранее известно -- что поменяют, и есть __future__ и six которые покрывают большую часть несовместимостей, до фига кода, который работает в обоих питонах.

У луа проблемы изменно в совместимости между реализациями. И на все что не описано в programming lua закрывают глаза, и делают вид что его нет (и я кстати именно про таймзоны)

PS А что у питона не так с таймзонами?
PPS С таймзонами все не так -- надо всем жить по гринвичу

[identity profile] x-a-e-p.livejournal.com 2012-03-25 01:15 am (UTC)(link)
про питон и таймзоны - их datetime не имеет понятия о базе таймзон, и о том что они могут меняться. Из-за этого возникает масса проблем, а про pytz поди узнай сначала, ведь datetime обещает те же самые функции.

[identity profile] mudasobwa.livejournal.com 2012-03-25 03:49 am (UTC)(link)
Хренассе least surprise.

По этой логике и переменные нельзя терять после выхода из scope, вдруг я удивлюсь, что она была и вдруг исчезла.

[identity profile] theiced.livejournal.com 2012-03-25 04:59 am (UTC)(link)
ну - и у людей с рвмом проблема решилась сама собой.

и мы ещё раз увидели что бабуинасты ничего не тестируют.

[identity profile] theiced.livejournal.com 2012-03-25 05:01 am (UTC)(link)
вы все такие. каждый бабуинаст нет-нет да и сделает мэйкинсталл.

[identity profile] theiced.livejournal.com 2012-03-25 05:04 am (UTC)(link)
ага, предсказуем. особенно когда кто нить где нить поставить один табик в исходниках. то то будет веселуха ;]

[identity profile] fraks-nsk.livejournal.com 2012-03-25 05:40 am (UTC)(link)
А что за претензии к табику?
Вы в сях где-нибудь поставье лишнюю скобочку - будет ровно то же самое.
И там и там - один символ.

[identity profile] theiced.livejournal.com 2012-03-25 06:03 am (UTC)(link)
си не скомпилятся а петон будет работать. тока не так как ожидается.

везде проблеы и один табик, очень ок.

[identity profile] inhate.livejournal.com 2012-03-25 06:09 am (UTC)(link)
Jira такой херней не страдает

Page 1 of 3