1 /**
2    r_data.c
3 
4 
5    Copyright (C) 2002-2003, Network Resonance, Inc.
6    Copyright (C) 2006, Network Resonance, Inc.
7    All Rights Reserved
8 
9    Redistribution and use in source and binary forms, with or without
10    modification, are permitted provided that the following conditions
11    are met:
12 
13    1. Redistributions of source code must retain the above copyright
14       notice, this list of conditions and the following disclaimer.
15    2. Redistributions in binary form must reproduce the above copyright
16       notice, this list of conditions and the following disclaimer in the
17       documentation and/or other materials provided with the distribution.
18    3. Neither the name of Network Resonance, Inc. nor the name of any
19       contributors to this software may be used to endorse or promote
20       products derived from this software without specific prior written
21       permission.
22 
23    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
24    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33    POSSIBILITY OF SUCH DAMAGE.
34 
35 
36  */
37 
38 /**
39    r_data.c
40 
41 
42    Copyright (C) 1999-2000 RTFM, Inc.
43    All Rights Reserved
44 
45    This package is a SSLv3/TLS protocol analyzer written by Eric Rescorla
46    <ekr@rtfm.com> and licensed by RTFM, Inc.
47 
48    Redistribution and use in source and binary forms, with or without
49    modification, are permitted provided that the following conditions
50    are met:
51    1. Redistributions of source code must retain the above copyright
52       notice, this list of conditions and the following disclaimer.
53    2. Redistributions in binary form must reproduce the above copyright
54       notice, this list of conditions and the following disclaimer in the
55       documentation and/or other materials provided with the distribution.
56    3. All advertising materials mentioning features or use of this software
57       must display the following acknowledgement:
58 
59       This product includes software developed by Eric Rescorla for
60       RTFM, Inc.
61 
62    4. Neither the name of RTFM, Inc. nor the name of Eric Rescorla may be
63       used to endorse or promote products derived from this
64       software without specific prior written permission.
65 
66    THIS SOFTWARE IS PROVIDED BY ERIC RESCORLA AND RTFM, INC. ``AS IS'' AND
67    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
68    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
70    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
71    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
72    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
73    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
74    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
75    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY SUCH DAMAGE.
76 
77    $Id: r_data.c,v 1.2 2006/08/16 19:39:17 adamcain Exp $
78 
79    ekr@rtfm.com  Tue Aug 17 15:39:50 1999
80  */
81 
82 #include <string.h>
83 #include <r_common.h>
84 #include <r_data.h>
85 #include <string.h>
86 
r_data_create(dp,d,l)87 int r_data_create(dp,d,l)
88   Data **dp;
89   const UCHAR *d;
90   size_t l;
91   {
92     Data *d_=0;
93     int _status;
94 
95     if(!(d_=(Data *)RCALLOC(sizeof(Data))))
96       ABORT(R_NO_MEMORY);
97     if(!(d_->data=(UCHAR *)RMALLOC(l)))
98       ABORT(R_NO_MEMORY);
99 
100     if (d) {
101       memcpy(d_->data,d,l);
102     }
103     d_->len=l;
104 
105     *dp=d_;
106 
107     _status=0;
108   abort:
109     if(_status)
110       r_data_destroy(&d_);
111 
112     return(_status);
113   }
114 
115 
r_data_alloc_mem(d,l)116 int r_data_alloc_mem(d,l)
117   Data *d;
118   size_t l;
119   {
120     int _status;
121 
122     if(!(d->data=(UCHAR *)RMALLOC(l)))
123       ABORT(R_NO_MEMORY);
124     d->len=l;
125 
126     _status=0;
127   abort:
128     return(_status);
129   }
130 
r_data_alloc(dp,l)131 int r_data_alloc(dp,l)
132   Data **dp;
133   size_t l;
134   {
135     Data *d_=0;
136     int _status;
137 
138     if(!(d_=(Data *)RCALLOC(sizeof(Data))))
139       ABORT(R_NO_MEMORY);
140     if(!(d_->data=(UCHAR *)RCALLOC(l)))
141       ABORT(R_NO_MEMORY);
142 
143     d_->len=l;
144 
145     *dp=d_;
146     _status=0;
147   abort:
148     if(_status)
149       r_data_destroy(&d_);
150 
151     return(_status);
152   }
153 
r_data_make(dp,d,l)154 int r_data_make(dp,d,l)
155   Data *dp;
156   const UCHAR *d;
157   size_t l;
158   {
159     if(!(dp->data=(UCHAR *)RMALLOC(l)))
160       ERETURN(R_NO_MEMORY);
161 
162     memcpy(dp->data,d,l);
163     dp->len=l;
164 
165     return(0);
166   }
167 
r_data_destroy(dp)168 int r_data_destroy(dp)
169   Data **dp;
170   {
171     if(!dp || !*dp)
172       return(0);
173 
174     if((*dp)->data)
175       RFREE((*dp)->data);
176 
177     RFREE(*dp);
178     *dp=0;
179 
180     return(0);
181   }
182 
r_data_destroy_v(v)183 int r_data_destroy_v(v)
184   void *v;
185   {
186     Data *d;
187 
188     if(!v)
189       return(0);
190 
191     d=(Data *)v;
192     r_data_zfree(d);
193 
194     RFREE(d);
195 
196     return(0);
197   }
198 
r_data_destroy_vp(v)199 int r_data_destroy_vp(v)
200   void **v;
201   {
202     Data *d;
203 
204     if(!v || !*v)
205       return(0);
206 
207     d=(Data *)*v;
208     r_data_zfree(d);
209 
210     *v=0;
211     RFREE(d);
212 
213     return(0);
214   }
215 
r_data_copy(dst,src)216 int r_data_copy(dst,src)
217   Data *dst;
218   Data *src;
219   {
220     if(!(dst->data=(UCHAR *)RMALLOC(src->len)))
221       ERETURN(R_NO_MEMORY);
222     memcpy(dst->data,src->data,dst->len=src->len);
223     return(0);
224   }
225 
r_data_zfree(d)226 int r_data_zfree(d)
227   Data *d;
228   {
229     if(!d)
230       return(0);
231     if(!d->data)
232       return(0);
233     memset(d->data,0,d->len);
234     RFREE(d->data);
235     return(0);
236   }
237 
r_data_compare(d1,d2)238 int r_data_compare(d1,d2)
239   Data *d1;
240   Data *d2;
241   {
242     if(d1->len<d2->len)
243       return(-1);
244     if(d2->len<d1->len)
245       return(-1);
246     return(memcmp(d1->data,d2->data,d1->len));
247   }
248 
249