Browse code

Fix wrong use of strerror_r: it doesn't have to use/fill the buffer, it can return a pointer to a static location, as described in the manpage. This can happen on a Linux system with a foreign locale, where the LANG=C messages are returned this way. (BB #1403)

git-svn: trunk@4827

Török Edvin authored on 2009/02/19 04:08:15
Showing 5 changed files
... ...
@@ -1,3 +1,12 @@
1
+Wed Feb 18 21:39:08 EET 2009 (edwin)
2
+------------------------------------
3
+ * clamav-milter/netcode.c, clamd/others.c, clamd/server-th.c,
4
+ clamd/session.c: Fix wrong use of strerror_r: it doesn't have to
5
+ use/fill the buffer, it can return a pointer to a static location,
6
+ as described in the manpage.  This can happen on a Linux system with
7
+ a foreign locale, where the LANG=C messages are returned this way.
8
+ (BB #1403)
9
+
1 10
 Wed Feb 18 21:08:50 EET 2009 (edwin)
2 11
 ------------------------------------
3 12
  * clamd/server-th.c, unit_tests/check_clamd.c,
... ...
@@ -75,21 +75,18 @@ static int nc_socket(struct CP_ENTRY *cpe) {
75 75
     char er[256];
76 76
 
77 77
     if (s == -1) {
78
-	strerror_r(errno, er, sizeof(er));
79
-	logg("!Failed to create socket: %s\n", er);
78
+	logg("!Failed to create socket: %s\n", strerror_r(errno, er, sizeof(er)));
80 79
 	return -1;
81 80
     }
82 81
     flags = fcntl(s, F_GETFL, 0);
83 82
     if (flags == -1) {
84
-	strerror_r(errno, er, sizeof(er));
85
-	logg("!fcntl_get failed: %s\n", er);
83
+	logg("!fcntl_get failed: %s\n", strerror_r(errno, er, sizeof(er)));
86 84
 	close(s);
87 85
 	return -1;
88 86
     }
89 87
     flags |= O_NONBLOCK;
90 88
     if (fcntl(s, F_SETFL, flags) == -1) {
91
-	strerror_r(errno, er, sizeof(er));
92
-	logg("!fcntl_set failed: %s\n", er);
89
+	logg("!fcntl_set failed: %s\n", strerror_r(errno, er, sizeof(er)));
93 90
 	close(s);
94 91
 	return -1;
95 92
     }
... ...
@@ -105,8 +102,7 @@ static int nc_connect(int s, struct CP_ENTRY *cpe) {
105 105
 
106 106
     if (!res) return 0;
107 107
     if (errno != EINPROGRESS) {
108
-	strerror_r(errno, er, sizeof(er));
109
-	logg("*connect failed: %s\n", er);
108
+	logg("*connect failed: %s\n", strerror_r(errno, er, sizeof(er)));
110 109
 	close(s);
111 110
 	return -1;
112 111
     }
... ...
@@ -158,8 +154,7 @@ int nc_send(int s, const void *buff, size_t len) {
158 158
 	    continue;
159 159
 	}
160 160
 	if(errno != EAGAIN && errno != EWOULDBLOCK) {
161
-	    strerror_r(errno, er, sizeof(er));
162
-	    logg("!send failed: %s\n", er);
161
+	    logg("!send failed: %s\n", strerror_r(errno, er, sizeof(er)));
163 162
 	    close(s);
164 163
 	    return 1;
165 164
 	}
... ...
@@ -219,8 +214,7 @@ int nc_sendmsg(int s, int fd) {
219 219
 
220 220
     if((ret = sendmsg(s, &msg, 0)) == -1) {
221 221
 	char er[256];
222
-	strerror_r(errno, er, sizeof(er));
223
-	logg("!clamfi_eom: FD send failed (%s)\n", er);
222
+	logg("!clamfi_eom: FD send failed (%s)\n", strerror_r(errno, er, sizeof(er)));
224 223
 	close(s);
225 224
     }
226 225
     return ret;
... ...
@@ -257,8 +251,7 @@ char *nc_recv(int s) {
257 257
 	res = recv(s, &buf[len], sizeof(buf) - len, 0);
258 258
 	if(res==-1) {
259 259
 	    char er[256];
260
-	    strerror_r(errno, er, sizeof(er));
261
-	    logg("!recv failed after successful select: %s\n", er);
260
+	    logg("!recv failed after successful select: %s\n", strerror_r(errno, er, sizeof(er)));
262 261
 	    close(s);
263 262
 	    return NULL;
264 263
 	}
... ...
@@ -608,15 +608,16 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
608 608
 
609 609
     if (retval == -1 && errno != EINTR) {
610 610
 	char buff[BUFFSIZE + 1];
611
+	char *p;
611 612
 #ifdef HAVE_STRERROR_R
612
-	strerror_r(errno, buff, BUFFSIZE);
613
+	p = strerror_r(errno, buff, BUFFSIZE);
613 614
 #else
614
-	buff[0] = '\0';
615
+	p = "";
615 616
 #endif
616 617
 #ifdef HAVE_POLL
617
-	logg("!poll_recv_fds: poll failed: %s\n", buff);
618
+	logg("!poll_recv_fds: poll failed: %s\n", p);
618 619
 #else
619
-	logg("!poll_recv_fds: select failed: %s\n", buff);
620
+	logg("!poll_recv_fds: select failed: %s\n", p);
620 621
 #endif
621 622
     }
622 623
 
... ...
@@ -421,8 +421,7 @@ static void *acceptloop_th(void *arg)
421 421
 	    } else if (errno != EINTR) {
422 422
 		/* very bad - need to exit or restart */
423 423
 #ifdef HAVE_STRERROR_R
424
-		strerror_r(errno, buff, BUFFSIZE);
425
-		logg("!accept() failed: %s\n", buff);
424
+		logg("!accept() failed: %s\n", strerror_r(errno, buff, BUFFSIZE));
426 425
 #else
427 426
 		logg("!accept() failed\n");
428 427
 #endif
... ...
@@ -157,9 +157,9 @@ int conn_reply_errno(const client_conn_t *conn, const char *path,
157 157
 		     const char *msg)
158 158
 {
159 159
     char buf[BUFFSIZE + sizeof(". ERROR")];
160
+    char buf2[BUFFSIZE + sizeof(". ERROR")];
160 161
 #ifdef HAVE_STRERROR_R
161
-    strerror_r(errno, buf, BUFFSIZE-1);
162
-    strcat(buf, ". ERROR");
162
+    snprintf(buf, sizeof(buf), "%s. ERROR",  strerror_r(errno, buf2, BUFFSIZE-1));
163 163
 #else
164 164
     snprintf(buf, sizeof(buf), "%u. ERROR", errno);
165 165
 #endif