2012-06-19 13 views
23

SMJobBlessを使用してヘルパーツールを更新する際に問題が発生しました。SMJobBlessアップデート後にキーチェーン項目にアクセスできない

私たちは管理タスク(kextのロード/アンロード)を実行する必要があるアプリケーションを開発しています。また、アプリケーションのアカウント情報を保存するためにキーチェーンを使用しています。

管理タスクでは、SMJobBlessを使用してインストールされたヘルパーツールを使用して、Do Over Machポート(NSConnectionを使用)を使用して通信します。

ヘルパーツールで

:私たちは、アプリケーションやThawteからの協調設計の証明書を使用してヘルパーツールの両方に署名

NSConnection *conn = [NSConnection connectionWithRegisteredName:HELPER_BUNDLE_IDENTIFIER host:nil]; 

id proxyServerObject = [conn rootProxy]; 

if(conn && proxyServerObject) { 
    return [proxyServerObject someMethod]; 
} 
return NO; 

:アプリで

// use our bundle id as our service name 
NSString* name = [[NSBundle mainBundle] bundleIdentifier]; 

launch_data_t checkinRequest = launch_data_new_string(LAUNCH_KEY_CHECKIN); 
launch_data_t checkinResponse = launch_msg(checkinRequest); 
launch_data_t machServicesDict = launch_data_dict_lookup(checkinResponse, LAUNCH_JOBKEY_MACHSERVICES); 
launch_data_t machPort = launch_data_dict_lookup(machServicesDict, [name UTF8String]); 

mach_port_t mp = launch_data_get_machport(machPort); 

launch_data_free(checkinResponse); 
launch_data_free(checkinRequest); 

NSMachPort *receivePort = [[NSMachPort alloc] initWithMachPort:mp]; 
NSConnection *server = [NSConnection connectionWithReceivePort:receivePort sendPort:nil];   

。これまでのところ、すべてが魅力のように機能します。ヘルパーツールはインストールされており、DOを使用してヘルパーツールと通信できます。私たちのkextがロードされ、正常にアンロードされます。

私たちのヘルパーツールを試してみると、問題が発生します。インストールされたツールの情報辞書とバンドルされたツールを使用して、ツールのアップデートが必要かどうかを確認し、SMJobBlessを再度呼び出してアップデートを実行します。

SMJobBless呼び出しの後、次の行がコンソールに表示されます。この後

6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x104e17000): p=74362[OURAPP] clearing CS_VALID 
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x10d0de000): p=74364[OURAPPHELPER] clearing CS_VALID 

、アプリケーションが私たちのキーチェーン項目からアプリケーション・パスワードを読み取ることができない、機能SecKeychainItemCopyContent戻りerrSecAuthFailed (-25293)。ただし、インストールされたヘルパーツールまたはアプリケーションバンドルのコード署名をcodesign -vvvv PATH_TO_TOOL_OR_BUNDLEを使用して手動で確認すると、エラーは報告されません。 ツールとアプリケーションは、Xcode環境の外部で署名されており、署名プロセス後に内容は変更されません。

同様の状況を表すone other postが見つかりましたが、その質問にはまだ答えがありません。 関連する問題はSMJobBless returning error 4098です。

OSX 10.7.4でテストしています。

誰もが似たような問題に直面しているか、間違っていることは明らかですか?

答えて

3

これは、ディスク上のヘルパーツールをSMJobBlessと置き換えた場合のバグが原因です。特に、バイナリは、一時ファイルに書き込んでから宛先の上に改名するという一般的なアプローチをとるのではなく、その場所でバイナリを変更します。この効果は、バイナリがメモリ内にある場合、ファイルの変更によってメモリページがファイルをバックアップして変更され、コード署名が無効になることです。私はこれに関するバグレポートをrdar:// problem/13514523として書きました。私はあなたがまだそれをしていない場合は、自分のファイルを提出することをお勧めします。

SMJobBlessを使用してアップグレードする前に、アプリケーションがヘルパーツールにディスクからディスクを削除するように要求する可能性があります。これにより、問題を回避して、ディスク上の新しいファイルにSMJobBlessがコピーされます。

+0

現在、このバグは、ヨセミテ(10.10)でヘルパーツールをアップグレードしようとしています。エルキャピタン(10.11)でうまくいくと思われる。多分、Appleはバグを修正しましたか? –

関連する問題