aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/systemtap/systemtap/0001-Fixes-for-gcc-8.patch
blob: a1b0bff02ac4b86d9c9b7c00bd3ea7b750d25bbb (plain)
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
From 4ffe00f1d9eac332d928f7dc01fe250dc32b1bb8 Mon Sep 17 00:00:00 2001
From: Stan Cox <scox@redhat.com>
Date: Tue, 13 Feb 2018 22:38:03 -0500
Subject: [PATCH] Fixes for gcc 8

* includes/sys/sdt.h (__SDT_COND_SIGNED):  Add CT, cast type argument

Author: Will Cohen <wcohen.redhat.com>

* stap-serverd.cxx (generate_mok, handleRequest, handle_connection):
  Catch format overflow

* translate.cxx (translate_pass): Use ref in catch.
---
Upstream-Status: Backport
Signed-off-by: Khem Raj <raj.khem@gmail.com>

 includes/sys/sdt.h | 20 ++++++++--------
 stap-serverd.cxx   | 67 +++++++++++++++++++++++++++++++++++++++++++++++-------
 translate.cxx      |  2 +-
 3 files changed, 70 insertions(+), 19 deletions(-)

diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h
index 940f74483..c0c5a492c 100644
--- a/includes/sys/sdt.h
+++ b/includes/sys/sdt.h
@@ -119,8 +119,8 @@ struct __sdt_type
   
 #define __SDT_ALWAYS_SIGNED(T) \
 template<> struct __sdt_type<T> { static const bool __sdt_signed = true; };
-#define __SDT_COND_SIGNED(T) \
-template<> struct __sdt_type<T> { static const bool __sdt_signed = ((T)(-1) < 1); };
+#define __SDT_COND_SIGNED(T,CT)						\
+template<> struct __sdt_type<T> { static const bool __sdt_signed = ((CT)(-1) < 1); };
 __SDT_ALWAYS_SIGNED(signed char)
 __SDT_ALWAYS_SIGNED(short)
 __SDT_ALWAYS_SIGNED(int)
@@ -141,14 +141,14 @@ __SDT_ALWAYS_SIGNED(const volatile short)
 __SDT_ALWAYS_SIGNED(const volatile int)
 __SDT_ALWAYS_SIGNED(const volatile long)
 __SDT_ALWAYS_SIGNED(const volatile long long)
-__SDT_COND_SIGNED(char)
-__SDT_COND_SIGNED(wchar_t)
-__SDT_COND_SIGNED(volatile char)
-__SDT_COND_SIGNED(volatile wchar_t)
-__SDT_COND_SIGNED(const char)
-__SDT_COND_SIGNED(const wchar_t)
-__SDT_COND_SIGNED(const volatile char)
-__SDT_COND_SIGNED(const volatile wchar_t)
+__SDT_COND_SIGNED(char, char)
+__SDT_COND_SIGNED(wchar_t, wchar_t)
+__SDT_COND_SIGNED(volatile char, char)
+__SDT_COND_SIGNED(volatile wchar_t, wchar_t)
+__SDT_COND_SIGNED(const char, char)
+__SDT_COND_SIGNED(const wchar_t, wchar_t)
+__SDT_COND_SIGNED(const volatile char, char)
+__SDT_COND_SIGNED(const volatile wchar_t, wchar_t)
 #if defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
 /* __SDT_COND_SIGNED(char16_t) */
 /* __SDT_COND_SIGNED(char32_t) */
diff --git a/stap-serverd.cxx b/stap-serverd.cxx
index 7cf76c617..41f77ee9e 100644
--- a/stap-serverd.cxx
+++ b/stap-serverd.cxx
@@ -1607,6 +1607,7 @@ generate_mok(string &mok_fingerprint)
   char tmpdir[PATH_MAX] = { '\0' };
   string public_cert_path, private_cert_path, destdir;
   mode_t old_umask;
+  int retlen;
 
   mok_fingerprint.clear ();
 
@@ -1631,7 +1632,14 @@ generate_mok(string &mok_fingerprint)
     }
 
   // Make a temporary directory to store results in.
-  snprintf (tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", mok_path.c_str ());
+  retlen = snprintf (tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", mok_path.c_str ());
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Could not create %s name", "temporary directory"));
+      tmpdir[0] = '\0';
+      goto cleanup;
+    }
+
   if (mkdtemp (tmpdir) == NULL)
     {
       server_error (_F("Could not create temporary directory %s: %s", tmpdir, 
@@ -1704,6 +1712,7 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
   unsigned u;
   unsigned i;
   FILE* f;
+  int retlen;
 
   // Save the server version. Do this early, so the client knows what version of the server
   // it is dealing with, even if the request is not fully completed.
@@ -1782,7 +1791,12 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
       struct stat st;
       char *arg;
 
-      snprintf (stapargfile, PATH_MAX, "%s/argv%d", requestDirName.c_str (), i);
+      retlen = snprintf (stapargfile, PATH_MAX, "%s/argv%d", requestDirName.c_str (), i);
+      if (retlen < 0 || retlen >= PATH_MAX)
+        {
+          server_error (_F("Error creating %s name", "path"));
+          return;
+        }
 
       rc = stat(stapargfile, & st);
       if (rc) break;
@@ -1888,7 +1902,15 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri
     {
       glob_t globber;
       char pattern[PATH_MAX];
-      snprintf (pattern, PATH_MAX, "%s/*.ko", new_staptmpdir.c_str());
+      int retlen;
+
+      retlen = snprintf (pattern, PATH_MAX, "%s/*.ko", new_staptmpdir.c_str());
+      if (retlen < 0 || retlen >= PATH_MAX)
+        {
+          server_error (_F("Error creating %s name", "pattern"));
+          return;
+        }
+
       rc = glob (pattern, GLOB_ERR, NULL, &globber);
       if (rc)
         server_error (_F("Unable to find a module in %s", new_staptmpdir.c_str()));
@@ -2164,6 +2186,7 @@ handle_connection (void *arg)
                         copy for each connection.*/
   vector<string>     argv;
   PRInt32            bytesRead;
+  int		     retlen;
 
   /* Detatch to avoid a memory leak */
   if(max_threads > 0)
@@ -2213,7 +2236,13 @@ handle_connection (void *arg)
 #endif
 
   secStatus = SECFailure;
-  snprintf(tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", getenv("TMPDIR") ?: "/tmp");
+  retlen = snprintf(tmpdir, PATH_MAX, "%s/stap-server.XXXXXX", getenv("TMPDIR") ?: "/tmp");
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Error creating %s name", "temporary directory"));
+      tmpdir[0]=0; /* prevent /bin/rm */
+      goto cleanup;
+    }
   rc1 = mkdtemp(tmpdir);
   if (! rc1)
     {
@@ -2223,9 +2252,20 @@ handle_connection (void *arg)
     }
 
   /* Create a temporary files names and directories.  */
-  snprintf (requestFileName, PATH_MAX, "%s/request.zip", tmpdir);
+  retlen = snprintf (requestFileName, PATH_MAX, "%s/request.zip", tmpdir);
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Error creating %s name", "request.zip path"));
+      goto cleanup;
+    }
+
+  retlen = snprintf (requestDirName, PATH_MAX, "%s/request", tmpdir);
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Error creating %s name", "request directory path"));
+      goto cleanup;
+    }
 
-  snprintf (requestDirName, PATH_MAX, "%s/request", tmpdir);
   rc = mkdir(requestDirName, 0700);
   if (rc)
     {
@@ -2233,7 +2273,13 @@ handle_connection (void *arg)
       goto cleanup;
     }
 
-  snprintf (responseDirName, PATH_MAX, "%s/response", tmpdir);
+  retlen = snprintf (responseDirName, PATH_MAX, "%s/response", tmpdir);
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Error creating %s name", "response directory path"));
+      goto cleanup;
+    }
+
   rc = mkdir(responseDirName, 0700);
   if (rc)
     {
@@ -2243,7 +2289,12 @@ handle_connection (void *arg)
   // Set this early, since it gets used for errors to be returned to the client.
   stapstderr = string(responseDirName) + "/stderr";
 
-  snprintf (responseFileName, PATH_MAX, "%s/response.zip", tmpdir);
+  retlen = snprintf (responseFileName, PATH_MAX, "%s/response.zip", tmpdir);
+  if (retlen < 0 || retlen >= PATH_MAX)
+    {
+      server_error (_F("Error creating %s name", "response.zip path"));
+      goto cleanup;
+    }
 
   /* Read data from the socket.
    * If the user is requesting/requiring authentication, authenticate
diff --git a/translate.cxx b/translate.cxx
index 1240a80ec..4ade06fdd 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -7860,7 +7860,7 @@ translate_pass (systemtap_session& s)
 	  if (versions.size() >= 3 && s.verbose > 1)
 	    clog << _F("ignoring extra parts of compat version: %s", s.compatible.c_str()) << endl;
 	}
-      catch (const runtime_error)
+      catch (const runtime_error&)
 	{
 	  throw SEMANTIC_ERROR(_F("parse error in compatibility version: %s", s.compatible.c_str()));
 	}