https://bugs.icu-project.org/trac/ticket/7663 https://bugs.icu-project.org/trac/changeset/28002 https://bugs.icu-project.org/trac/ticket/7680 https://bugs.icu-project.org/trac/changeset/28124 --- source/tools/pkgdata/pkgdata.cpp +++ source/tools/pkgdata/pkgdata.cpp @@ -98,6 +98,7 @@ #endif #define LARGE_BUFFER_MAX_SIZE 2048 +#define MEDIUM_BUFFER_MAX_SIZE 1024 #define SMALL_BUFFER_MAX_SIZE 512 static void loadLists(UPKGOptions *o, UErrorCode *status); @@ -472,29 +473,48 @@ } static int runCommand(const char* command, UBool specialHandling) { - char cmd[SMALL_BUFFER_MAX_SIZE]; + char *cmd = NULL; + char cmdBuffer[SMALL_BUFFER_MAX_SIZE]; + int32_t len = strlen(command); + + if (len == 0) { + return 0; + } if (!specialHandling) { +#if defined(USING_CYGWIN) || defined(OS400) +#define CMD_PADDING_SIZE 20 + if ((len + CMD_PADDING_SIZE) >= SMALL_BUFFER_MAX_SIZE) { + cmd = (char *)uprv_malloc(len + CMD_PADDING_SIZE); + } else { + cmd = cmdBuffer; + } #ifdef USING_CYGWIN sprintf(cmd, "bash -c \"%s\"", command); #elif defined(OS400) sprintf(cmd, "QSH CMD('%s')", command); +#endif #else goto normal_command_mode; #endif } else { normal_command_mode: - sprintf(cmd, "%s", command); + cmd = (char *)command; } - + printf("pkgdata: %s\n", cmd); int result = system(cmd); - if (result != 0) { - printf("-- return status = %d\n", result); + if (result != 0) { + printf("-- return status = %d\n", result); } - return result; -} + + if (cmd != cmdBuffer && cmd != command) { + uprv_free(cmd); + } + + return result; +} #define LN_CMD "ln -s" #define RM_CMD "rm -f" @@ -586,7 +606,7 @@ pkgDataFlags = (char**)uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE); if (pkgDataFlags != NULL) { for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { - pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * SMALL_BUFFER_MAX_SIZE); + pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * MEDIUM_BUFFER_MAX_SIZE); if (pkgDataFlags[i] != NULL) { pkgDataFlags[i][0] = 0; } else {