2016-11-07 67 views
0

我們有一個kext來檢查一個路徑是否是另一個路徑的子目錄,如果是的話,它會做一些魔術。在Mac上比較特殊字符的路徑UTF-8

這一切都在我們的道路上工作得很好,只要我們沒有特殊字符(如字符)

我們通過可與KEXT溝通輔助應用程序喂一些工作路徑到系統中。

我已經分離出的問題,這個代碼:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char* path = "/Users/user/test/tëst/test"; //Sent by the system 
    char* wp = "/Users/user/test/tëst"; //Some path we claim to be ours 

    size_t wp_len = strlen(wp); 

    if (strncmp (wp,path,wp_len) == 0) //Check is path is a subpath 
    { 
    printf ("matched %s\n", path); 
    }else { 
    printf ("could not match\n"); 

    } 
    return 0; 
} 

我創建了一個依據,所以編碼不失去與瀏覽器GO:https://gist.github.com/fvandepitte/ec28f4321a48061808d0095853af7bd7

有人知道如何我可以檢查如果pathwp的子路徑而不會損失太多性能(此代碼在內核中運行)?

+2

https://developer.apple.com/library/content/qa/qa1173/_index.html –

回答

1

我把源代碼直接從瀏覽器複製/粘貼到文件(test.c)中。它爲我打印could not match

如果我轉儲使用od的文件,這是我所看到的:

bash-3.2$ od -c test.c              
0000000 # i n c l u d e  < s t d i o . 
0000020 h > \n # i n c l u d e  < s t r 
0000040 i n g . h > \n \n i n t  m a i n 
0000060  ( ) \n { \n   c h a r *  p a 
0000100 t h  =  " / U s e r s / u s e 
0000120 r / t e s t / t ë ** s t / t e s 
0000140 t " ;  // S e n t  b y  t h 
0000160 e  s y s t e m \n   c h a r * 
0000200  w p  =    " / U s e r s / 
0000220 u s e r / t e s t / t e ̈ ** s t 
0000240 " ;  // S o m e  p a t h  w 

注意的path測試出來作爲t ë ** s t, 但wp測試出來爲t e ̈ ** s t,這是不同的:所以當比較ëe時,strncmp將失敗。

如果我從複製粘貼path的測試到wp的任務然後我得到matched /Users/user/test/tëst/test,所以strncmp似乎很好地工作。

我不知道這兩個字符串是這樣的不同,我只能假設兩個字符串以某種方式使用不同的編碼。 strncmp函數比較每個字節的字符串,因此ëe ̈被認爲是不同的。如果你想使用strncmp,那麼不幸的是,除了確保兩個字符串使用相同的編碼以外,沒有簡單的解決方案。

FWIW - 我在MacOS 10.12.1運行,鏗鏘版蘋果LLVM版本8.0.0(鐺 - 800.0.42.1)

編輯:我從你的github上下載pathtest.cpp鏈接只是爲了複查事情。我運行了od -c pathtest.cpp,我看到了同樣的問題。

+0

Thx的信息,我會看到什麼@ n.m。想出了。 – Frederiek

+1

經過進一步的閱讀和有一個「AHA」 - 時,我可以說我們有預分解和分解字符。不知何故,我們將分解的值存儲在kext中,我想我可以在存儲它的地方修復它。 – Frederiek