OpenBlockS266でSELinux その3

前回、タイプ付与が失敗していました。


restoreconは、/etc/selinux/seedit/contexts/files/file_contextsを読み込んでタイプ付与をしますが、読み込む際のコードは、

        items = sscanf(line_buf, "%as %as %as", &regex, &type, &context);
        if (items < 2) {
                COMPAT_LOG(SELINUX_WARNING,
                            "%s:  line %d is missing fields, skipping\n", path,
                            lineno);
                return 0;
        } else if (items == 2) {
                /* The type field is optional. */
                free(context);
                context = type;
                type = 0;
        }

となっています*1
この中で、sscanfのフォーマットに"%as"とあり、フラグとして"a"というものが使われています。
Fedora 10のmanpageには、"fと一緒"としか書いてないですし、ググってもほとんどそれ以外の説明は出てきません。
ANSIではその説明であっていますが(でも"s"とはくっつかない)、Glibcでは抽出した文字列の大きさに合わせて自動的にメモリ確保してくれるそうです。
で、uClibcではどうかというと、

#ifdef __UCLIBC_HAS_SCANF_GLIBC_A_FLAG__
#ifdef L_vfscanf
/* only emit this once */
#warning Forcing undef of __UCLIBC_HAS_SCANF_GLIBC_A_FLAG__ until implemented!
#endif
#undef __UCLIBC_HAS_SCANF_GLIBC_A_FLAG__
#endif

ということで、まだ未実装…


そういうことで、"%as"を"%s"に置き換えて、必要な変数に対してはメモリ確保してやることで、OKのようですね。
実行すると、

# restorecon -R /
# ls -Z
drwxr-xr-x system_u:object_r:dir_bin_t      bin
drwxr-xr-x system_u:object_r:dir_dev_t      dev
drwxr-xr-x system_u:object_r:dir_etc_t      etc
drwxr-xr-x system_u:object_r:dir_homedir_rootdir_t home
drwxr-xr-x system_u:object_r:dir_lib_t      lib
drwxr-xr-x system_u:object_r:dir_childdir__t mnt
drwxr-xr-x system_u:object_r:dir_childdir__t opt
dr-xr-xr-x system_u:object_r:proc_t         proc
drwxr-xr-x system_u:object_r:dir_childdir__t root
drwxr-xr-x system_u:object_r:dir_sbin_t     sbin
drwxr-xr-x system_u:object_r:security_t     selinux
drwxr-xr-x system_u:object_r:sysfs_t        sys
drwxrwxrwt system_u:object_r:tmp_t          tmp
drwxr-xr-x system_u:object_r:dir_usr_t      usr
drwxr-xr-x system_u:object_r:dir_var_t      var
# 

と、エラーもなく、タイプも付与されました。

*1:ちなみにこのコードでは、file_contextsの記述の仕方によってはメモリリークが発生しますね!