tsocket: return EINVAL when tdgram_sendto_send() is used with len == 0
[ira/wip.git] / lib / tsocket / tsocket.c
index 076c6474a09f126e9f62afb65ceb02f7202b3408..11ae6ce9ed194ec863ec0cf161fe8536fa889102 100644 (file)
 #include "tsocket.h"
 #include "tsocket_internal.h"
 
-static int tsocket_context_destructor(struct tsocket_context *sock)
-{
-       tsocket_disconnect(sock);
-       return 0;
-}
-
-struct tsocket_context *_tsocket_context_create(TALLOC_CTX *mem_ctx,
-                                               const struct tsocket_context_ops *ops,
-                                               void *pstate,
-                                               size_t psize,
-                                               const char *type,
-                                               const char *location)
-{
-       void **ppstate = (void **)pstate;
-       struct tsocket_context *sock;
-
-       sock = talloc_zero(mem_ctx, struct tsocket_context);
-       if (!sock) {
-               return NULL;
-       }
-       sock->ops = ops;
-       sock->location = location;
-       sock->private_data = talloc_size(sock, psize);
-       if (!sock->private_data) {
-               talloc_free(sock);
-               return NULL;
-       }
-       talloc_set_name_const(sock->private_data, type);
-
-       talloc_set_destructor(sock, tsocket_context_destructor);
-
-       *ppstate = sock->private_data;
-       return sock;
-}
-
-int tsocket_set_event_context(struct tsocket_context *sock,
-                             struct tevent_context *ev)
-{
-       return sock->ops->set_event_context(sock, ev);
-}
-
-int tsocket_set_readable_handler(struct tsocket_context *sock,
-                                tsocket_event_handler_t handler,
-                                void *private_data)
-{
-       return sock->ops->set_read_handler(sock, handler, private_data);
-}
-
-int tsocket_set_writeable_handler(struct tsocket_context *sock,
-                                 tsocket_event_handler_t handler,
-                                 void *private_data)
-{
-       return sock->ops->set_write_handler(sock, handler, private_data);
-}
-
-int tsocket_connect(struct tsocket_context *sock,
-                   const struct tsocket_address *remote_addr)
-{
-       return sock->ops->connect_to(sock, remote_addr);
-}
-
-int tsocket_listen(struct tsocket_context *sock,
-                  int queue_size)
-{
-       return sock->ops->listen_on(sock, queue_size);
-}
-
-int _tsocket_accept(struct tsocket_context *sock,
-                   TALLOC_CTX *mem_ctx,
-                   struct tsocket_context **new_sock,
-                   const char *location)
-{
-       return sock->ops->accept_new(sock, mem_ctx, new_sock, location);
-}
-
-ssize_t tsocket_pending(struct tsocket_context *sock)
-{
-       return sock->ops->pending_data(sock);
-}
-
-int tsocket_readv(struct tsocket_context *sock,
-                 const struct iovec *vector, size_t count)
-{
-       return sock->ops->readv_data(sock, vector, count);
-}
-
-int tsocket_writev(struct tsocket_context *sock,
-                  const struct iovec *vector, size_t count)
-{
-       return sock->ops->writev_data(sock, vector, count);
-}
-
-int tsocket_get_status(const struct tsocket_context *sock)
-{
-       return sock->ops->get_status(sock);
-}
-
-int _tsocket_get_local_address(const struct tsocket_context *sock,
-                              TALLOC_CTX *mem_ctx,
-                              struct tsocket_address **local_addr,
-                              const char *location)
-{
-       return sock->ops->get_local_address(sock, mem_ctx,
-                                           local_addr, location);
-}
-
-int _tsocket_get_remote_address(const struct tsocket_context *sock,
-                               TALLOC_CTX *mem_ctx,
-                               struct tsocket_address **remote_addr,
-                               const char *location)
-{
-       return sock->ops->get_remote_address(sock, mem_ctx,
-                                            remote_addr, location);
-}
-
-int tsocket_get_option(const struct tsocket_context *sock,
-                      const char *option,
-                      TALLOC_CTX *mem_ctx,
-                      char **value)
-{
-       return sock->ops->get_option(sock, option, mem_ctx, value);
-}
-
-int tsocket_set_option(const struct tsocket_context *sock,
-                      const char *option,
-                      bool force,
-                      const char *value)
-{
-       return sock->ops->set_option(sock, option, force, value);
-}
-
-void tsocket_disconnect(struct tsocket_context *sock)
-{
-       sock->ops->disconnect(sock);
-}
-
 struct tsocket_address *_tsocket_address_create(TALLOC_CTX *mem_ctx,
                                                const struct tsocket_address_ops *ops,
                                                void *pstate,
@@ -205,15 +69,6 @@ struct tsocket_address *_tsocket_address_copy(const struct tsocket_address *addr
        return addr->ops->copy(addr, mem_ctx, location);
 }
 
-int _tsocket_address_create_socket(const struct tsocket_address *addr,
-                                  enum tsocket_type type,
-                                  TALLOC_CTX *mem_ctx,
-                                  struct tsocket_context **sock,
-                                  const char *location)
-{
-       return addr->ops->create_socket(addr, type, mem_ctx, sock, location);
-}
-
 struct tdgram_context {
        const char *location;
        const struct tdgram_context_ops *ops;
@@ -364,6 +219,11 @@ struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx,
        state->ops = dgram->ops;
        state->ret = -1;
 
+       if (len == 0) {
+               tevent_req_error(req, EINVAL);
+               goto post;
+       }
+
        subreq = state->ops->sendto_send(state, ev, dgram,
                                         buf, len, dst);
        if (tevent_req_nomem(subreq, req)) {