ICU-20545 Detect file separator char from dir
If udata_create won't find U_FILE_SEP_CHAR at the end of a dir variable, then it appends it. The problem starts if the dir variable uses U_FILE_ALT_SEP_CHAR which is not equal to U_FILE_SEP_CHAR. Then the resulting path could look like this ../data\mappings/cns-11643-1992.ucm instead of this ../data/mappings/cns-11643-1992.ucm This patch uses U_FILE_SEP_CHAR unless it detects that the dir variable doesn't use it, and uses U_FILE_ALT_SEP_CHAR instead.
This commit is contained in:
parent
55127d6778
commit
cd5b025ef8
@ -56,15 +56,25 @@ udata_create(const char *dir, const char *type, const char *name,
|
|||||||
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
|
*pErrorCode=U_MEMORY_ALLOCATION_ERROR;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char dirSepChar = U_FILE_SEP_CHAR;
|
||||||
|
#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
|
||||||
|
// We may need to append a different directory separator when building for Cygwin or MSYS2.
|
||||||
|
if(dir && *dir) {
|
||||||
|
if(!uprv_strchr(dir, U_FILE_SEP_CHAR) && uprv_strchr(dir, U_FILE_ALT_SEP_CHAR)) {
|
||||||
|
dirSepChar = U_FILE_ALT_SEP_CHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check that the full path won't be too long */
|
/* Check that the full path won't be too long */
|
||||||
length = 0; /* Start with nothing */
|
length = 0; /* Start with nothing */
|
||||||
if(dir != NULL && *dir !=0) /* Add directory length if one was given */
|
if(dir != NULL && *dir !=0) /* Add directory length if one was given */
|
||||||
{
|
{
|
||||||
length += static_cast<int32_t>(strlen(dir));
|
length += static_cast<int32_t>(strlen(dir));
|
||||||
|
|
||||||
/* Add 1 if dir doesn't end with path sep */
|
/* Add 1 if dir doesn't end with path sep */
|
||||||
if (dir[strlen(dir) - 1]!= U_FILE_SEP_CHAR) {
|
if (dir[strlen(dir) - 1]!= dirSepChar) {
|
||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,7 +84,7 @@ udata_create(const char *dir, const char *type, const char *name,
|
|||||||
length += static_cast<int32_t>(strlen(type));
|
length += static_cast<int32_t>(strlen(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* LDH buffer Length error check */
|
/* LDH buffer Length error check */
|
||||||
if(length > ((int32_t)sizeof(filename) - 1))
|
if(length > ((int32_t)sizeof(filename) - 1))
|
||||||
{
|
{
|
||||||
@ -82,13 +92,13 @@ udata_create(const char *dir, const char *type, const char *name,
|
|||||||
uprv_free(pData);
|
uprv_free(pData);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open the output file */
|
/* open the output file */
|
||||||
if(dir!=NULL && *dir!=0) { /* if dir has a value, we prepend it to the filename */
|
if(dir!=NULL && *dir!=0) { /* if dir has a value, we prepend it to the filename */
|
||||||
char *p=filename+strlen(dir);
|
char *p=filename+strlen(dir);
|
||||||
uprv_strcpy(filename, dir);
|
uprv_strcpy(filename, dir);
|
||||||
if (*(p-1)!=U_FILE_SEP_CHAR) {
|
if (*(p-1)!=dirSepChar) {
|
||||||
*p++=U_FILE_SEP_CHAR;
|
*p++=dirSepChar;
|
||||||
*p=0;
|
*p=0;
|
||||||
}
|
}
|
||||||
} else { /* otherwise, we'll output to the current dir */
|
} else { /* otherwise, we'll output to the current dir */
|
||||||
|
Loading…
Reference in New Issue
Block a user