2016-11-07 4 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; 
} 

Я создал GIST, поэтому кодировка не идти теряется с браузером: https://gist.github.com/fvandepitte/ec28f4321a48061808d0095853af7bd7

Кто-то знает, как я могу проверить если path является подпутью wp, не теряя при этом слишком большой производительности (этот код работает в ядре)?

+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, который отличается: поэтому strncmp не работает при сравнении ë и e.

Если скопировать Тест из path пасты, что в назначение wp «s, то я получаю matched /Users/user/test/tëst/test, так strncmp, кажется, работает хорошо.

Я не знаю, как эти две строки отличаются друг от друга, я могу только предположить, что две строки используют как-то разные кодировки. Функция strncmp сравнивает строки на каждый байт, поэтому ë и e ̈ считаются разными. Если вы хотите использовать strncmp, то, к сожалению, нет простого решения для этого, кроме того, что обе строки используют одну и ту же кодировку.

FWIW - Я бегу на MacOS 10.12.1, с лязгом версии Apple, LLVM версии 8.0.0 (лязг-800.0.42.1)

EDIT: Я скачал pathtest.cpp с вашего GitHub ссылку, чтобы просто проверить вещи. Я запустил od -c pathtest.cpp, и я вижу ту же проблему.

+0

Thx для информации, я посмотрю, что @ n.m. придумал. – Frederiek

+1

После дальнейшего чтения и наличия «AHA» -момента, я могу сказать, что мы предварительно скомпоновали и разложили символы. Каким-то образом мы сохраняем разложенные значения в kext, и я думаю, что могу исправить его там, где мы его храним. – Frederiek

 Смежные вопросы

  • Нет связанных вопросов^_^