]> git.pld-linux.org Git - packages/dietlibc.git/blame - dietlibc-xdrmem-overflow.patch
- 0.23
[packages/dietlibc.git] / dietlibc-xdrmem-overflow.patch
CommitLineData
155d61cb
JB
1--- dietlibc-0.12.orig/librpc/xdr_mem.c
2+++ dietlibc-0.12/librpc/xdr_mem.c
3@@ -48,13 +48,13 @@
4 #include <netinet/in.h>
5 #include <string.h>
6
7-static bool_t xdrmem_getlong();
8-static bool_t xdrmem_putlong();
9+static bool_t xdrmem_getlong(XDR*, long*);
10+static bool_t xdrmem_putlong(XDR*, const long*);
11 static bool_t xdrmem_getbytes();
12 static bool_t xdrmem_putbytes();
13 static unsigned int xdrmem_getpos();
14 static bool_t xdrmem_setpos();
15-static int32_t *xdrmem_inline();
16+static int32_t *xdrmem_inline(XDR*, unsigned int);
17 static void xdrmem_destroy();
18
19 static struct xdr_ops xdrmem_ops = {
20@@ -94,54 +94,41 @@
21 register XDR *xdrs;
22 long *lp;
23 {
24+ if (xdrs->x_handy < 4) return FALSE;
25+ xdrs->x_handy -= 4;
26
27- if ((xdrs->x_handy -= sizeof(long)) < 0)
28- return (FALSE);
29-
30- *lp = (long) ntohl((unsigned long) (*((long *) (xdrs->x_private))));
31- xdrs->x_private += sizeof(long);
32-
33- return (TRUE);
34+ *lp = (int32_t) ntohl((*((int32_t *) (xdrs->x_private))));
35+ xdrs->x_private += 4;
36+ return TRUE;
37 }
38
39-static bool_t xdrmem_putlong(xdrs, lp)
40-register XDR *xdrs;
41-long *lp;
42+static bool_t xdrmem_putlong(XDR* xdrs, const long* lp)
43 {
44+ if (xdrs->x_handy < 4) return FALSE;
45+ xdrs->x_handy -= 4;
46
47- if ((xdrs->x_handy -= sizeof(long)) < 0)
48- return (FALSE);
49-
50- *(long *) xdrs->x_private = (long) htonl((unsigned long) (*lp));
51- xdrs->x_private += sizeof(long);
52+ *(int32_t *) xdrs->x_private = htonl(*lp);
53+ xdrs->x_private += sizeof(long);
54
55- return (TRUE);
56+ return (TRUE);
57 }
58
59-static bool_t xdrmem_getbytes(xdrs, addr, len)
60-register XDR *xdrs;
61-char* addr;
62-register unsigned int len;
63+static bool_t xdrmem_getbytes(XDR* xdrs, char* addr, unsigned int len)
64 {
65-
66- if ((xdrs->x_handy -= len) < 0)
67- return (FALSE);
68- memmove(addr, xdrs->x_private, len);
69- xdrs->x_private += len;
70- return (TRUE);
71+ if (xdrs->x_handy < len) return FALSE;
72+ xdrs->x_handy -= len;
73+ memmove(addr, xdrs->x_private, len);
74+ xdrs->x_private += len;
75+ return TRUE;
76 }
77
78-static bool_t xdrmem_putbytes(xdrs, addr, len)
79-register XDR *xdrs;
80-char* addr;
81-register unsigned int len;
82+static bool_t xdrmem_putbytes(XDR* xdrs, char* addr, unsigned int len)
83 {
84-
85- if ((xdrs->x_handy -= len) < 0)
86- return (FALSE);
87- memmove(xdrs->x_private, addr, len);
88- xdrs->x_private += len;
89- return (TRUE);
90+ if (xdrs->x_handy < len) return FALSE;
91+ xdrs->x_handy -= len;
92+ memmove(xdrs->x_private, addr, len);
93+ xdrs->x_private += len;
94+ return (TRUE);
95 }
96
97 static unsigned int xdrmem_getpos(xdrs)
98@@ -155,19 +142,19 @@
99 register XDR *xdrs;
100 unsigned int pos;
101 {
102- register char* newaddr = xdrs->x_base + pos;
103- register char* lastaddr = xdrs->x_private + xdrs->x_handy;
104+ register char* newaddr = xdrs->x_base + pos;
105+ register char* lastaddr = xdrs->x_private + xdrs->x_handy;
106
107- if ((long) newaddr > (long) lastaddr)
108- return (FALSE);
109- xdrs->x_private = newaddr;
110- xdrs->x_handy = (int) lastaddr - (int) newaddr;
111- return (TRUE);
112+ if ((long) newaddr > (long) lastaddr || (long)newaddr<(long)xdrs->x_base)
113+ return (FALSE);
114+ xdrs->x_private = newaddr;
115+ xdrs->x_handy = (int) lastaddr - (int) newaddr;
116+ return (TRUE);
117 }
118
119 static int32_t *xdrmem_inline(xdrs, len)
120 register XDR *xdrs;
121-int len;
122+unsigned int len;
123 {
124 int32_t *buf = 0;
125
126--- dietlibc-0.12.orig/librpc/xdr_rec.c
127+++ dietlibc-0.12/librpc/xdr_rec.c
128@@ -458,9 +458,7 @@
129 return (FALSE);
130 }
131
132-static int32_t *xdrrec_inline(xdrs, len)
133-register XDR *xdrs;
134-int len;
135+static int32_t *xdrrec_inline(XDR* xdrs, unsigned int len)
136 {
137 register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
138 int32_t *buf = NULL;
139--- dietlibc-0.12.orig/librpc/xdr_stdio.c
140+++ dietlibc-0.12/librpc/xdr_stdio.c
141@@ -169,9 +169,7 @@
142 FALSE : TRUE);
143 }
144
145-static int32_t *xdrstdio_inline(xdrs, len)
146-XDR *xdrs;
147-unsigned int len;
148+static int32_t *xdrstdio_inline(XDR* xdrs, unsigned int len)
149 {
150
151 /*
152--- dietlibc-0.12.orig/include/rpc/xdr.h
153+++ dietlibc-0.12/include/rpc/xdr.h
154@@ -126,7 +126,7 @@
155 /* returns bytes off from beginning */
156 bool_t (*x_setpostn) (XDR *__xdrs, unsigned int __pos);
157 /* lets you reposition the stream */
158- int32_t *(*x_inline) (XDR *__xdrs, int __len);
159+ int32_t *(*x_inline) (XDR *__xdrs, unsigned int __len);
160 /* buf quick ptr to buffered data */
161 void (*x_destroy) (XDR *__xdrs);
162 /* free privates of this xdr_stream */
163@@ -139,7 +139,7 @@
164 char* x_public; /* users' data */
165 char* x_private; /* pointer to private data */
166 char* x_base; /* private used for position info */
167- int x_handy; /* extra private word */
168+ unsigned int x_handy; /* extra private word */
169 };
170
171 /*
This page took 0.088092 seconds and 4 git commands to generate.