summaryrefslogtreecommitdiff
path: root/ipkg/ipkg-0.99.121/varargs.patch
blob: cca6b2745d29d8e58bb4982d130409b1f507a776 (plain)
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
--- C.old/sprintf_alloc.c	2004-01-13 15:51:48.000000000 -0700
+++ C/sprintf_alloc.c	2004-05-20 16:47:25.240772176 -0700
@@ -20,12 +20,12 @@
 
 #include "sprintf_alloc.h"
 
-static int vsprintf_alloc(char **str, const char *fmt, va_list ap);
-
 int sprintf_alloc(char **str, const char *fmt, ...)
 {
     int ret;
     va_list ap;
+    char *new_str;
+    int n, size = 100;
 
     if (!str) {
       fprintf(stderr, "Null string pointer passed to sprintf_alloc\n");
@@ -35,29 +35,27 @@
       fprintf(stderr, "Null fmt string passed to sprintf_alloc\n");
       return -1;
     }
-    va_start(ap, fmt);
-    ret = vsprintf_alloc(str, fmt, ap);
-    va_end(ap);
 
-    return ret;
-}
+    /* On x86_64 systems, any strings over 100 were segfaulting.  
+       It seems that the ap needs to be reinitalized before every
+       use of the v*printf() functions. I pulled the functionality out
+       of vsprintf_alloc and combined it all here instead. 
+    */
+    
+
+    /* ripped more or less straight out of PRINTF(3) */
+
+    if ((new_str = malloc(size)) == NULL) 
+      return -1;
 
-/* ripped more or less straight out of PRINTF(3) */
-static int vsprintf_alloc(char **str, const char *fmt, va_list ap)
-{
-    char *new_str;
-    /* Guess we need no more than 100 bytes. */
-    int n, size = 100;
- 
-    if ((new_str = malloc (size)) == NULL)
-	return -1;
     *str = new_str;
-    while (1) {
-	/* Try to print in the allocated space. */
-	n = vsnprintf (new_str, size, fmt, ap);
-	/* If that worked, return the size. */
-	if (n > -1 && n < size)
-	    return n;
+    while(1) {
+      va_start(ap, fmt);
+      n = vsnprintf (new_str, size, fmt, ap);
+      va_end(ap);
+      /* If that worked, return the size. */
+      if (n > -1 && n < size)
+	return n;
 	/* Else try again with more space. */
 	if (n > -1)    /* glibc 2.1 */
 	    size = n+1; /* precisely what is needed */
@@ -71,4 +69,6 @@
 	}
 	*str = new_str;
     }
+
+    return -1; /* Just to be correct - it probably won't get here */
 }