Coverage Report

Created: 2026-10-13 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssh/msg.c
Line
Count
Source
1
/* $OpenBSD: msg.c,v 1.22 2026/02/14 00:18:34 jsg Exp $ */
2
/*
3
 * Copyright (c) 2002 Markus Friedl.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 *
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
 */
25
26
#include "includes.h"
27
28
#include <sys/types.h>
29
30
#include <errno.h>
31
#include <string.h>
32
#include <unistd.h>
33
#include <stdarg.h>
34
35
#include "sshbuf.h"
36
#include "log.h"
37
#include "atomicio.h"
38
#include "msg.h"
39
#include "misc.h"
40
41
int
42
ssh_msg_send(int fd, u_char type, struct sshbuf *m)
43
0
{
44
0
  u_char buf[5];
45
0
  u_int mlen = sshbuf_len(m);
46
47
0
  debug3_f("type %u len %zu", (unsigned int)type & 0xff, sshbuf_len(m));
48
49
0
  put_u32(buf, mlen + 1);
50
0
  buf[4] = type;    /* 1st byte of payload is mesg-type */
51
0
  if (atomicio(vwrite, fd, buf, sizeof(buf)) != sizeof(buf)) {
52
0
    error_f("write: %s", strerror(errno));
53
0
    return (-1);
54
0
  }
55
0
  if (atomicio(vwrite, fd, sshbuf_mutable_ptr(m), mlen) != mlen) {
56
0
    error_f("write: %s", strerror(errno));
57
0
    return (-1);
58
0
  }
59
0
  debug3_f("done");
60
0
  return (0);
61
0
}
62
63
int
64
ssh_msg_recv(int fd, struct sshbuf *m)
65
0
{
66
0
  u_char buf[4], *p;
67
0
  u_int msg_len;
68
0
  int r;
69
70
0
  debug3("ssh_msg_recv entering");
71
72
0
  if (atomicio(read, fd, buf, sizeof(buf)) != sizeof(buf)) {
73
0
    if (errno != EPIPE)
74
0
      error_f("read header: %s", strerror(errno));
75
0
    return (-1);
76
0
  }
77
0
  msg_len = get_u32(buf);
78
0
  if (msg_len > sshbuf_max_size(m)) {
79
0
    error_f("read: bad msg_len %u", msg_len);
80
0
    return (-1);
81
0
  }
82
0
  sshbuf_reset(m);
83
0
  if ((r = sshbuf_reserve(m, msg_len, &p)) != 0) {
84
0
    error_fr(r, "reserve");
85
0
    return -1;
86
0
  }
87
0
  if (atomicio(read, fd, p, msg_len) != msg_len) {
88
0
    error_f("read: %s", strerror(errno));
89
0
    return (-1);
90
0
  }
91
0
  return (0);
92
0
}