* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) Michael Haardt 2003 - 2015
- * Copyright (c) The Exim Maintainers 2016 - 2020
+/*
+ * Copyright (c) The Exim Maintainers 2016 - 2022
+ * Copyright (c) Michael Haardt 2003 - 2015
* See the file NOTICE for conditions of use and distribution.
*/
struct Sieve
{
- uschar *filter;
+ const uschar *filter;
const uschar *pc;
int line;
const uschar *errmsg;
int require_enotify;
struct Notification *notified;
#endif
- uschar *enotify_mailto_owner;
+ const uschar *enotify_mailto_owner;
#ifdef SUBADDRESS
int require_subaddress;
#endif
int require_vacation;
int vacation_ran;
#endif
- uschar *vacation_directory;
+ const uschar *vacation_directory;
const uschar *subaddress;
const uschar *useraddress;
int require_copy;
dst->length=0;
else
{
- dst->character = store_get(dst->length+1, is_tainted(src->character)); /* plus one for \0 */
+ dst->character = store_get(dst->length+1, src->character); /* plus one for \0 */
new=dst->character;
}
for (const uschar * start = src->character, * end = start + src->length;
filter->errmsg=US"Invalid URI encoding";
return -1;
}
- new=store_get(sizeof(string_item), FALSE);
- new->text = store_get(to.length+1, is_tainted(to.character));
+ new = store_get(sizeof(string_item), GET_UNTAINTED);
+ new->text = store_get(to.length+1, to.character);
if (to.length) memcpy(new->text, to.character, to.length);
- new->text[to.length]='\0';
- new->next=*recipient;
- *recipient=new;
+ new->text[to.length] = '\0';
+ new->next = *recipient;
+ *recipient = new;
}
else
{
- filter->errmsg=US"Missing addr-spec in URI";
+ filter->errmsg = US"Missing addr-spec in URI";
return -1;
}
if (*uri=='%') uri+=3;
}
if (hname.length==2 && strcmpic(hname.character, US"to")==0)
{
- new=store_get(sizeof(string_item), FALSE);
- new->text = store_get(hvalue.length+1, is_tainted(hvalue.character));
+ new=store_get(sizeof(string_item), GET_UNTAINTED);
+ new->text = store_get(hvalue.length+1, hvalue.character);
if (hvalue.length) memcpy(new->text, hvalue.character, hvalue.length);
new->text[hvalue.length]='\0';
new->next=*recipient;
struct String *new;
dataCapacity = dataCapacity ? dataCapacity * 2 : 4;
- new = store_get(sizeof(struct String) * dataCapacity, FALSE);
+ new = store_get(sizeof(struct String) * dataCapacity, GET_UNTAINTED);
if (d) memcpy(new,d,sizeof(struct String)*dataLength);
d = new;
}
else /* single string */
{
- if (!(d=store_get(sizeof(struct String)*2, FALSE)))
+ if (!(d=store_get(sizeof(struct String)*2, GET_UNTAINTED)))
return -1;
m=parse_string(filter,&d[0]);
if (!already)
/* New notification, process it */
{
- struct Notification * sent = store_get(sizeof(struct Notification), FALSE);
+ struct Notification * sent = store_get(sizeof(struct Notification), GET_UNTAINTED);
sent->method=method;
sent->importance=importance;
sent->message=message;
? expand_string(US"$local_part_prefix$local_part$local_part_suffix@$domain")
: from.character);
for (string_item * p = recipient; p; p=p->next)
- fprintf(f,"To: %s\n",p->text);
- fprintf(f,"Auto-Submitted: auto-notified; %s\n",filter->enotify_mailto_owner);
- if (header.length>0) fprintf(f,"%s",header.character);
+ fprintf(f, "To: %s\n",p->text);
+ fprintf(f, "Auto-Submitted: auto-notified; %s\n", filter->enotify_mailto_owner);
+ if (header.length > 0) fprintf(f, "%s", header.character);
if (message.length==-1)
{
message.character=US"Notification";
fprintf(f, "Subject: %s\n", parse_quote_2047(message.character,
message.length, US"utf-8", TRUE));
fprintf(f,"\n");
- if (body.length>0) fprintf(f,"%s\n",body.character);
+ if (body.length > 0) fprintf(f, "%s\n", body.character);
fflush(f);
(void)fclose(f);
(void)child_close(pid, 0);
}
for (struct String * a = addresses; a->length != -1; ++a)
{
- string_item * new = store_get(sizeof(string_item), FALSE);
+ string_item * new = store_get(sizeof(string_item), GET_UNTAINTED);
- new->text = store_get(a->length+1, is_tainted(a->character));
+ new->text = store_get(a->length+1, a->character);
if (a->length) memcpy(new->text,a->character,a->length);
new->text[a->length]='\0';
new->next=aliases;
addr->prop.ignore_error = TRUE;
addr->next = *generated;
*generated = addr;
- addr->reply = store_get(sizeof(reply_item), FALSE);
+ addr->reply = store_get(sizeof(reply_item), GET_UNTAINTED);
memset(addr->reply,0,sizeof(reply_item)); /* XXX */
addr->reply->to = string_copy(sender_address);
if (from.length==-1)
if (parse_white(filter)==-1) return -1;
-if (exec && filter->vacation_directory != NULL && filter_test == FTEST_NONE)
+if (exec && filter->vacation_directory && filter_test == FTEST_NONE)
{
DIR *oncelogdir;
struct dirent *oncelog;
while ((oncelog = readdir(oncelogdir)))
if (strlen(oncelog->d_name)==32)
{
- uschar *s = string_sprintf("%s/%s",filter->vacation_directory,oncelog->d_name);
- if (Ustat(s,&properties)==0 && (properties.st_mtime+VACATION_MAX_DAYS*86400)<now)
+ uschar *s = string_sprintf("%s/%s", filter->vacation_directory, oncelog->d_name);
+ if (Ustat(s,&properties) == 0 && properties.st_mtime+VACATION_MAX_DAYS*86400 < now)
Uunlink(s);
}
closedir(oncelogdir);
#ifdef ENOTIFY
else if (eq_octet(check,&str_enotify,0))
{
- if (filter->enotify_mailto_owner == NULL)
+ if (!filter->enotify_mailto_owner)
{
filter->errmsg=CUS "enotify disabled";
return -1;
#ifdef VACATION
else if (eq_octet(check,&str_vacation,0))
{
- if (filter_test == FTEST_NONE && filter->vacation_directory == NULL)
+ if (filter_test == FTEST_NONE && !filter->vacation_directory)
{
filter->errmsg=CUS "vacation disabled";
return -1;
*/
int
-sieve_interpret(uschar *filter, int options, uschar *vacation_directory,
- uschar *enotify_mailto_owner, uschar *useraddress, uschar *subaddress,
- address_item **generated, uschar **error)
+sieve_interpret(const uschar * filter, int options,
+ const uschar * vacation_directory, const uschar * enotify_mailto_owner,
+ const uschar * useraddress, const uschar * subaddress,
+ address_item ** generated, uschar ** error)
{
struct Sieve sieve;
int r;
-uschar *msg;
+uschar * msg;
DEBUG(D_route) debug_printf("Sieve: start of processing\n");
sieve.filter = filter;
if (!vacation_directory)
sieve.vacation_directory = NULL;
-else
+else if (!(sieve.vacation_directory = expand_cstring(vacation_directory)))
{
- if (!(sieve.vacation_directory = expand_string(vacation_directory)))
- {
- *error = string_sprintf("failed to expand \"%s\" "
- "(sieve_vacation_directory): %s", vacation_directory,
- expand_string_message);
- return FF_ERROR;
- }
+ *error = string_sprintf("failed to expand \"%s\" "
+ "(sieve_vacation_directory): %s", vacation_directory,
+ expand_string_message);
+ return FF_ERROR;
}
if (!enotify_mailto_owner)
sieve.enotify_mailto_owner = NULL;
-else
+else if (!(sieve.enotify_mailto_owner = expand_cstring(enotify_mailto_owner)))
{
- if (!(sieve.enotify_mailto_owner = expand_string(enotify_mailto_owner)))
- {
- *error = string_sprintf("failed to expand \"%s\" "
- "(sieve_enotify_mailto_owner): %s", enotify_mailto_owner,
- expand_string_message);
- return FF_ERROR;
- }
+ *error = string_sprintf("failed to expand \"%s\" "
+ "(sieve_enotify_mailto_owner): %s", enotify_mailto_owner,
+ expand_string_message);
+ return FF_ERROR;
}
sieve.useraddress = useraddress
sieve.subaddress = subaddress;
#ifdef COMPILE_SYNTAX_CHECKER
-if (parse_start(&sieve,0,generated)==1)
+if (parse_start(&sieve, 0, generated) == 1)
#else
-if (parse_start(&sieve,1,generated)==1)
+if (parse_start(&sieve, 1, generated) == 1)
#endif
- {
if (sieve.keep)
{
- add_addr(generated,US"inbox",1,0,0,0);
+ add_addr(generated, US"inbox", 1, 0, 0, 0);
msg = US"Implicit keep";
r = FF_DELIVERED;
}
msg = US"No implicit keep";
r = FF_DELIVERED;
}
- }
else
{
msg = string_sprintf("Sieve error: %s in line %d",sieve.errmsg,sieve.line);