summaryrefslogtreecommitdiffstats
path: root/package/icu/icu-overflow.patch
blob: 45beaa7ea5c134badba96e39577e04d8e651996e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

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 {