
A combination of issue & patches from...

https://bugs.icu-project.org/trac/ticket/7680
https://bugs.icu-project.org/trac/changeset/28002
https://bugs.icu-project.org/trac/changeset/28124

Enlarged buffers more since include files for pkgdata can grow
significantly when cross-compiling.
This ONLY affects building.

Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>

diff -Nura icu.orig/source/tools/pkgdata/pkgdata.cpp icu/source/tools/pkgdata/pkgdata.cpp
--- icu.orig/source/tools/pkgdata/pkgdata.cpp	2010-09-29 15:37:28.000000000 -0300
+++ icu/source/tools/pkgdata/pkgdata.cpp	2010-12-21 15:53:30.252554924 -0300
@@ -97,8 +97,9 @@
 #define PKGDATA_FILE_SEP_STRING U_FILE_SEP_STRING
 #endif
 
-#define LARGE_BUFFER_MAX_SIZE 2048
-#define SMALL_BUFFER_MAX_SIZE 512
+#define LARGE_BUFFER_MAX_SIZE 8192
+#define MEDIUM_BUFFER_MAX_SIZE 4096
+#define SMALL_BUFFER_MAX_SIZE 2048
 
 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);
+    }
+
+    if (cmd != cmdBuffer && cmd != command) {
+        uprv_free(cmd);
     }
-    return result; 
-} 
+
+    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 {
