goo blog サービス終了のお知らせ 

ttt

getttyent

これってwarningさえ出ないんだ!

2012-04-05 23:58:08 | デジタル・インターネット

たとえば、こんな感じのC言語のプログラムなのですが

% cat aho.c
#include <stdio.h>
int main( int argc, char* argv[] )
{
  int aho = aho;
  printf("%d\n", aho);
  return aho;
}

int aho = aho  はタイプミスだったんですけど…。本当は、int aho = argc; と書いたつもりだった、みたいな。

% gcc -Wall aho.c

なんとまぁ~warningメッセージさえも出ません。コンパイラはGCC。

% ./a.out; echo $?
24
24

という感じで、無意味に実行できてしまいます。

えー!!そうだったんだと、おどろきました、あきれました
変数宣言のときの初期値代入で、右辺と左辺が同じでも、まったく何も言われないとは。

デバイスドライバの中で、こういうタイプミスをしていて、kernel panicしました。
ポインタがNULLでした。

20120405


iOS 5.1にアップデートしてみた

2012-03-09 23:59:00 | デジタル・インターネット

とりあえすやってみるか、ということで、iOS 5.1にアップデートしてみました。

201203091

201203092

初代iPadなので、Siriは無関係ですし、カメラも無いし、何がどう変わったのか、気がついたところは今のところありません。

「バッテリーの寿命に影響するバグを解決しました」というのが書いてありますが、「バッテリーの寿命」って、1000回充電すると充電できる容量が1/2になります、という方の寿命を想像してしまいます。まさか、そっちなのですか?
iOS5から、バッテリー消費量が激しくなるっていう問題があったので、それだと思うのですが。
「寿命」といった場合、どっちを意味するのが普通なんでしょうかねぇ。

■ 過去記事


いまさら知ったsshの機能

2012-03-05 23:04:24 | デジタル・インターネット

たまたまman sshして知った、ssh(OpenSSH)の機能。

(その1)

~C      Open command line.  Currently this allows the addition of port
        forwardings using the -L, -R and -D options (see above).  It also
        allows the cancellation of existing remote port-forwardings using
        -KR[bind_address:]port.  !command allows the user to execute a
        local command if the PermitLocalCommand option is enabled in
        ssh_config(5).  Basic help is available, using the -h option.

昔のrsh/rloginで使っていたので、「~.」と「~^Z」は知ってって、よく使っていましたが、この「~C」って、うわっ!こんなのあったんだ、と思わず叫びたくなるような機能。sshで接続中に、その場で、ポートフォワーディングの設定を変更できるんですと。そんな機能があっても、よさそうだなと薄々思ってて、本当にあったんだな~、という感じ。

% (sshでログイン中に、~C・・・「~」を押してから大文字のCを押す)
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward

という感じで、その場で、ポートフォワーディングをしたり、やめたり。

(その2)

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

な~んだ、SSHだけで、IPトンネリングしてVPN接続ができちゃうんですね。

IP forwardの設定

FreeBSDだとsysctl net.inet.ip.forwardingや、/etc/rc.confのgateway_enable="YES"ですが、CentOSでも、似たような感じ。

[root@centos /]# sysctl net.ipv4.ip_forward
fnet.ipv4.ip_forward = 1
 
[root@centos /]# grep forward /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1

/etc/ssh/sshd_configを書き換える。
PermitTunnel yes

リモートホストにログイン
# ssh -l root -v -w 0:1 リモートホスト

ローカルホスト側 (FreeBSD)

# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet6 なんとかかんとか%tun0 prefixlen 64 scopeid 0xa
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
        Opened by PID 60048

という感じで、トンネルデバイスができているので、アドレスを割り振る。

# ifconfig tun0 192.168.10.1 192.168.10.2 netmask 255.255.255.252

こんな感じになる。

# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet6 なんとかかんとか%tun0 prefixlen 64 scopeid 0xa
        inet 192.168.10.1 --> 192.168.10.2 netmask 0xfffffffc
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
        Opened by PID 60048

リモートホスト側 (CentOS)

[root@centos ~]# ifconfig tun1 192.168.10.2 pointopoint 192.168.10.1 netmask 255.255.255.252
[root@centos ~]# ifconfig tun1
tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:192.168.10.2  P-t-P:192.168.10.1  Mask:255.255.255.252
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:257 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:21564 (21.0 KiB)  TX bytes:1092 (1.0 KiB)

最初sshのマニュアルに書いてあったように、ifconfig tun1 192.168.10.2 192.168.10.1 netmask 255.255.255.252 とかやっていたけど、ifconfigの書式がこれじゃなかった。

あとは必要に応じて、routeコマンドで経路設定するなど。

おおぉぉぉ~、知ってると便利かもしれない。

20120305


Windows 8 Consumer Preview

2012-03-03 23:27:46 | デジタル・インターネット

そんなに興味があるわけじゃないんですが
Windows 8 Consumer Previewというのをインストールしてみました。

といっても、VirtualBoxの仮想マシンにインストールしただけですが。

201203031

ホストOSはCentOS 6.2で、適当にセットアップして、あっという間にインストール完了。なんのトラブルもなく、つまらない。

Windows 8についての予備知識がまるでない状態で触っているので、Windows 8のまったくの変わりように戸惑うばかり。

なんとなく、Mac OS Xっぽいな、と思いました。インストールするのに、Windows Liveの(?)メールアカウントが必要なところとか。

でもって、この画面。戸惑いますなぁ…本当にこれ、やっちゃうんですか?

201203032

Windows 98のころ、パソコンメーカーごとに独自に用意した、アプリケーション起動メニューを思い出しましたが・・・これも時代の流れなんでしょうか。

そして、昔ながらのWindowsっぽい画面にしたら

201203033

スタートメニューっぽいものがどこにもなくて、戸惑うばかり。左下すみをつつくと、元の画面に戻れるようです。

最後に。

どうやったら、電源オフできるんでしょうか???

野生の勘でAlt+F4を押したら、終了できました。


FreeBSD 8.3-PRERELEASE

2012-03-01 23:32:52 | デジタル・インターネット

昨日、csupしてビルドしてインストールしたら、FreeBSD 8.3-PRERELEASEになっていました。すでにFreeBSD 8.3-BETA1のISOイメージがダウンロードできるようになっています。

しばらく前の8.2-STABLEのときに気がついたんですが、libc.so.7に、FBSD_1.3というシンボルがつくようになっていて、新しい8.2-STABLE(現在の8.3-PRERELEASEも含めて)でビルドしたバイナリが、古い8.2では実行できない場合があります。

あ~、そんなわけで、古い8.1-STABLEなホストがまだ残っているんですが、そろそろ全部のホストをアップデートしないといけないかな、っていう気になってきました。

シンボルの調べかたがよくわからないので、適当なことをやっていますが…、こんな感じで、libc.so.7にFBSD_1.3というシンボルが含まれていることはわかりました。

# objdump -p /lib/libc.so.7
(途中省略)
Version definitions:
1 0x01 0x0865f4e7 libc.so.7
2 0x00 0x077a28b0 FBSD_1.0
3 0x00 0x077a28b1 FBSD_1.1
        FBSD_1.0
4 0x00 0x077a28b2 FBSD_1.2
        FBSD_1.1
5 0x00 0x077a28b3 FBSD_1.3
        FBSD_1.2
6 0x00 0x0f1efaa0 FBSDprivate_1.0
        FBSD_1.3

一方、2011年3月ころにビルドした8.2-STABLEで、同様に調べてみると、

Version definitions:
1 0x01 0x0865f4e7 libc.so.7
2 0x00 0x077a28b0 FBSD_1.0
3 0x00 0x077a28b1 FBSD_1.1
        FBSD_1.0
4 0x00 0x077a28b2 FBSD_1.2
        FBSD_1.1
5 0x00 0x0f1efaa0 FBSDprivate_1.0
        FBSD_1.2

という感じで、FBSD_1.2までで、FBSD_1.3は無いです。

たとえば、たまたま見つけた、/usr/local/bin/guniq を見てみると

# nm /usr/local/bin/guniq | grep FBSD_1.3
         U posix_fadvise@@FBSD_1.3

という風になるんで、このguniqを、FreeBSD 8.2なホストで実行しようとすると、たぶんエラーが出て実行できない、というわけ。

これまで、

  • ある1台のホストでportsを使って、バイナリパッケージを作成し、
  • その他のホストでは、バイナリパッケージを使ってアップデートする

ということをやってたので、バイナリパッケージを作成するホストを、FreeBSD 8.3にしてしまうと、8.2のホストでそのパッケージが使えなくなってしまうんですね。手抜きをやっているんで、しょうがないんですが。

2010年10月ころにビルドした8.1-STABLEなホストがまだ残っているんですが、これは、201110月の8.2-STABLEなホストでビルドしたバイナリパッケージでも大丈夫だったので、OSをアップデートしないまま、だましだまし使い続けていたけど、そろそろダメかな。

20120301


Windows7のファイアウォールの設定

2012-02-05 22:30:51 | デジタル・インターネット

まったくの自分用メモ。

  • 実家と自宅をVPN接続している
  • 自宅Windows7の共有フォルダに、実家のWindowsXPからアクセスできない
  • これまでは、一時的にファイアウォールをオフにしてた
  • ようやく重い腰を上げて、Windows7のファイアウォールの設定を変更してみた
  • 7のファイアウォール設定は、全然見た目からしてXPとはまったく違っていて、面倒になった気がする

「受信の規則」

201202051

エントリがたくさんありすぎてわけがわからないので、右端の「フィルタ」で表示を絞り込む。プロファイルの「プライベート」と「パブリック」の違いとか、どういう意味なのか、どう使い分けるのか、よくわからない。

201202052

ひたすら、スコープに追加してみた。

201202053

最初の画面。
わかりにくいが、右の方へスクロールさせていくと、いろいろ表示されている。
しかも、カラム幅が狭くて見えていないけど、「リモートアドレス」のところなど、ポップアップ表示がされて、設定内容が見える。
すごくわかりにくくて、不親切。
デフォルトとは違っているところを、色を変えて表示してくれてもよさそうなものなのに、そんな気の利いたことはしてくれない。
リモートアドレスの欄をダブルクリックしたら、最初から「スコープ」タブを表示してくれてもよさそうだが、そんな気の利いたことはしてくれない。

201202054

ヘルプを見たら、「セキュリティが強化されたWindowsファイアウォール」というフレーズが、これでもかこれでもかと連発していて、読みづらい。

201202055



(FreeBSD/amd64) 「ldd FILE」を実行したら、FILEが実行されてビックリした

2012-02-01 23:26:06 | デジタル・インターネット

なんとなく、「ldd /usr/local/bin/flash-player-properties」というコマンドを実行してみたら

% ldd /usr/local/bin/flash-player-properties
/usr/local/bin/flash-player-properties:

(process:28220): Gtk-WARNING **: Locale not supported by C library.
        Using the fallback 'C' locale.
Gtk-Message: Failed to load module "canberra-gtk-module": libcanberra-gtk-module.so: cannot open shared object file: No such file or directory
Gtk-Message: Failed to load module "gnomesegvhandler": libgnomesegvhandler.so: cannot open shared object file: No such file or directory

一瞬の間をおいて…、ウインドウが開きました。えっ?! 

20120201

何が起きたか理解できず、DISPLAY環境変数を消して、もう一度…

% unsetenv DISPLAY
% ldd /usr/local/bin/flash-player-properties
/usr/local/bin/flash-player-properties:

(process:29797): Gtk-WARNING **: Locale not supported by C library.
        Using the fallback 'C' locale.

(flash-player-properties:29797): Gtk-WARNING **: cannot open display:
/usr/local/bin/flash-player-properties: exit status 1

う~ん、これ、どうみても、/usr/local/bin/flash-player-propertiesを実行してますよね。lddは、共有ライブラリを表示するコマンドなのに、どうして、コマンドそのものを実行しちゃうんですか?という疑問。

どうも、lddの対象ファイルがLinuxバイナリのときに、この珍現象が起きるような雰囲気。

% file /usr/local/bin/flash-player-properties
/usr/local/bin/flash-player-properties: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

ためしに、かなり古い、FreeBSD 7.2-STABLE (32bit版)で同様なことをやってみると

% file less
less: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped

% ldd less
less:
        libncursesw.so.5 => /lib/libncursesw.so.5 (0x4808b000)
        libc.so.6 => /lib/libc.so.6 (0x480bb000)
        libdl.so.2 => /lib/libdl.so.2 (0x48233000)
        libtinfo.so.5 => /lib/libtinfo.so.5 (0x48238000)
        /lib/ld-linux.so.2 (0x48067000)

こちらはまったく問題なし。

いろいろ試行錯誤してみて、わかりました。整理してみると、こんな感じ。

  • FreeBSD 8.2-STABLE amd64(64ビット版)、9.0-RELEASE amd64(64ビット版)などでは、
  • 32bitのLinuxバイナリに対して、lddコマンドを実行したとき、
  • Linuxバイナリそのものが実行されてしまう

問題ないケース

  • 32bit版のFreeBSDでは、コマンドが実行されてしまうことはない。正常に、lddが動く。
  • たしか64bit版のLinuxバイナリは、そもそもFreeBSDで実行できないんでしたっけ? 64bitバイナリの場合は、「ld ホゲ64」しても、実行されない(できない?)。

もう少し調べてみる。

ktrace ldd /usr/local/bin/flash-player-properties
してみると、確かにforkしてる。

29828 ldd      RET   sigprocmask 0
29828 ldd      CALL  open(0x7fffffffe524,O_RDONLY,<unused>0)
29828 ldd      NAMI  "/usr/local/bin/flash-player-properties"
29828 ldd      RET   open 3
29828 ldd      CALL  read(0x3,0x7fffffffe0f0,0x40)
省略
29828 ldd      CALL  munmap(0x800888000,0x178000)
29828 ldd      RET   munmap 0
29828 ldd      CALL  fork
29828 ldd      RET   fork 29829/0x7485
29828 ldd      CALL  wait4(0xffffffff,0x7fffffffe0e8,<invalid>0,0)
29828 ldd      RET   wait4 29829/0x7485
29828 ldd      CALL  sigprocmask(SIG_BLOCK,0x8006393a0,0x7fffffffe0b0)
29828 ldd      RET   sigprocmask 0
29828 ldd      CALL  sigprocmask(SIG_SETMASK,0x8006393b0,0)
29828 ldd      RET   sigprocmask 0
29828 ldd      CALL  sigprocmask(SIG_BLOCK,0x8006393a0,0x7fffffffe060)
29828 ldd      RET   sigprocmask 0
29828 ldd      CALL  sigprocmask(SIG_SETMASK,0x8006393b0,0)
29828 ldd      RET   sigprocmask 0
29828 ldd      CALL  exit(0x1)

なぜforkしているのか?lddにバッファオーバーフローの脆弱性でもあって、コードが送り込まれているのか?と不安になりつつ、一応、lddのソースコードを調べてみたら、納得。

% grep fork /usr/src/usr.bin/ldd/*
/usr/src/usr.bin/ldd/ldd.c:     switch (fork()) {
/usr/src/usr.bin/ldd/ldd.c:             err(1, "fork");
/usr/src/usr.bin/ldd/ldd.c:             switch (fork()) {
/usr/src/usr.bin/ldd/ldd.c:                     err(1, "fork");

lddの中で、forkしてる。

よ~く見てみると、へーそうだったんだ!と、おもしろいことに気がつく。

        /* ld.so magic */
        setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1);
        if (fmt1 != NULL)
            setenv(LD_ "TRACE_LOADED_OBJECTS_FMT1", fmt1, 1);
        if (fmt2 != NULL)
            setenv(LD_ "TRACE_LOADED_OBJECTS_FMT2", fmt2, 1);

        setenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
        if (aflag)
            setenv(LD_ "TRACE_LOADED_OBJECTS_ALL", "1", 1);
        else if (fmt1 == NULL && fmt2 == NULL)
            /* Default formats */
            printf("%s:\n", *argv);
        fflush(stdout);

        switch (fork()) {
        case -1:
            err(1, "fork");
            break;
        default:
            if (wait(&status) < 0) {
                warn("wait");
                rval |= 1;
            } else if (WIFSIGNALED(status)) {
                fprintf(stderr, "%s: signal %d\n", *argv,
                    WTERMSIG(status));
                rval |= 1;
            } else if (WIFEXITED(status) &&
                WEXITSTATUS(status) != 0) {
                fprintf(stderr, "%s: exit status %d\n", *argv,
                    WEXITSTATUS(status));
                rval |= 1;
            }
            break;
        case 0:
            if (is_shlib == 0) {
                execl(*argv, *argv, (char *)NULL);
                warn("%s", *argv);
            } else {
                dlopen(*argv, RTLD_TRACE);
                warnx("%s: %s", *argv, dlerror());
            }
            _exit(1);
        }
    }

    return rval;
}




man ld.soしてみると

     LD_TRACE_LOADED_OBJECTS
                        When set to a nonempty string, causes ld-elf.so.1 to
                        exit after loading the shared objects and printing a
                        summary which includes the absolute pathnames of all
                        objects, to standard output.

そうだったんですね。
てっきり、lddが、バイナリファイルの中を読んで共有ファイルをリストアップしてたのかと思ったいたのですが、実際にはld.soがリストアップしていて、lddは環境変数LD_TRACE_LOADED_OBJECTSをセットしているだけでした。

というわけで、試してみると

% env LD_TRACE_LOADED_OBJECTS=yes /usr/local/bin/emacs
        libgtk-x11-2.0.so.0 => /usr/local/lib/libgtk-x11-2.0.so.0 (0x8007cf000)
        libgdk-x11-2.0.so.0 => /usr/local/lib/libgdk-x11-2.0.so.0 (0x800ce8000)
        libatk-1.0.so.0 => /usr/local/lib/libatk-1.0.so.0 (0x800e9b000)
        libgdk_pixbuf-2.0.so.0 => /usr/local/lib/libgdk_pixbuf-2.0.so.0 (0x800fbc000)
        libpangocairo-1.0.so.0 => /usr/local/lib/libpangocairo-1.0.so.0 (0x8010da000)
        libXext.so.6 => /usr/local/lib/libXext.so.6 (0x8011e7000)
        libXrender.so.1 => /usr/local/lib/libXrender.so.1 (0x8012f9000)
        libXinerama.so.1 => /usr/local/lib/libXinerama.so.1 (0x801402000)
        libXi.so.6 => /usr/local/lib/libXi.so.6 (0x801504000)

という感じで、lddを使わずに、共有ライブラリの一覧を出せました。

CentOS 6でも試してみましたが、このへんの仕組みは、まったく同じですね。

% env LD_TRACE_LOADED_OBJECTS=yes /usr/bin/less
        linux-vdso.so.1 =>  (0x00007fff70bff000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6f24a4d000)
        libpcre.so.0 => /lib64/libpcre.so.0 (0x00007f6f24821000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f6f24480000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6f24c6e000)

結局、64bit版のFreeBSDでは、Linuxバイナリを実行する仕組み(Linuxulator)に不具合があって、Linuxのld-linux.soに、LD_TRACE_LOADED_OBJECTSをうまく渡せていない、ってことでしょうかねぇ???

とりあえず、こんな感じで、もともとやりたかったことは達成できましたが…、この不具合は、セキュリティホールに近いものじゃないですかね。

% /usr/compat/linux/bin/bash

bash-3.2$ ldd /usr/local/bin/flash-player-properties
        libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0x280d8000)
        libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0x284bf000)
        libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0x28554000)
        libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0x28571000)
        libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0x2859a000)
        libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x285b7000)
以下省略





32GB対応microSDHCリーダー AK-TF01BL

2012-01-24 23:28:33 | デジタル・インターネット

この前、秋葉原に行ったとき、ネタになりそうなので買ってみたもの…

20120124

32GB対応microSDHCリーダー
AK-TF01BL

1個、90円(税込)でした

これまで100円のは見たことがあったので、安値記録更新です(当社比)。

あまりにも安いので、2個、買ってしまいました。

8GBのSDHCを刺して、Windows 7で動作確認。一応、動きました。

201201242

FreeBSDでも確認。

umass0: <Generic Mass Storage Device, class 0/0, rev 2.00/3.00, addr 2> on usbus4
umass0:  SCSI over Bulk-Only; quirks = 0x0000
umass0:2:0:-1: Attached to scbus2
(probe0:umass-sim0:0:0:0): TEST UNIT READY. CDB: 0 0 0 0 0 0
(probe0:umass-sim0:0:0:0): CAM status: SCSI Status Error
(probe0:umass-sim0:0:0:0): SCSI status: Check Condition
(probe0:umass-sim0:0:0:0): SCSI sense: UNIT ATTENTION asc:28,0 (Not ready to ready change, medium may have changed)
da0 at umass-sim0 bus 0 scbus2 target 0 lun 0
da0: <Mass Storage Device \\001\\000\\000?> Removable Direct Access SCSI-0 device
da0: 40.000MB/s transfers
da0: 7748MB (15867904 512 byte sectors: 255H 63S/T 987C)
GEOM: da0: partition 1 does not start on a track boundary.
GEOM: da0: partition 1 does not end on a track boundary.


Windowsの方にも表示されていますが、デバイスの名前として、「Mass Storage Device」というの文字列を返しているんですかねぇ?

ちなみに、8GBのSDHCは、年末に買ったときは450円でした。


BUFFALO BSW13K06HSV 130万画素

2012-01-20 23:59:00 | デジタル・インターネット

年末に秋葉原に行ったとき、ウェブカメラが1000円で売られていて、買おうか30分くらい悩んで、結局買わなかったんですが、年明け後、別の店で500円で売っていたので買ってしまいました。1000円のモノでも真剣に熟考します

20120120

BUFFALO BSW13K06HSV
130万画素
ウェブカメラ ヘッドセット付属

まあ、とくに、何かに使うとか目的は無いんですけど・・・。

Windows XP以降ならドライバをインストールしなくても即使えますよ、とのこと。

とりあえずCentOS 6.2のGNOMEなPCに接続してみたら、cheeseというアプリケーションで使えました。

これで500円ならお得じゃない~と思いました。