source: rtems-libbsd/freebsd/sbin/dhclient/privsep.c @ 87bff39

5-freebsd-12freebsd-9.3
Last change on this file since 87bff39 was 87bff39, checked in by Sebastian Huber <sebastian.huber@…>, on Apr 18, 2016 at 12:20:29 PM

dhclient: Avoid SIZE_T_MAX

Use SIZE_MAX instead of SIZE_T_MAX to avoid a dependency on BSD
specifics.

  • Property mode set to 100644
File size: 6.1 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
2
3/*      $OpenBSD: privsep.c,v 1.7 2004/05/10 18:34:42 deraadt Exp $ */
4
5/*
6 * Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
17 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
18 * OF OR IN CONNECTION WITH THE USE, ABUSE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21#include <sys/cdefs.h>
22__FBSDID("$FreeBSD$");
23
24#include "dhcpd.h"
25#include "privsep.h"
26#ifdef __rtems__
27#define SIZE_T_MAX      SIZE_MAX
28#endif /* __rtems__ */
29
30struct buf *
31buf_open(size_t len)
32{
33        struct buf      *buf;
34
35        if ((buf = calloc(1, sizeof(struct buf))) == NULL)
36                return (NULL);
37        if ((buf->buf = malloc(len)) == NULL) {
38                free(buf);
39                return (NULL);
40        }
41        buf->size = len;
42
43        return (buf);
44}
45
46int
47buf_add(struct buf *buf, void *data, size_t len)
48{
49        if (buf->wpos + len > buf->size)
50                return (-1);
51
52        memcpy(buf->buf + buf->wpos, data, len);
53        buf->wpos += len;
54        return (0);
55}
56
57int
58buf_close(int sock, struct buf *buf)
59{
60        ssize_t n;
61
62        do {
63                n = write(sock, buf->buf + buf->rpos, buf->size - buf->rpos);
64                if (n != -1)
65                        buf->rpos += n;
66                if (n == 0) {                   /* connection closed */
67                        errno = 0;
68                        return (-1);
69                }
70        } while (n == -1 && (errno == EAGAIN || errno == EINTR));
71
72        if (buf->rpos < buf->size)
73                error("short write: wanted %lu got %ld bytes",
74                    (unsigned long)buf->size, (long)buf->rpos);
75
76        free(buf->buf);
77        free(buf);
78        return (n);
79}
80
81ssize_t
82buf_read(int sock, void *buf, size_t nbytes)
83{
84        ssize_t n, r = 0;
85        char *p = buf;
86
87        do {
88                n = read(sock, p, nbytes);
89                if (n == 0)
90                        error("connection closed");
91                if (n != -1) {
92                        r += n;
93                        p += n;
94                        nbytes -= n;
95                }
96        } while (n == -1 && (errno == EINTR || errno == EAGAIN));
97
98        if (n == -1)
99                error("buf_read: %m");
100
101        if (r < nbytes)
102                error("short read: wanted %lu got %ld bytes",
103                    (unsigned long)nbytes, (long)r);
104
105        return (r);
106}
107
108void
109dispatch_imsg(int fd)
110{
111        struct imsg_hdr          hdr;
112        char                    *medium, *reason, *filename,
113                                *servername, *prefix;
114        size_t                   medium_len, reason_len, filename_len,
115                                 servername_len, prefix_len, totlen;
116        struct client_lease      lease;
117        int                      ret, i, optlen;
118        struct buf              *buf;
119
120        buf_read(fd, &hdr, sizeof(hdr));
121
122        switch (hdr.code) {
123        case IMSG_SCRIPT_INIT:
124                if (hdr.len < sizeof(hdr) + sizeof(size_t))
125                        error("corrupted message received");
126                buf_read(fd, &medium_len, sizeof(medium_len));
127                if (hdr.len < medium_len + sizeof(size_t) + sizeof(hdr)
128                    + sizeof(size_t) || medium_len == SIZE_T_MAX)
129                        error("corrupted message received");
130                if (medium_len > 0) {
131                        if ((medium = calloc(1, medium_len + 1)) == NULL)
132                                error("%m");
133                        buf_read(fd, medium, medium_len);
134                } else
135                        medium = NULL;
136
137                buf_read(fd, &reason_len, sizeof(reason_len));
138                if (hdr.len < medium_len + reason_len + sizeof(hdr) ||
139                    reason_len == SIZE_T_MAX)
140                        error("corrupted message received");
141                if (reason_len > 0) {
142                        if ((reason = calloc(1, reason_len + 1)) == NULL)
143                                error("%m");
144                        buf_read(fd, reason, reason_len);
145                } else
146                        reason = NULL;
147
148                priv_script_init(reason, medium);
149                free(reason);
150                free(medium);
151                break;
152        case IMSG_SCRIPT_WRITE_PARAMS:
153                bzero(&lease, sizeof lease);
154                totlen = sizeof(hdr) + sizeof(lease) + sizeof(size_t);
155                if (hdr.len < totlen)
156                        error("corrupted message received");
157                buf_read(fd, &lease, sizeof(lease));
158
159                buf_read(fd, &filename_len, sizeof(filename_len));
160                totlen += filename_len + sizeof(size_t);
161                if (hdr.len < totlen || filename_len == SIZE_T_MAX)
162                        error("corrupted message received");
163                if (filename_len > 0) {
164                        if ((filename = calloc(1, filename_len + 1)) == NULL)
165                                error("%m");
166                        buf_read(fd, filename, filename_len);
167                } else
168                        filename = NULL;
169
170                buf_read(fd, &servername_len, sizeof(servername_len));
171                totlen += servername_len + sizeof(size_t);
172                if (hdr.len < totlen || servername_len == SIZE_T_MAX)
173                        error("corrupted message received");
174                if (servername_len > 0) {
175                        if ((servername =
176                            calloc(1, servername_len + 1)) == NULL)
177                                error("%m");
178                        buf_read(fd, servername, servername_len);
179                } else
180                        servername = NULL;
181
182                buf_read(fd, &prefix_len, sizeof(prefix_len));
183                totlen += prefix_len;
184                if (hdr.len < totlen || prefix_len == SIZE_T_MAX)
185                        error("corrupted message received");
186                if (prefix_len > 0) {
187                        if ((prefix = calloc(1, prefix_len + 1)) == NULL)
188                                error("%m");
189                        buf_read(fd, prefix, prefix_len);
190                } else
191                        prefix = NULL;
192
193                for (i = 0; i < 256; i++) {
194                        totlen += sizeof(optlen);
195                        if (hdr.len < totlen)
196                                error("corrupted message received");
197                        buf_read(fd, &optlen, sizeof(optlen));
198                        lease.options[i].data = NULL;
199                        lease.options[i].len = optlen;
200                        if (optlen > 0) {
201                                totlen += optlen;
202                                if (hdr.len < totlen || optlen == SIZE_T_MAX)
203                                        error("corrupted message received");
204                                lease.options[i].data =
205                                    calloc(1, optlen + 1);
206                                if (lease.options[i].data == NULL)
207                                    error("%m");
208                                buf_read(fd, lease.options[i].data, optlen);
209                        }
210                }
211                lease.server_name = servername;
212                lease.filename = filename;
213
214                priv_script_write_params(prefix, &lease);
215
216                free(servername);
217                free(filename);
218                free(prefix);
219                for (i = 0; i < 256; i++)
220                        if (lease.options[i].len > 0)
221                                free(lease.options[i].data);
222                break;
223        case IMSG_SCRIPT_GO:
224                if (hdr.len != sizeof(hdr))
225                        error("corrupted message received");
226
227                ret = priv_script_go();
228
229                hdr.code = IMSG_SCRIPT_GO_RET;
230                hdr.len = sizeof(struct imsg_hdr) + sizeof(int);
231                if ((buf = buf_open(hdr.len)) == NULL)
232                        error("buf_open: %m");
233                if (buf_add(buf, &hdr, sizeof(hdr)))
234                        error("buf_add: %m");
235                if (buf_add(buf, &ret, sizeof(ret)))
236                        error("buf_add: %m");
237                if (buf_close(fd, buf) == -1)
238                        error("buf_close: %m");
239                break;
240        default:
241                error("received unknown message, code %d", hdr.code);
242        }
243}
Note: See TracBrowser for help on using the repository browser.