File: null-deref-pr108251-smp_fetch_ssl_fc_has_early-O2.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A14.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,099,328 kB
  • sloc: cpp: 3,627,108; ansic: 2,571,498; ada: 834,230; f90: 235,082; makefile: 79,231; asm: 74,984; xml: 51,692; exp: 39,736; sh: 33,298; objc: 15,629; python: 15,069; fortran: 14,429; pascal: 7,003; awk: 5,070; perl: 3,106; ml: 285; lisp: 253; lex: 204; haskell: 135
file content (99 lines) | stat: -rw-r--r-- 2,351 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/* Reduced from haproxy's src/ssl_sample.c  */

/* { dg-require-effective-target ptr_eq_long } */
/* { dg-additional-options "-O2 -Wno-analyzer-symbol-too-complex" } */

union sample_value {
  long long int sint;
  /* [...snip...]  */
};

struct sample_data {
 int type;
 union sample_value u;
};

enum {
  /* [...snip...]  */
 SMP_T_BOOL,
  /* [...snip...]  */
};
struct sample {
 unsigned int flags;
 struct sample_data data;
  /* [...snip...]  */
 struct session *sess;
 struct stream *strm;
  /* [...snip...]  */
};
struct arg {
  /* [...snip...]  */
};
enum obj_type {
 OBJ_TYPE_NONE = 0,
  /* [...snip...]  */
 OBJ_TYPE_CONN,
  /* [...snip...]  */
 OBJ_TYPE_CHECK,
 OBJ_TYPE_ENTRIES
};
enum {
  /* [...snip...]  */
 CO_FL_EARLY_SSL_HS = 0x00004000,
 CO_FL_EARLY_DATA = 0x00008000,
  /* [...snip...]  */
 CO_FL_SSL_WAIT_HS = 0x08000000,
  /* [...snip...]  */
};
struct connection {
 enum obj_type obj_type;
 unsigned char err_code;
  /* [...snip...]  */
 unsigned int flags;
  /* [...snip...]  */
};

static inline enum obj_type obj_type(const enum obj_type *t)
{
 if (!t || *t >= OBJ_TYPE_ENTRIES)
  return OBJ_TYPE_NONE;
 return *t;
}
static inline struct connection *__objt_conn(enum obj_type *t)
{
 return ((struct connection *)(((char *)(t)) - ((long)&((struct connection *)0)->obj_type))); /* { dg-bogus "may result in an unaligned pointer value" "Fixed in r14-6517-gb7e4a4c626e" { target short_enums } } */
}
static inline struct connection *objt_conn(enum obj_type *t)
{
 if (!t || *t != OBJ_TYPE_CONN)
   return (struct connection *)((void *)0);
 return __objt_conn(t);
}
struct session {
  /* [...snip...]  */
 enum obj_type *origin;
  /* [...snip...]  */
};
typedef struct ssl_st SSL;
SSL *ssl_sock_get_ssl_object(struct connection *conn);

/*****************************************************************************/

int
smp_fetch_ssl_fc_has_early(const struct arg *args, struct sample *smp, const char *kw, void *Private)
{
 SSL *ssl;
 struct connection *conn;

 conn = objt_conn(smp->sess->origin);
 ssl = ssl_sock_get_ssl_object(conn);
 if (!ssl)
  return 0;

 smp->flags = 0;
 smp->data.type = SMP_T_BOOL;
 smp->data.u.sint = ((conn->flags & CO_FL_EARLY_DATA) && /* { dg-bogus "dereference of NULL" "PR analyzer/108251" { xfail *-*-*} } */
     (conn->flags & (CO_FL_EARLY_SSL_HS | CO_FL_SSL_WAIT_HS))) ? 1 : 0;

 return 1;
}