March 2014

意外と簡単だった

https://gist.github.com/kosaki/9864928

require 'mail'

Mail.defaults do
options = { :address => "smtp.gmail.com",
:port => 587,
:user_name => 'kosaki.motohiro',
:password => 'パスワード',
:authentication => 'plain',
:enable_starttls_auto => true }

delivery_method :smtp, options
end

mail = Mail.new do
from 'kosaki.motohiro@gmail.com'
to 'kosaki.motohiro@gmail.com'
subject 'ruby mail test'
body 'body'
end

#puts mail.to_s #=> "From: mikel@test.lindsaar.net\r\nTo: you@...
mail.deliver




このへん参考にした
stackoverflow: How to send email via smtp with Ruby's mail gem?
http://stackoverflow.com/questions/12884711/how-to-send-email-via-smtp-with-rubys-mail-gem
このエントリーをはてなブックマークに追加

ところで、memstompのライセンスは結構ひどい

$ rpm -qi memstomp
Name : memstomp
Version : 0.1.4
Release : 11.el7
Architecture: x86_64
Install Date: Fri 14 Mar 2014 07:18:53 PM EDT
Group : Development/Debuggers
Size : 1157987
License : LGPLv3+ and GPLv2+
Signature : RSA/SHA256, Mon 03 Feb 2014 09:37:00 AM EST, Key ID 938a80caf21541eb
Source RPM : memstomp-0.1.4-11.el7.src.rpm
Build Date : Sun 26 Jan 2014 10:27:02 AM EST
Build Host : x86-017.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc.
Vendor : Red Hat, Inc.
URL : git://fedorapeople.org/home/fedora/wcohen/public_git/memstomp
Summary : Warns of memory argument overlaps to various functions
Description :
memstomp is a simple program that can be used to identify
places in code which trigger undefined behavior due to
overlapping memory arguments to certain library calls.



License : LGPLv3+ and GPLv2+

というのがよく分からなくてデュアルライセンスかなあと思っていたのだが、README
読むと

LICENSE:
LGPLv3+

Exception:

backtrace-symbols.c is GPLv2+. Which probably means that using
the --debug-info switch for memstomp might not be legally safe
for non-GPL-compatible applications. However, since that
module is independantly built into a seperate .so it should
still be safe using the profilers without this switch on such
software.



と書いてある。
ライセンスは著作権者の解釈が重要な意味を持つことが少なくないので、Author が LD_PREALOD だろうがライセンス的には non-GPL-compatible application では使えないかもーとか書いちゃうと、使っちゃダメな事で確定しちゃうだろ。そうしたいのならパッケージを別にして明確に注意喚起すべきで、誰も読まないような場所にインストールされたREADMEにこっそり書くんじゃない。

一番いいのはbinutilsコミュニティいって、明示的に許可をもらってライセンス変更の許可をもらってくることだが、次善の策は別のところからもってくることかなあ。Rubyのaddr2lineとか。
このエントリーをはてなブックマークに追加

memstompの-d (--debug-info) はちょっとおもしろい。

libmemstomp-backtrace-symbols.so を追加で LD_PRELOADにセットしているのだが、こいつは backtrace_symbols 関数を差し替えるライブラリなのだ。
glibc の backtrace_symbols は機能が非常に貧弱で -rdynamic つけないとバックトレースが見にくくてしかたがないのだが、中でこいつを差し替えて addr2line からカトペしてきたコードが走ってlibbfdつかってDWARF読んでシンボルリストを構築してる。

glibcの関数を差し替えてるだけなので、非常に汎用性が高く、さまざまソフトで使えると思う。おしむらくは addr2lineから持ってきている関係で GPL2+ なのでクローズドソフトの方々には厳しいが。
このエントリーをはてなブックマークに追加

memstompというライブラリがある。
デバッグ用ライブラリでmemcpyやそれに類する関数で2つの引数が指す領域がオーバーラップしており不定動作になってしまうようなケースを検出して間違っている箇所をバックトレースで教えてくれる。

対象の関数は以下

memcpy(), memccpy(), mempcpy(), strcpy(), stpcpy(), strncpy(), stpncpy(), strcat(), strncat(), wmemcpy(), wmempcpy(), wcscpy(), wcsncpy(), wcscat(), and wcsncat()



使い方は、Red Hat社 による、Red Hat Developer Toolset のドキュメントが一番わかり易い
https://access.redhat.com/site/documentation/en-US/Red_Hat_Developer_Toolset/2/html/User_Guide/sect-memstomp-Use.html

残念なことに Developer Toolsetのsclコマンドの使い方と混ざってしまっていて、Fedora、RHEL7でどうすればいいのか今ひとつ分かりにくいので簡単に解説してみる。
なお元ドキュメントはCC-BY-SAライセンスなので、この記事では遠慮なくサンプルコードを再利用させてもらう事にする。

この手のライブラリの定番ではあるが内部動作としてはLD_PRELOADを使っているが、利便性のためにラッパーコマンドが提供されており普段はこちらを使うことになる

# memstomp [-dk] program [argument...]



-d, --debug-info はバックトレース表示時にdebug infomationを使うという指定。これを指定しないと行番号が取れないので使用を強く推奨。
-k, --kill はオーバーラップ発見時にプログラム実行を停止するオプション

詳しく知りたい人は以下のURLに man を転載しておくのでどうぞ
https://gist.github.com/kosaki/9561104


さて、最初のURLのサンプルに戻る(コピペしやすいように以下のURLにコードを転載しておく https://gist.github.com/kosaki/9560671
見ての通り、strcat(employee, email) の行が間違っており、引数が overlapしてしまっている。

こいつを

# gcc -rdynamic -g -o employee employee.c



とコンパイルし、
※ -rdynamic はデバッグオプション非使用時のバックトレースをリッチにするためだけに必要なので -g があればなくても良い

# memstomp --debug-info ./employee



と実行する。
参考までに私の環境での実行結果を貼っておく https://gist.github.com/kosaki/9561220
このエントリーをはてなブックマークに追加

1a3a70ee.jpg


なぜか同日に到着したので2連続の物欲ポストになってしまうが、ジンバブエの100兆ドル紙幣を
記念として購入。100兆だぜ、100兆、こんな大金手にすることもうないかもしれん。うは
このエントリーをはてなブックマークに追加

43eabe97.jpg


goto fail Tシャツ買った。
いい買い物をした。ほくほく

次の出張では忘れずに持っていかないと
このエントリーをはてなブックマークに追加

↑このページのトップヘ