1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-11-15 17:47:09 +00:00

Fix segfault in mail folder (SF: 3007493)

This commit is contained in:
Brenden Matthews 2010-06-18 12:00:11 -07:00
parent da1926344d
commit b03541a91c

View File

@ -61,6 +61,8 @@
#define POP3_TYPE 1 #define POP3_TYPE 1
#define IMAP_TYPE 2 #define IMAP_TYPE 2
#define MAXSIZE 1024
struct mail_s { // for imap and pop3 struct mail_s { // for imap and pop3
unsigned long unseen; unsigned long unseen;
unsigned long messages; unsigned long messages;
@ -70,11 +72,11 @@ struct mail_s { // for imap and pop3
unsigned int retries; unsigned int retries;
float interval; float interval;
double last_update; double last_update;
char host[128]; char host[MAXSIZE];
char user[128]; char user[MAXSIZE];
char pass[128]; char pass[MAXSIZE];
char command[1024]; char command[MAXSIZE];
char folder[128]; char folder[MAXSIZE];
timed_thread *p_timed_thread; timed_thread *p_timed_thread;
char secure; char secure;
}; };
@ -413,7 +415,8 @@ struct mail_s *parse_mail_args(char type, const char *arg)
mail = malloc(sizeof(struct mail_s)); mail = malloc(sizeof(struct mail_s));
memset(mail, 0, sizeof(struct mail_s)); memset(mail, 0, sizeof(struct mail_s));
if (sscanf(arg, "%128s %128s %128s", mail->host, mail->user, mail->pass) #define lenstr "%1023s"
if (sscanf(arg, lenstr " " lenstr " " lenstr, mail->host, mail->user, mail->pass)
!= 3) { != 3) {
if (type == POP3_TYPE) { if (type == POP3_TYPE) {
NORM_ERR("Scanning POP3 args failed"); NORM_ERR("Scanning POP3 args failed");
@ -431,7 +434,8 @@ struct mail_s *parse_mail_args(char type, const char *arg)
term.c_lflag &= ~ECHO; term.c_lflag &= ~ECHO;
tcsetattr(fp, TCSANOW, &term); tcsetattr(fp, TCSANOW, &term);
printf("Enter mailbox password (%s@%s): ", mail->user, mail->host); printf("Enter mailbox password (%s@%s): ", mail->user, mail->host);
scanf("%128s", mail->pass); scanf(lenstr, mail->pass);
#undef lenstr
printf("\n"); printf("\n");
term.c_lflag |= ECHO; term.c_lflag |= ECHO;
tcsetattr(fp, TCSANOW, &term); tcsetattr(fp, TCSANOW, &term);
@ -465,34 +469,35 @@ struct mail_s *parse_mail_args(char type, const char *arg)
if (type == IMAP_TYPE) { if (type == IMAP_TYPE) {
tmp = strstr(arg, "-f "); tmp = strstr(arg, "-f ");
if (tmp) { if (tmp) {
int len = 1024; int len = MAXSIZE - 1;
tmp += 3; tmp += 3;
if (tmp[0] == '\'') { if (tmp[0] == '\'') {
len = strstr(tmp + 1, "'") - tmp - 1; len = strstr(tmp + 1, "'") - tmp;
if (len > 1024) { if (len > MAXSIZE) {
len = 1024; len = MAXSIZE;
} }
} }
strncpy(mail->folder, tmp + 1, len); strncpy(mail->folder, tmp + 1, len - 1);
} else { } else {
strncpy(mail->folder, "INBOX", 128); // default imap inbox strncpy(mail->folder, "INBOX", MAXSIZE - 1); // default imap inbox
} }
} }
tmp = strstr(arg, "-e "); tmp = strstr(arg, "-e ");
if (tmp) { if (tmp) {
int len = 1024; int len = MAXSIZE - 1;
tmp += 3; tmp += 3;
if (tmp[0] == '\'') { if (tmp[0] == '\'') {
len = strstr(tmp + 1, "'") - tmp - 1; len = strstr(tmp + 1, "'") - tmp;
if (len > 1024) { if (len > MAXSIZE) {
len = 1024; len = MAXSIZE;
} }
} }
strncpy(mail->command, tmp + 1, len); strncpy(mail->command, tmp + 1, len - 1);
} else { } else {
mail->command[0] = '\0'; mail->command[0] = '\0';
} }
printf("'%s' '%s'\n", mail->folder, mail->command);
mail->p_timed_thread = NULL; mail->p_timed_thread = NULL;
return mail; return mail;
} }