Hi,
while reviewing an snmpd diff, I noticed that the fd in struct ber was
always set to -1; and indeed snmpd, ldapd and ypldap only pass buffers
to the ber API. So this diff removes support for direct read/writes
from file descriptors and kills the related XXX.
ok?
Index: usr.sbin/ldapd/ber.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/ber.c,v
retrieving revision 1.12
diff -u -p -r1.12 ber.c
--- usr.sbin/ldapd/ber.c 11 Feb 2017 20:40:03 -0000 1.12
+++ usr.sbin/ldapd/ber.c 5 Feb 2018 17:51:37 -0000
@@ -783,10 +783,6 @@ ber_write_elements(struct ber *ber, stru
if (ber_dump_element(ber, root) == -1)
return -1;
- /* XXX this should be moved to a different function */
- if (ber->fd != -1)
- return write(ber->fd, ber->br_wbuf, len);
-
return (len);
}
@@ -1095,9 +1091,9 @@ ber_read_element(struct ber *ber, struct
DPRINTF("ber read element size %zd\n", len);
totlen += r + len;
- /* If using an external buffer and the total size of the element
- * is larger then the external buffer don't bother to continue. */
- if (ber->fd == -1 && len > ber->br_rend - ber->br_rptr) {
+ /* If the total size of the element is larger than the buffer
+ * don't bother to continue. */
+ if (len > ber->br_rend - ber->br_rptr) {
errno = ECANCELED;
return -1;
}
@@ -1243,17 +1239,7 @@ ber_free(struct ber *b)
static ssize_t
ber_getc(struct ber *b, u_char *c)
{
- ssize_t r;
- /*
- * XXX calling read here is wrong in many ways. The most obvious one
- * being that we will block till data arrives.
- * But for now it is _good enough_ *gulp*
- */
- if (b->fd == -1)
- r = ber_readbuf(b, c, 1);
- else
- r = read(b->fd, c, 1);
- return r;
+ return ber_readbuf(b, c, 1);
}
static ssize_t
@@ -1262,22 +1248,10 @@ ber_read(struct ber *ber, void *buf, siz
u_char *b = buf;
ssize_t r, remain = len;
- /*
- * XXX calling read here is wrong in many ways. The most obvious one
- * being that we will block till data arrives.
- * But for now it is _good enough_ *gulp*
- */
-
while (remain > 0) {
- if (ber->fd == -1)
- r = ber_readbuf(ber, b, remain);
- else
- r = read(ber->fd, b, remain);
- if (r == -1) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
+ r = ber_readbuf(ber, b, remain);
+ if (r == -1)
return -1;
- }
if (r == 0)
return (b - (u_char *)buf);
b += r;
Index: usr.sbin/ldapd/ber.h
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/ber.h,v
retrieving revision 1.2
diff -u -p -r1.2 ber.h
--- usr.sbin/ldapd/ber.h 11 Feb 2017 20:40:03 -0000 1.2
+++ usr.sbin/ldapd/ber.h 5 Feb 2018 17:51:37 -0000
@@ -35,7 +35,6 @@ struct ber_element {
};
struct ber {
- int fd;
u_char *br_wbuf;
u_char *br_wptr;
u_char *br_wend;
Index: usr.sbin/ldapd/conn.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/conn.c,v
retrieving revision 1.14
diff -u -p -r1.14 conn.c
--- usr.sbin/ldapd/conn.c 20 Jan 2017 11:55:08 -0000 1.14
+++ usr.sbin/ldapd/conn.c 5 Feb 2018 17:51:37 -0000
@@ -296,7 +296,6 @@ conn_accept(int fd, short event, void *d
log_warn("malloc");
goto giveup;
}
- conn->ber.fd = -1;
ber_set_application(&conn->ber, ldap_application);
conn->fd = afd;
conn->listener = l;
Index: usr.sbin/ldapd/util.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/util.c,v
retrieving revision 1.8
diff -u -p -r1.8 util.c
--- usr.sbin/ldapd/util.c 20 Jan 2017 11:55:08 -0000 1.8
+++ usr.sbin/ldapd/util.c 5 Feb 2018 17:51:37 -0000
@@ -113,7 +113,6 @@ ber2db(struct ber_element *root, struct
memset(val, 0, sizeof(*val));
memset(&ber, 0, sizeof(ber));
- ber.fd = -1;
ber_write_elements(&ber, root);
if ((len = ber_get_writebuf(&ber, &buf)) == -1)
@@ -168,7 +167,6 @@ db2ber(struct btval *val, int compressio
assert(val != NULL);
memset(&ber, 0, sizeof(ber));
- ber.fd = -1;
if (compression_level > 0) {
if (val->size < sizeof(uint32_t))
Index: usr.sbin/snmpctl/snmpclient.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpctl/snmpclient.c,v
retrieving revision 1.14
diff -u -p -r1.14 snmpclient.c
--- usr.sbin/snmpctl/snmpclient.c 10 Aug 2017 16:03:10 -0000 1.14
+++ usr.sbin/snmpctl/snmpclient.c 5 Feb 2018 17:51:37 -0000
@@ -423,7 +423,6 @@ snmpc_sendreq(struct snmpc *sc, u_long t
#endif
bzero(&ber, sizeof(ber));
- ber.fd = -1;
len = ber_write_elements(&ber, root);
if (ber_get_writebuf(&ber, (void *)&ptr) < 1)
@@ -459,7 +458,6 @@ snmpc_recvresp(int s, int msgver, u_int3
return (-1);
bzero(&ber, sizeof(ber));
- ber.fd = -1;
ber_set_application(&ber, smi_application);
ber_set_readbuf(&ber, buf, rlen);
Index: usr.sbin/snmpd/ber.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/ber.c,v
retrieving revision 1.31
diff -u -p -r1.31 ber.c
--- usr.sbin/snmpd/ber.c 5 Mar 2016 03:31:36 -0000 1.31
+++ usr.sbin/snmpd/ber.c 5 Feb 2018 17:51:37 -0000
@@ -796,10 +796,6 @@ ber_write_elements(struct ber *ber, stru
if (ber_dump_element(ber, root) == -1)
return -1;
- /* XXX this should be moved to a different function */
- if (ber->fd != -1)
- return write(ber->fd, ber->br_wbuf, len);
-
return (len);
}
@@ -1104,9 +1100,9 @@ ber_read_element(struct ber *ber, struct
DPRINTF("ber read element size %zd\n", len);
totlen += r + len;
- /* If using an external buffer and the total size of the element
- * is larger then the external buffer don't bother to continue. */
- if (ber->fd == -1 && len > ber->br_rend - ber->br_rptr) {
+ /* If the total size of the element is larger than the buffer
+ * don't bother to continue. */
+ if (len > ber->br_rend - ber->br_rptr) {
errno = ECANCELED;
return -1;
}
@@ -1271,22 +1267,10 @@ ber_read(struct ber *ber, void *buf, siz
u_char *b = buf;
ssize_t r, remain = len;
- /*
- * XXX calling read here is wrong in many ways. The most obvious one
- * being that we will block till data arrives.
- * But for now it is _good enough_ *gulp*
- */
-
while (remain > 0) {
- if (ber->fd == -1)
- r = ber_readbuf(ber, b, remain);
- else
- r = read(ber->fd, b, remain);
- if (r == -1) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
+ r = ber_readbuf(ber, b, remain);
+ if (r == -1)
return -1;
- }
if (r == 0)
return (b - (u_char *)buf);
b += r;
Index: usr.sbin/snmpd/ber.h
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/ber.h,v
retrieving revision 1.9
diff -u -p -r1.9 ber.h
--- usr.sbin/snmpd/ber.h 1 Oct 2013 12:41:47 -0000 1.9
+++ usr.sbin/snmpd/ber.h 5 Feb 2018 17:51:37 -0000
@@ -41,7 +41,6 @@ struct ber_element {
};
struct ber {
- int fd;
off_t br_offs;
u_char *br_wbuf;
u_char *br_wptr;
Index: usr.sbin/snmpd/snmpe.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.50
diff -u -p -r1.50 snmpe.c
--- usr.sbin/snmpd/snmpe.c 12 Aug 2017 16:31:09 -0000 1.50
+++ usr.sbin/snmpd/snmpe.c 5 Feb 2018 17:51:37 -0000
@@ -514,7 +514,6 @@ snmpe_recvmsg(int fd, short sig, void *a
msg->sm_datalen = (size_t)len;
bzero(&msg->sm_ber, sizeof(msg->sm_ber));
- msg->sm_ber.fd = -1;
ber_set_application(&msg->sm_ber, smi_application);
ber_set_readbuf(&msg->sm_ber, msg->sm_data, msg->sm_datalen);
Index: usr.sbin/snmpd/trap.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/trap.c,v
retrieving revision 1.30
diff -u -p -r1.30 trap.c
--- usr.sbin/snmpd/trap.c 20 Jan 2018 18:49:12 -0000 1.30
+++ usr.sbin/snmpd/trap.c 5 Feb 2018 17:51:37 -0000
@@ -183,7 +183,6 @@ trap_send(struct ber_oid *oid, struct be
ber_link_elements(c, elm);
bzero(&ber, sizeof(ber));
- ber.fd = -1;
TAILQ_FOREACH(tr, &snmpd_env->sc_trapreceivers, entry) {
if (tr->sa_oid != NULL && tr->sa_oid->bo_n) {
Index: usr.sbin/snmpd/traphandler.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/traphandler.c,v
retrieving revision 1.10
diff -u -p -r1.10 traphandler.c
--- usr.sbin/snmpd/traphandler.c 5 Jan 2018 08:13:32 -0000 1.10
+++ usr.sbin/snmpd/traphandler.c 5 Feb 2018 17:51:37 -0000
@@ -218,7 +218,6 @@ traphandler_parse(char *buf, size_t n, s
u_int vers, gtype, etype;
bzero(&ber, sizeof(ber));
- ber.fd = -1;
ber_set_application(&ber, smi_application);
ber_set_readbuf(&ber, buf, n);
Index: usr.sbin/snmpd/usm.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.11
diff -u -p -r1.11 usm.c
--- usr.sbin/snmpd/usm.c 28 Oct 2016 08:01:53 -0000 1.11
+++ usr.sbin/snmpd/usm.c 5 Feb 2018 17:51:37 -0000
@@ -229,7 +229,6 @@ usm_decode(struct snmp_message *msg, str
goto done;
}
- ber.fd = -1;
ber_set_readbuf(&ber, usmparams, len);
usm = ber_read_elements(&ber, NULL);
if (usm == NULL) {
@@ -341,7 +340,6 @@ usm_encode(struct snmp_message *msg, str
msg->sm_digest_offs = 0;
bzero(&ber, sizeof(ber));
- ber.fd = -1;
usm = ber_add_sequence(NULL);
@@ -424,7 +422,6 @@ usm_encrypt(struct snmp_message *msg, st
return pdu;
bzero(&ber, sizeof(ber));
- ber.fd = -1;
#ifdef DEBUG
fprintf(stderr, "encrypted PDU:\n");
@@ -544,7 +541,6 @@ usm_decrypt(struct snmp_message *msg, st
return NULL;
bzero(&ber, sizeof(ber));
- ber.fd = -1;
ber_set_readbuf(&ber, buf, scoped_pdu_len);
scoped_pdu = ber_read_elements(&ber, NULL);
Index: usr.sbin/ypldap/aldap.c
===================================================================
RCS file: /cvs/src/usr.sbin/ypldap/aldap.c,v
retrieving revision 1.38
diff -u -p -r1.38 aldap.c
--- usr.sbin/ypldap/aldap.c 21 Dec 2017 05:09:56 -0000 1.38
+++ usr.sbin/ypldap/aldap.c 5 Feb 2018 17:51:37 -0000
@@ -91,7 +91,6 @@ aldap_init(int fd)
return NULL;
a->buf = evbuffer_new();
a->fd = fd;
- a->ber.fd = -1;
ber_set_application(&a->ber, aldap_application);
return a;
@@ -318,7 +317,6 @@ aldap_create_page_control(struct ber_ele
struct ber_element *ber = NULL;
c.br_wbuf = NULL;
- c.fd = -1;
ber = ber_add_sequence(NULL);
@@ -462,7 +460,6 @@ aldap_parse_page_control(struct ber_elem
struct aldap_page_control *page;
b.br_wbuf = NULL;
- b.fd = -1;
ber_scanf_elements(control, "ss", &oid, &encoded);
ber_set_readbuf(&b, encoded, control->be_next->be_len);
elm = ber_read_elements(&b, NULL);
Index: usr.sbin/ypldap/ber.c
===================================================================
RCS file: /cvs/src/usr.sbin/ypldap/ber.c,v
retrieving revision 1.12
diff -u -p -r1.12 ber.c
--- usr.sbin/ypldap/ber.c 6 Apr 2016 13:04:10 -0000 1.12
+++ usr.sbin/ypldap/ber.c 5 Feb 2018 17:51:37 -0000
@@ -783,10 +783,6 @@ ber_write_elements(struct ber *ber, stru
if (ber_dump_element(ber, root) == -1)
return -1;
- /* XXX this should be moved to a different function */
- if (ber->fd != -1)
- return write(ber->fd, ber->br_wbuf, len);
-
return (len);
}
@@ -1082,9 +1078,9 @@ ber_read_element(struct ber *ber, struct
DPRINTF("ber read element size %zd\n", len);
totlen += r + len;
- /* If using an external buffer and the total size of the element
- * is larger then the external buffer don't bother to continue. */
- if (ber->fd == -1 && len > ber->br_rend - ber->br_rptr) {
+ /* If the total size of the element is larger than external
+ * buffer don't bother to continue. */
+ if (len > ber->br_rend - ber->br_rptr) {
errno = ECANCELED;
return -1;
}
@@ -1230,17 +1226,7 @@ ber_free(struct ber *b)
static ssize_t
ber_getc(struct ber *b, u_char *c)
{
- ssize_t r;
- /*
- * XXX calling read here is wrong in many ways. The most obvious one
- * being that we will block till data arrives.
- * But for now it is _good enough_ *gulp*
- */
- if (b->fd == -1)
- r = ber_readbuf(b, c, 1);
- else
- r = read(b->fd, c, 1);
- return r;
+ return ber_readbuf(b, c, 1);
}
static ssize_t
@@ -1249,22 +1235,10 @@ ber_read(struct ber *ber, void *buf, siz
u_char *b = buf;
ssize_t r, remain = len;
- /*
- * XXX calling read here is wrong in many ways. The most obvious one
- * being that we will block till data arrives.
- * But for now it is _good enough_ *gulp*
- */
-
while (remain > 0) {
- if (ber->fd == -1)
- r = ber_readbuf(ber, b, remain);
- else
- r = read(ber->fd, b, remain);
- if (r == -1) {
- if (errno == EINTR || errno == EAGAIN)
- continue;
+ r = ber_readbuf(ber, b, remain);
+ if (r == -1)
return -1;
- }
if (r == 0)
return (b - (u_char *)buf);
b += r;
Index: usr.sbin/ypldap/ber.h
===================================================================
RCS file: /cvs/src/usr.sbin/ypldap/ber.h,v
retrieving revision 1.2
diff -u -p -r1.2 ber.h
--- usr.sbin/ypldap/ber.h 29 Dec 2008 15:48:13 -0000 1.2
+++ usr.sbin/ypldap/ber.h 5 Feb 2018 17:51:37 -0000
@@ -35,7 +35,6 @@ struct ber_element {
};
struct ber {
- int fd;
u_char *br_wbuf;
u_char *br_wptr;
u_char *br_wend;
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE