comparison mcabber/src/commands.c @ 1442:b49a1edba983

Check file content when using /say_to -f A binary file could break the connection (Reported by Myhailo Danylenko).
author Mikael Berthe <mikael@lilotux.net>
date Fri, 29 Feb 2008 13:02:04 +0100
parents 9bf7f3ddff10
children 0623d694a77f
comparison
equal deleted inserted replaced
1441:736b82610dfa 1442:b49a1edba983
34 #include "hbuf.h" 34 #include "hbuf.h"
35 #include "utils.h" 35 #include "utils.h"
36 #include "settings.h" 36 #include "settings.h"
37 #include "events.h" 37 #include "events.h"
38 #include "otr.h" 38 #include "otr.h"
39 #include "utf8.h"
39 40
40 #define IMSTATUS_AWAY "away" 41 #define IMSTATUS_AWAY "away"
41 #define IMSTATUS_ONLINE "online" 42 #define IMSTATUS_ONLINE "online"
42 #define IMSTATUS_OFFLINE "offline" 43 #define IMSTATUS_OFFLINE "offline"
43 #define IMSTATUS_FREE4CHAT "free" 44 #define IMSTATUS_FREE4CHAT "free"
1351 char *load_message_from_file(const char *filename) 1352 char *load_message_from_file(const char *filename)
1352 { 1353 {
1353 FILE *fd; 1354 FILE *fd;
1354 struct stat buf; 1355 struct stat buf;
1355 char *msgbuf, *msgbuf_utf8; 1356 char *msgbuf, *msgbuf_utf8;
1356 char *eol; 1357 char *p;
1358 char *next_utf8_char;
1357 1359
1358 fd = fopen(filename, "r"); 1360 fd = fopen(filename, "r");
1359 1361
1360 if (!fd || fstat(fileno(fd), &buf)) { 1362 if (!fd || fstat(fileno(fd), &buf)) {
1361 scr_LogPrint(LPRINT_LOGNORM, "Cannot open message file (%s)", filename); 1363 scr_LogPrint(LPRINT_LOGNORM, "Cannot open message file (%s)", filename);
1372 1374
1373 msgbuf = g_new0(char, HBB_BLOCKSIZE); 1375 msgbuf = g_new0(char, HBB_BLOCKSIZE);
1374 fread(msgbuf, HBB_BLOCKSIZE-1, 1, fd); 1376 fread(msgbuf, HBB_BLOCKSIZE-1, 1, fd);
1375 fclose(fd); 1377 fclose(fd);
1376 1378
1379 next_utf8_char = msgbuf;
1380
1377 // Strip trailing newlines 1381 // Strip trailing newlines
1378 for (eol = msgbuf ; *eol ; eol++) 1382 for (p = msgbuf ; *p ; p++) {
1379 ; 1383 // Check there is no binary data. It must be a *message* file!
1380 if (eol > msgbuf) 1384 if (utf8_mode) {
1381 eol--; 1385 if (p == next_utf8_char) {
1382 while (eol > msgbuf && *eol == '\n') 1386 if (!iswprint(get_char(p)) && *p != '\n')
1383 *eol-- = 0; 1387 break;
1388 next_utf8_char = next_char(p);
1389 }
1390 } else {
1391 unsigned char sc = *p;
1392 if (!iswprint(sc) && sc != '\n')
1393 break;
1394 }
1395 }
1396
1397 if (*p) { // We're not at the End Of Line...
1398 scr_LogPrint(LPRINT_LOGNORM, "Message file contains "
1399 "invalid characters (%s)", filename);
1400 g_free(msgbuf);
1401 return NULL;
1402 }
1403
1404 // p is now at the EOL
1405 if (p > msgbuf)
1406 p--;
1407 while (p > msgbuf && *p == '\n')
1408 *p-- = 0;
1384 1409
1385 // It could be empty, once the trailing newlines are gone 1410 // It could be empty, once the trailing newlines are gone
1386 if (eol == msgbuf && *eol == '\n') { 1411 if (p == msgbuf && *p == '\n') {
1387 scr_LogPrint(LPRINT_LOGNORM, "Message file is empty (%s)", filename); 1412 scr_LogPrint(LPRINT_LOGNORM, "Message file is empty (%s)", filename);
1388 g_free(msgbuf); 1413 g_free(msgbuf);
1389 return NULL; 1414 return NULL;
1390 } 1415 }
1391 1416