2016-08-30 19 views
0

セキュリティ上の問題のためにndkでいくつかの作業をしたい。スレッドからのAndroidの呼び出しjniメソッドエラー(A/libc:致命的なシグナル11(SIGSEGV)、コード1、tid 13620(AsyncTask#3)内のfault addr 0xdeadbaad)

my ndk code:

jbyte * buff; 
jbyte * result; 

jint buff_size = 0; 
jint result_size = 0; 


jbyte * key = (jbyte *)"HashCode"; 
jint key_size = 9; 

jbyte* ramz(jbyte* s ,jint size_s, jbyte* k, jint size_k) 
{ 
    return s; 
} 

jbyte* dramz(jbyte* s ,jint size_s, jbyte* k, jint size_k) 
{ 
    return s; 
} 


JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_clear(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of clear\n"); 
    if (buff_size > 0) 
    { 
     delete[] buff; 
    } 
    buff = new jbyte[0]; 
    buff_size = 0; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of clear\n"); 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_addChar(JNIEnv * env, jclass obj, jbyte c_int) { 
    jbyte *temp = new jbyte[buff_size+1]; 
    for (int i = 0; i < buff_size; ++i) 
    { 
     temp[i] = buff[i]; 
    } 

    temp[buff_size] = c_int; 
    jbyte * oldbuf = buff; 
    buff = temp; 
    delete[] oldbuf; 
    ++buff_size; 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_ramz(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of ramz\n"); 
    if (result_size > 0) 
    { 
     delete[] result; 
    } 

    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "ramzOOOO\n"); 
    result = ramz(buff, buff_size , key , key_size); 
    result_size = buff_size;// + 7; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of ramz\n"); 
} 

JNIEXPORT void JNICALL Java_com_shabaviz_Server_Server_dramz(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start of dramz\n"); 
    if (result_size > 0) 
    { 
     delete[] result; 
    } 

    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "dramzOOOO\n"); 
    result = dramz(buff, buff_size , key , key_size); 
    result_size = buff_size;// - 7; 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "end of dramz\n"); 
} 

JNIEXPORT jint JNICALL Java_com_shabaviz_Server_Server_sizeOf(JNIEnv * env, jclass obj) { 
    __android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "start/end of sizeOf\n"); 
    return result_size; 

} 

JNIEXPORT jbyte JNICALL Java_com_shabaviz_Server_Server_getChar(JNIEnv * env, jclass obj, jint c_int) { 
    return result[c_int]; 

} 

my java code structure

com.shabaviz.Server.Server.java

public class Server { 

    static{ 

     System.loadLibrary("hellondk"); 
    } 


    public synchronized static String sendPost(String url , String json) throws Exception { 

     . 
     . 
     . 

     byte [] data = newramz(json.getBytes()); 
     . 
     . 
     . 
     return new String(newdramz(responseFromServer)); 
    } 

    public native static void ramz(); 
    public native static void dramz(); 
    public native static void clear(); 
    public native static void addChar(byte c); 
    public native static int sizeOf(); 
    public native static byte getChar(int index); 


    public synchronized static byte[] newramz(byte[] s) 
    { 
     clear(); 
     for (int i = 0; i < s.length; ++i) 
     { 
      addChar(s[i]); 
     } 
     ramz(); 

     byte[] enc = new byte[sizeOf()]; 

     for (int i = 0; i < enc.length; ++i) 
     { 
      enc[i] = getChar(i); 
     } 
     return enc; 
    } 

    public synchronized static byte[] newdramz(byte[] s) 
    { 
     clear(); 
     for (int i = 0; i < s.length; ++i) 
     { 
      addChar(s[i]); 
     } 
     dramz(); 

     byte[] dec = new byte[sizeOf()]; 

     for (int i = 0; i < dec.length; ++i) 
     { 
      dec[i] = getChar(i); 
     } 

     return dec; 
    } 

MainActivity.java

public class MainActivity extends Activity{ 
    . 
    . 
    . 
    public class Login extends AsyncTask<URL, Integer, Long> { 
     . 
     . 
     . 

     protected Long doInBackground(URL... urls) { 
      response = Server.sendPost(url1 , jsonString1); 
      . 
      . 
      . 
      response2 = Server.sendPost(url2 , jsonString2); 
     } 
    } 
    . 
    . 
    . 
} 

And my problem:

私とアンドロイドのアプリケーション私は以下のlogcatと強制終了します。

8月30日14:46:33.604 15394から15470/com.shabaviz.telegramのV/telegramNDK:46:クリア
08から30 14の開始33.604 15394から15470/com.shabaviz.telegram V/telegramNDK:クリアの終了
08-30 14:46:33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:ramzの開始
08-30 14:46:33.604 15394-15470/com.shabaviz。電報V /テレグラム:ramzOOOO
08-30 14:46:33.604 15394-15470/com.shabaviz.telegram V/telegramNDK:ramzの末尾
08-30 14:46:33.604 15394-15470/com.shabaviz。テレグラムV /テレグラム:サイズの開始/終了0f
08-30 14:46:33.693 15394-15394/com.shabaviz.telegram D/mehdi:oncreatMainActivity
08-30 14:46:33.751 15394-15470/com.shabaviz.telegram V/telegramNDK:クリアの開始
08-30 14:46:33.751 15394-15470/com.shabaviz.telegram V/telegramNDK:クリアの終了
08-30 14:46:33.852 15394-15470/com.shabaviz.telegram V/telegramNDK:startドラマの
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:dramzOOOO
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:endドラマの
08-30 14:46:33.857 15394-15470/com.shabaviz.telegram V/telegramNDK:sizeOfの開始/終了
08-30 14:46:33.868 15394-15470/com.shabaviz.telegram V/telegramNDK:クリアの開始
08-30 14:46:33.868 15394-15470/com.shabaviz.telegram V/telegramNDK:endクリアファイル
08-30 14:46:33.869 15394-15470/com.shabaviz.telegram V/telegramNDK:ramzの開始
08-30 14:25:31.700 24282-24486/com.shabaviz.telegram A/libc :無効なブロックのアドレスまたはアドレス0xb9436fa8がdlfreeに渡されました
08-30 14:25:31.701 24282-24486/com.shabaviz.telegram A/libc:致命的なシグナル11(SIGSEGV)、コード1、障害addr 0xdeadbaad in tid 24486(AsyncTask#3)

修理する?

答えて

2

再びramz/dramz続く、clear続く、一部の文字を追加し、あなたがramz/dramz呼び出すときに何が起こるか考えてみましょう:

あなたがresult = buffを設定ramz/dramzの最初の呼び出しの際に、すなわちresultポイントにbuffと同じメモリチャンク。そして、result_sizeを0より大きい値に設定します。
clearに電話すると、buff_sizeは0より大きくなるので、delete[] buffresultと同じメモリ)です。
その後、delete[] resultを実行しようとするramz/dramzが呼び出されますが、そのメモリはすでに解放されています。> OOPS addChar方法は本当に非効率的であることを

側の注意点として

、。すべてのキャラクタに対して新しい割り当てを行い、古いコンテンツを新しいバッファにコピーします。バッファがいっぱいになったときにバッファのサイズを2倍にします。もちろん、ループ内で文字を1つずつ渡す代わりに、byte[]を一度に渡すこともできます。

関連する問題