* Recai Oktaş:
> Thanks for the backport, unfortunately I don't have a Sarge box at the
> moment, but will try to find one.
A sarge chroot is probably good enough for this kind of package.
>> The following potential security issues have been fixed upstream, but
>> not in the sid version (there are some more issues apparently, but
>> those bugs were introduced past the sid version AFAICS):
>
> I'm going to prepare an urgent sid upload for those bugs.
I'm not sure if it is worth the effort, until we have all other issues
sorted out.
> Thanks for the backport, unfortunately I don't have a Sarge box at the
> moment, but will try to find one. Could you please supply the url of
> backported patch so that I can also work on it?
Okay, the four patches for sarge I've got so far are included below.
Patch five and six address a few issues I spotted while backporting.
Everything is completely untested.
Subject: [PATCH] r1333: Fixed crashes with very long (revisions) attributes
---
debian/changelog | 8 +++++
src/elogd.c | 85 ++++++++++++++++++++++++++++++------------------------
2 files changed, 56 insertions(+), 37 deletions(-)
6bb233bc624fcb196935dc069238777f06a90cca
diff --git a/debian/changelog b/debian/changelog
index 6f8e6a7..9f49646 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+elog (2.5.7+r1558-4+sarge1) unstable; urgency=low
+
+ * Security update
+ * Backport r1333 from upstream's Subversion repository:
+ "Fixed crashes with very long (revisions) attributes"
+
+ -- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
+
elog (2.5.7+r1558-3) testing-proposed-updates; urgency=high
* Security update. Backport the fix (r1.648) for a buffer overflow:
diff --git a/src/elogd.c b/src/elogd.c
index 5a5da40..802e1dd 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -1648,17 +1648,19 @@ size_t strlcat(char *dst, const char *sr
/*-------------------------------------------------------------------*/
-void strsubst(char *string, char name[][NAME_LENGTH], char
value[][NAME_LENGTH], int n)
- /* subsitute "$name"
with value corresponding to name */
+void strsubst(char *string, int size, char name[][NAME_LENGTH], char
value[][NAME_LENGTH], int n)
+/* subsitute "$name" with value corresponding to name */
{
int i, j;
- char tmp[1000], str[NAME_LENGTH], uattr[NAME_LENGTH], *ps, *pt, *p;
+ char tmp[2*NAME_LENGTH], str[2*NAME_LENGTH], uattr[2*NAME_LENGTH], *ps,
*pt, *p;
pt = tmp;
ps = string;
for (p = strchr(ps, '$'); p != NULL; p = strchr(ps, '$')) {
/* copy leading characters */
j = (int) (p - ps);
+ if (j >= sizeof(tmp))
+ return;
memcpy(pt, ps, j);
pt += j;
p++;
@@ -1680,7 +1682,7 @@ void strsubst(char *string, char name[][
/* copy value */
if (i < n) {
- strcpy(pt, value[i]);
+ strlcpy(pt, value[i], sizeof(tmp)-((int)pt-(int)tmp));
pt += strlen(pt);
ps = p + strlen(uattr);
} else {
@@ -1690,10 +1692,10 @@ void strsubst(char *string, char name[][
}
/* copy remainder */
- strcpy(pt, ps);
+ strlcpy(pt, ps, sizeof(tmp)-((int)pt-(int)tmp));
/* return result */
- strcpy(string, tmp);
+ strlcpy(string, tmp, size);
}
/*------------------------------------------------------------------*/
@@ -3534,7 +3536,7 @@ void retrieve_email_from(LOGBOOK * lbs,
if (attrib) {
i = build_subst_list(lbs, slist, svalue, attrib, TRUE);
- strsubst(str, slist, svalue, i);
+ strsubst(str, sizeof(str), slist, svalue, i);
/* remove possible 'mailto:' */
if ((p = strstr(str, "mailto:")) != NULL)
@@ -7446,7 +7448,7 @@ auto-increment tags */
BOOL is_author(LOGBOOK * lbs, char attrib[MAX_N_ATTR][NAME_LENGTH], char
*owner)
{
- char str[1000], preset[1000];
+ char str[NAME_LENGTH], preset[NAME_LENGTH];
int i;
/* check if current user is admin */
@@ -7553,7 +7555,7 @@ void show_date_selector(int day, int mon
void attrib_from_param(int n_attr, char attrib[MAX_N_ATTR][NAME_LENGTH])
{
int i, j, first, year, month, day;
- char str[1000], ua[NAME_LENGTH];
+ char str[NAME_LENGTH], ua[NAME_LENGTH];
time_t ltime;
struct tm ts;
@@ -7616,7 +7618,7 @@ void show_edit_form(LOGBOOK * lbs, int m
{
int i, j, n, index, aindex, size, width, height, fh, length, input_size,
input_maxlen,
format_flags[MAX_N_ATTR], year, month, day, n_attr, n_disp_attr,
attr_index[MAX_N_ATTR];
- char str[1000], preset[1000], *p, *pend, star[80], comment[10000],
reply_string[256],
+ char str[2*NAME_LENGTH], preset[2*NAME_LENGTH], *p, *pend, star[80],
comment[10000], reply_string[256],
list[MAX_N_ATTR][NAME_LENGTH], file_name[256], *buffer, format[256],
date[80],
attrib[MAX_N_ATTR][NAME_LENGTH], *text, orig_tag[80],
reply_tag[MAX_REPLY_TO * 10], att[MAX_ATTACHMENTS][256], encoding[80],
@@ -7692,7 +7694,7 @@ void show_edit_form(LOGBOOK * lbs, int m
/* do not format date for date attributes */
i = build_subst_list(lbs, slist, svalue, attrib,
(attr_flags[index] & AF_DATE) == 0);
- strsubst(preset, slist, svalue, i);
+ strsubst(preset, sizeof(preset), slist, svalue, i);
/* check for index substitution */
if (!bedit && strchr(preset, '%')) {
@@ -7715,7 +7717,7 @@ void show_edit_form(LOGBOOK * lbs, int m
/* do not format date for date attributes */
i = build_subst_list(lbs, slist, svalue, attrib,
(attr_flags[index] & AF_DATE) == 0);
- strsubst(preset, slist, svalue, i);
+ strsubst(preset, sizeof(preset), slist, svalue, i);
/* check for index substitution */
if (!bedit && strchr(preset, '%')) {
@@ -7839,7 +7841,7 @@ void show_edit_form(LOGBOOK * lbs, int m
sprintf(str, "%d", message_id);
add_subst_list(slist, svalue, "message id", str, &i);
add_subst_time(lbs, slist, svalue, "entry time", date, &i);
- strsubst(preset, slist, svalue, i);
+ strsubst(preset, sizeof(preset), slist, svalue, i);
strcpy(attrib[index], preset);
}
}
@@ -7859,7 +7861,16 @@ void show_edit_form(LOGBOOK * lbs, int m
add_subst_list(slist, svalue, "message id", str, &i);
add_subst_time(lbs, slist, svalue, "entry time", date, &i);
- strsubst(preset, slist, svalue, i);
+ strsubst(preset, sizeof(preset), slist, svalue, i);
+ if (strlen(preset) > NAME_LENGTH - 100) {
+ if (strstr(preset+100, "<br>")) {
+ strlcpy(str, strstr(preset+100, "<br>"), sizeof(str));
+ } else
+ strlcpy(str, preset+100, sizeof(str));
+
+ strcpy(preset, "...");
+ strlcat(preset, str, sizeof(str));
+ }
if (strncmp(preset, "<br>", 4) == 0)
strcpy(attrib[index], preset + 4);
else
@@ -8575,7 +8586,7 @@ void show_edit_form(LOGBOOK * lbs, int m
add_subst_time(lbs, slist, svalue, "entry time", date, &j);
if (getcfg(lbs->name, "Prepend on edit", str, sizeof(str))) {
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(preset), slist, svalue, j);
while (strstr(str, "\\n"))
memcpy(strstr(str, "\\n"), "\r\n", 2);
rsprintf(str);
@@ -8587,7 +8598,7 @@ void show_edit_form(LOGBOOK * lbs, int m
if (!bupload)
if (getcfg(lbs->name, "Append on edit", str, sizeof(str))) {
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(str), slist, svalue, j);
while (strstr(str, "\\n"))
memcpy(strstr(str, "\\n"), "\r\n", 2);
rsputs3(str);
@@ -8602,7 +8613,7 @@ void show_edit_form(LOGBOOK * lbs, int m
add_subst_list(slist, svalue, "message id", mid, &j);
add_subst_time(lbs, slist, svalue, "entry time", date, &j);
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(str), slist, svalue, j);
while (strstr(str, "\\n"))
memcpy(strstr(str, "\\n"), "\r\n", 2);
rsputs3(str);
@@ -8652,7 +8663,7 @@ void show_edit_form(LOGBOOK * lbs, int m
sprintf(mid, "%d", message_id);
add_subst_list(slist, svalue, "message id", mid, &j);
add_subst_time(lbs, slist, svalue, "entry time", date, &j);
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(str), slist, svalue, j);
while (strstr(str, "\\n"))
memcpy(strstr(str, "\\n"), "\r\n", 2);
rsputs3(str);
@@ -8685,7 +8696,7 @@ void show_edit_form(LOGBOOK * lbs, int m
xfree(buffer);
} else {
j = build_subst_list(lbs, slist, svalue, attrib, TRUE);
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(str), slist, svalue, j);
while (strstr(str, "\\n"))
memcpy(strstr(str, "\\n"), "\r\n", 2);
rsputs3(str);
@@ -13394,7 +13405,7 @@ void display_line(LOGBOOK * lbs, int mes
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue,
"entry time", date, &j);
- strsubst(display, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH])
svalue, j);
+ strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
if (highlight != message_id)
rsprintf("<a href=\"%s\">", ref);
@@ -13457,7 +13468,7 @@ void display_line(LOGBOOK * lbs, int mes
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, "entry time",
date, &j);
- strsubst(display, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
+ strsubst(display, sizeof(display), (char (*)[NAME_LENGTH])
slist, (char (*)[NAME_LENGTH]) svalue, j);
} else
sprintf(display, "%d", message_id);
@@ -13597,7 +13608,7 @@ void display_line(LOGBOOK * lbs, int mes
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue,
"entry time", date, &j);
- strsubst(display, (char (*)[NAME_LENGTH]) slist,
+ strsubst(display, sizeof(display), (char
(*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, j);
} else
@@ -14708,7 +14719,7 @@ void show_rss_feed(LOGBOOK * lbs)
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue,
"entry time", date, &i);
- strsubst(title, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, i);
+ strsubst(title, sizeof(title), (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, i);
} else {
title[0] = 0;
@@ -15220,7 +15231,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, "entry time", date,
&j);
- strsubst(str, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
+ strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
setparam(attr_list[i], str);
}
@@ -15322,7 +15333,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, "entry time",
date, &j);
- strsubst(str, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
+ strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, j);
setparam(attr_list[i], str);
}
@@ -15495,7 +15506,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
if (getcfg(lbs->name, "Summary Page Title", str, sizeof(str))) {
i = build_subst_list(lbs, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, NULL, TRUE);
- strsubst(str, (char (*)[NAME_LENGTH]) slist, (char (*)[NAME_LENGTH])
svalue, i);
+ strsubst(str, sizeof(str), (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, i);
strip_html(str);
} else
sprintf(str, "ELOG %s", lbs->name);
@@ -16329,7 +16340,7 @@ int compose_email(LOGBOOK * lbs, char *m
j = build_subst_list(lbs, slist, svalue, attrib, TRUE);
sprintf(str, "%d", message_id);
add_subst_list(slist, svalue, "message id", str, &j);
- strsubst(subject, slist, svalue, j);
+ strsubst(subject, sizeof(subject), slist, svalue, j);
} else {
if (old_mail)
strcpy(subject, "Updated ELOG entry");
@@ -16432,7 +16443,7 @@ int execute_shell(LOGBOOK * lbs, int mes
i = build_subst_list(lbs, slist, svalue, attrib, TRUE);
sprintf(str, "%d", message_id);
add_subst_list(slist, svalue, "message id", str, &i);
- strsubst(shell_cmd, slist, svalue, i);
+ strsubst(shell_cmd, sizeof(shell_cmd), slist, svalue, i);
write_logfile(lbs, "SHELL \"%s\"", shell_cmd);
@@ -16619,7 +16630,7 @@ int set_attributes(LOGBOOK * lbs, char a
void submit_elog(LOGBOOK * lbs)
{
- char str[1000], str2[1000], file_name[256], error[1000], date[80],
+ char str[NAME_LENGTH], str2[NAME_LENGTH], file_name[256], error[1000],
date[80],
mail_list[MAX_N_LIST][NAME_LENGTH], list[10000], *p,
attrib[MAX_N_ATTR][NAME_LENGTH], subst_str[MAX_PATH_LENGTH],
in_reply_to[80], reply_to[MAX_REPLY_TO * 10], user[256],
user_email[256],
@@ -16855,7 +16866,7 @@ void submit_elog(LOGBOOK * lbs)
if (!*getparam("edit_id")) {
sprintf(str, "Subst %s", attr_list[i]);
if (getcfg(lbs->name, str, subst_str, sizeof(subst_str))) {
- strsubst(subst_str, slist, svalue, n);
+ strsubst(subst_str, sizeof(subst_str), slist, svalue, n);
strcpy(attrib[i], subst_str);
}
}
@@ -16987,7 +16998,7 @@ void submit_elog(LOGBOOK * lbs)
sprintf(str, "%d", message_id);
add_subst_list(slist, svalue, "message id", str, &j);
add_subst_time(lbs, slist, svalue, "entry time", date, &j);
- strsubst(mail_list[i], slist, svalue, j);
+ strsubst(mail_list[i], NAME_LENGTH, slist, svalue, j);
/* remove possible 'mailto:' */
if ((p = strstr(mail_list[i], "mailto:")) != NULL)
@@ -17360,9 +17371,9 @@ void show_elog_entry(LOGBOOK * lbs, char
int size, i, j, n, n_log, status, fh, length, message_error, index,
n_hidden,
message_id, orig_message_id, format_flags[MAX_N_ATTR],
att_hide[MAX_ATTACHMENTS],
n_attachments, n_lines;
- char str[1000], ref[256], file_enc[256], attrib[MAX_N_ATTR][NAME_LENGTH];
+ char str[2*NAME_LENGTH], ref[256], file_enc[256],
attrib[MAX_N_ATTR][NAME_LENGTH];
char date[80], text[TEXT_SIZE], menu_str[1000], cmd[256], cmd_enc[256],
- orig_tag[80], reply_tag[MAX_REPLY_TO * 10], display[256],
+ orig_tag[80], reply_tag[MAX_REPLY_TO * 10], display[NAME_LENGTH],
attachment[MAX_ATTACHMENTS][MAX_PATH_LENGTH], encoding[80],
locked_by[256],
att[256], lattr[256], mid[80], menu_item[MAX_N_LIST][NAME_LENGTH],
format[80],
slist[MAX_N_ATTR + 10][NAME_LENGTH], file_name[MAX_PATH_LENGTH],
@@ -17537,7 +17548,7 @@ void show_elog_entry(LOGBOOK * lbs, char
sprintf(mid, "%d", message_id);
add_subst_list(slist, svalue, "message id", mid, &i);
add_subst_time(lbs, slist, svalue, "entry time", date, &i);
- strsubst(str, slist, svalue, i);
+ strsubst(str, sizeof(str), slist, svalue, i);
strip_html(str);
} else
strcpy(str, "ELOG");
@@ -17780,7 +17791,7 @@ void show_elog_entry(LOGBOOK * lbs, char
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, "entry time", date,
&j);
- strsubst(display, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
+ strsubst(display, sizeof(display), (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, j);
} else
sprintf(display, "%d", message_id);
@@ -17961,7 +17972,7 @@ void show_elog_entry(LOGBOOK * lbs, char
add_subst_time(lbs, (char (*)[NAME_LENGTH]) slist,
(char (*)[NAME_LENGTH]) svalue, "entry time",
date, &j);
- strsubst(display, (char (*)[NAME_LENGTH]) slist, (char
(*)[NAME_LENGTH]) svalue, j);
+ strsubst(display, sizeof(display), (char (*)[NAME_LENGTH])
slist, (char (*)[NAME_LENGTH]) svalue, j);
} else
strcpy(display, attrib[i]);
@@ -18764,7 +18775,7 @@ void show_logbook_node(LBLIST plb, LBLIS
sprintf(mid, "%d", message_id);
add_subst_list(slist, svalue, "message id", mid, &j);
add_subst_time(&lb_list[index], slist, svalue, "entry time", date,
&j);
- strsubst(str, slist, svalue, j);
+ strsubst(str, sizeof(str), slist, svalue, j);
rsputs(str);
}
rsprintf("</td></tr>\n");
--
1.1.3
Subject: [PATCH] r1335: Applied patch from Emiliano to fix possible buffer
overflow
---
debian/changelog | 2 ++
src/elogd.c | 4 ++--
2 files changed, 4 insertions(+), 2 deletions(-)
be90cd68ad16c29ef3b7ba8c5ad89aa4a08afec1
diff --git a/debian/changelog b/debian/changelog
index 9f49646..36c80d1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,8 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
* Security update
* Backport r1333 from upstream's Subversion repository:
"Fixed crashes with very long (revisions) attributes"
+ * Backport r1335 from upstream's Subversion repository:
+ "Applied patch from Emiliano to fix possible buffer overflow"
-- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
diff --git a/src/elogd.c b/src/elogd.c
index 802e1dd..5417544 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -5257,7 +5257,7 @@ void write_logfile(LOGBOOK * lbs, const
char str[10000];
FILE *f;
time_t now;
- char buf[1000];
+ char buf[10000];
if (lbs == NULL) {
if (!getcfg("global", "logfile", str, sizeof(str)))
@@ -7239,7 +7239,7 @@ BOOL change_pwd(LOGBOOK * lbs, char *use
getcfg(lbs->name, "Password file", str, sizeof(str));
if (str[0] == DIR_SEPARATOR || str[1] == ':')
- strcpy(file_name, str);
+ strlcpy(file_name, str, sizeof(file_name));
else {
strlcpy(file_name, resource_dir, sizeof(file_name));
strlcat(file_name, str, sizeof(file_name));
--
1.1.3
Subject: [PATCH] r1472: Do not distinguish between invalid user name and
invalid password
---
debian/changelog | 3 ++
src/elog.c | 12 +++------
src/elogd.c | 70 ++++++++++++++----------------------------------------
3 files changed, 25 insertions(+), 60 deletions(-)
4496b5d8e83505698c9c16c527653f2224499fda
diff --git a/debian/changelog b/debian/changelog
index 36c80d1..07e1ce7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,6 +5,9 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
"Fixed crashes with very long (revisions) attributes"
* Backport r1335 from upstream's Subversion repository:
"Applied patch from Emiliano to fix possible buffer overflow"
+ * Backport r1472 from upstream's Subversion repository:
+ "Do not distinguish between invalid user name and invalid password for
+ security reasons"
-- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
diff --git a/src/elog.c b/src/elog.c
index 60f4efe..9a2d1db 100755
--- a/src/elog.c
+++ b/src/elog.c
@@ -527,10 +527,8 @@ INT retrieve_elog(char *host, int port,
if (strstr(response, "302 Found")) {
if (strstr(response, "Location:")) {
- if (strstr(response, "wpwd"))
- printf("Error: Invalid password\n");
- else if (strstr(response, "wusr"))
- printf("Error: Invalid user name\n");
+ if (strstr(response, "fail"))
+ printf("Error: Invalid user name or password\n");
else {
strncpy(str, strstr(response, "Location:") + 10, sizeof(str));
if (strchr(str, '?'))
@@ -922,10 +920,8 @@ INT submit_elog(char *host, int port, ch
/* check response status */
if (strstr(response, "302 Found")) {
if (strstr(response, "Location:")) {
- if (strstr(response, "wpwd"))
- printf("Error: Invalid password\n");
- else if (strstr(response, "wusr"))
- printf("Error: Invalid user name\n");
+ if (strstr(response, "fail"))
+ printf("Error: Invalid user name or password\n");
else {
strncpy(str, strstr(response, "Location:") + 10, sizeof(str));
if (strchr(str, '?'))
diff --git a/src/elogd.c b/src/elogd.c
index 5417544..9d259b4 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -11437,11 +11437,8 @@ int retrieve_remote_md5(LOGBOOK * lbs, c
if (isparam("debug"))
rsputs(text);
- if (strstr(text, "?wusr="))
- sprintf(error_str, loc("User \"%s\" has no access to remote
logbook"), getparam("unm"));
- else if (strstr(text, "?wpwd="))
- sprintf(error_str,
- loc("Passwords for user \"%s\" do not match locally and
remotely"), getparam("unm"));
+ if (strstr(text, "?fail="))
+ sprintf(error_str, loc("Invalid user name \"%s\" or password for
remote logbook"), getparam("unm"));
else {
strlcpy(str, p + 9, sizeof(str));
if (strchr(str, '?'))
@@ -11764,10 +11761,8 @@ int submit_message(LOGBOOK * lbs, char *
/* check response status */
if (strstr(response, "302 Found")) {
if (strstr(response, "Location:")) {
- if (strstr(response, "wpwd"))
- sprintf(error_str, "Invalid password\n");
- else if (strstr(response, "wusr"))
- sprintf(error_str, "Invalid user name\n");
+ if (strstr(response, "fail"))
+ sprintf(error_str, "Invalid user name or password\n");
strlcpy(str, strstr(response, "Location:") + 9, sizeof(str));
if (strchr(str, '\n'))
@@ -12058,10 +12053,8 @@ void submit_config(LOGBOOK * lbs, char *
/* check response status */
if (strstr(response, "302 Found")) {
if (strstr(response, "Location:")) {
- if (strstr(response, "wpwd"))
- sprintf(error_str, "Invalid password\n");
- else if (strstr(response, "wusr"))
- sprintf(error_str, "Invalid user name\n");
+ if (strstr(response, "fail"))
+ sprintf(error_str, "Invalid usr name or password\n");
}
} else if (strstr(response, "Logbook Selection"))
sprintf(error_str, "No logbook specified\n");
@@ -12342,7 +12335,7 @@ void receive_pwdfile(LOGBOOK * lbs, char
/* check for logbook access */
if (strstr(p, loc("Please login")) || strstr(p, "GetPwdFile") || status
== 302) {
- if (strstr(buffer, "?wusr=") || strstr(buffer, "?wpwd="))
+ if (strstr(buffer, "?fail="))
eprintf("\nInvalid username or password.");
if (strstr(p, loc("Please login")) == NULL && strstr(p, "GetPwdFile")
&& isparam("unm"))
@@ -18222,12 +18215,12 @@ BOOL check_password(LOGBOOK * lbs, char
if (strcmp(password, str) == 0)
return TRUE;
- if (!isparam("wpwd") && password[0]) {
+ if (!isparam("fail") && password[0]) {
strlcpy(str, redir, sizeof(str));
if (strchr(str, '?'))
- strlcat(str, "&wpwd=1", sizeof(str));
+ strlcat(str, "&fail=1", sizeof(str));
else
- strlcat(str, "?wpwd=1", sizeof(str));
+ strlcat(str, "?fail=1", sizeof(str));
redirect(lbs, str);
return FALSE;
}
@@ -18237,7 +18230,7 @@ BOOL check_password(LOGBOOK * lbs, char
rsprintf("<table class=\"dlgframe\" cellspacing=0 align=center>");
- if (isparam("wpwd"))
+ if (isparam("fail"))
rsprintf("<tr><td class=\"dlgerror\">%s!</td></tr>\n", loc("Wrong
password"));
rsprintf("<tr><td class=\"dlgtitle\">\n");
@@ -18515,31 +18508,8 @@ BOOL check_user_password(LOGBOOK * lbs,
return FALSE;
}
- /* display error message for invalid user */
- if (isparam("iusr")) {
- /* header */
- show_html_header(NULL, FALSE, "ELOG error", TRUE, FALSE);
-
- rsprintf("<body><center>\n");
- rsprintf("<table class=\"dlgframe\" width=\"50%%\" cellpadding=1
cellspacing=0>");
- sprintf(str, loc("User <i>\"%s\"</i> has no access to logbook
<i>\"%s\"</i>"),
- getparam("iusr"), lbs->name);
- rsprintf("<tr><td class=\"errormsg\">%s</td></tr>\n", str);
-
- rsprintf("<tr><td class=\"errormsg\">");
- rsprintf("<a href=\"?LO=1\">%s</a></td></tr>", loc("Login as different
user"));
-
- rsprintf("<tr><td class=\"errormsg\">");
- rsprintf("<a href=\"../\">%s</a></td></tr>", loc("Goto logbook selection
page"));
-
- rsprintf("</table>\n");
- rsprintf("</center></body></html>\n");
-
- return FALSE;
- }
-
if (!check_login_user(lbs, user)) {
- sprintf(str, "?iusr=%s", user);
+ sprintf(str, "?fail=%s", user);
redirect(lbs, str);
return FALSE;
@@ -18552,8 +18522,8 @@ BOOL check_user_password(LOGBOOK * lbs,
return TRUE;
}
- if (!isparam("wpwd") && password[0]) {
- redirect(lbs, "?wpwd=1");
+ if (!isparam("fail") && password[0]) {
+ redirect(lbs, "?fail=1");
return FALSE;
}
@@ -18585,11 +18555,8 @@ BOOL check_user_password(LOGBOOK * lbs,
rsprintf("<table class=\"dlgframe\" cellspacing=0 align=center>");
- if (isparam("wpwd"))
- rsprintf("<tr><td colspan=2 class=\"dlgerror\">%s!</td></tr>\n",
loc("Wrong password"));
-
- if (isparam("wusr")) {
- sprintf(str, loc("Invalid user name <i>\"%s\"</i>"),
getparam("wusr"));
+ if (isparam("fail")) {
+ sprintf(str, loc("Invalid user name or password"));
rsprintf("<tr><td colspan=2 class=\"dlgerror\">%s!</td></tr>\n", str);
}
@@ -18640,7 +18607,7 @@ BOOL check_user_password(LOGBOOK * lbs,
} else {
if (status == 2) {
- sprintf(str, "?wusr=%s", user);
+ sprintf(str, "?fail");
setparam("redir", str);
/* remove remaining cookies */
@@ -19452,8 +19419,7 @@ void interprete(char *lbook, char *path)
/* check if guest access */
if (!(getcfg(lbs->name, "Guest menu commands", str, sizeof(str))
- && *getparam("unm") == 0 && !isparam("wpwd")
- && !isparam("wusr"))) {
+ && *getparam("unm") == 0 && !isparam("fail"))) {
if (strcmp(path, css) != 0) {
/* if no guest menu commands but self register, evaluate new user
commands */
if (getcfg(lbs->name, "Self register", str, sizeof(str)) &&
atoi(str) > 0) {
--
1.1.3
Subject: [PATCH] r1529: Fixed bug with fprintf and buffer containing "%"
Our patch just eliminates the format string vulnerability.
---
debian/changelog | 3 +++
src/elogd.c | 2 +-
2 files changed, 4 insertions(+), 1 deletions(-)
5f621ef178ca89cc0d15097dedd6fe58c17800f1
diff --git a/debian/changelog b/debian/changelog
index 07e1ce7..636c566 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -8,6 +8,9 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
* Backport r1472 from upstream's Subversion repository:
"Do not distinguish between invalid user name and invalid password for
security reasons"
+ * Backport r1529 from upstream's Subversion repository:
+ "Fixed bug with fprintf and buffer containing "%""
+ (Our patch just eliminates the format string vulnerability.)
-- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
diff --git a/src/elogd.c b/src/elogd.c
index 9d259b4..16dc751 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -5296,7 +5296,7 @@ void write_logfile(LOGBOOK * lbs, const
if (buf[strlen(buf) - 1] != '\n')
strlcat(buf, "\n", sizeof(buf));
- fprintf(f, buf);
+ fprintf(f, "%s", buf);
fclose(f);
}
--
1.1.3
Subject: [PATCH] Fix potential format string issues when calling write_logfile
---
src/elogd.c | 64 ++++++++++++++++++++++++++++++-----------------------------
1 files changed, 32 insertions(+), 32 deletions(-)
08bf2529af3f023688dcf50df44167574851ac75
diff --git a/src/elogd.c b/src/elogd.c
index 16dc751..466a928 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -2326,7 +2326,7 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
recv_string(s, str, strsize, 10000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
/* drain server messages */
do {
@@ -2334,28 +2334,28 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
recv_string(s, str, strsize, 300);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
} while (str[0]);
snprintf(str, strsize - 1, "HELO %s\r\n", host_name);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
recv_string(s, str, strsize, 3000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "MAIL FROM: %s\r\n", from);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
recv_string(s, str, strsize, 3000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
/* break recipients into list */
n = strbreak(to, list, 1024, ",");
@@ -2365,24 +2365,24 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
/* increased timeout for SMTP servers with long alias lists */
recv_string(s, str, strsize, 30000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
}
snprintf(str, strsize - 1, "DATA\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
recv_string(s, str, strsize, 3000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
if (email_to)
snprintf(str, strsize - 1, "To: %s\r\n", to);
@@ -2392,33 +2392,33 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "From: %s\r\nSubject: %s\r\n", from, subject);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "X-Mailer: Elog, Version %s\r\n", VERSION);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
if (url) {
snprintf(str, strsize - 1, "X-Elog-URL: %s\r\n", url);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
}
snprintf(str, strsize - 1, "X-Elog-submit-type: web|elog\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
/* switch locale temporarily back to english to comply with RFC2822 date
format */
setlocale(LC_ALL, "C");
@@ -2438,7 +2438,7 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
getcfg("global", "Language", str, sizeof(str));
if (str[0])
@@ -2449,40 +2449,40 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
sprintf(boundary, "%04X-%04X=:%04X", rand(), rand(), rand());
snprintf(str, strsize - 1, "Content-Type: MULTIPART/MIXED;
BOUNDARY=\"%s\"\r\n\r\n", boundary);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1,
" This message is in MIME format. The first part should be
readable text,\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1,
" while the remaining parts are likely unreadable without
MIME-aware tools.\r\n\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "--%s\r\nContent-Type: TEXT/PLAIN;
charset=US-ASCII\r\n\r\n", boundary);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
} else {
snprintf(str, strsize - 1, "Content-Type: TEXT/PLAIN;
charset=US-ASCII\r\n\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
}
/* analyze text for "." at beginning of line */
@@ -2505,7 +2505,7 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
for (index = 0; index < n_att; index++) {
/* return proper Content-Type for file type */
@@ -2529,20 +2529,20 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "Content-Transfer-Encoding: BASE64\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1,
"Content-Disposition: attachment; filename=\"%s\"\r\n\r\n",
att_file[index] + 14);
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
/* encode file */
strlcpy(file_name, lbs->data_dir, sizeof(file_name));
@@ -2574,7 +2574,7 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
}
}
@@ -2583,22 +2583,22 @@ INT sendmail(LOGBOOK * lbs, char *smtp_h
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
recv_string(s, str, strsize, 3000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
snprintf(str, strsize - 1, "QUIT\r\n");
send(s, str, strlen(str), 0);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
recv_string(s, str, strsize, 3000);
if (verbose)
efputs(str);
- write_logfile(lbs, str);
+ write_logfile(lbs, "%s", str);
closesocket(s);
xfree(str);
@@ -12526,7 +12526,7 @@ void mprint(LOGBOOK * lbs, int mode, cha
else if (mode == SYNC_CRON) {
if (_logging_level > 1) {
sprintf(line, "MIRROR: %s", str);
- write_logfile(lbs, line);
+ write_logfile(lbs, "%s", line);
}
} else
eputs(str);
--
1.1.3
Subject: [PATCH] Fix potential buffer overflow in write_logfile
---
src/elogd.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
1bfce0e88fd5479e35a2c08d2a4dddfa6f681a69
diff --git a/src/elogd.c b/src/elogd.c
index 466a928..a24f27e 100755
--- a/src/elogd.c
+++ b/src/elogd.c
@@ -5273,7 +5273,7 @@ void write_logfile(LOGBOOK * lbs, const
}
va_start(argptr, format);
- vsprintf(str, (char *) format, argptr);
+ vsnprintf(str, sizeof(str), (char *) format, argptr);
va_end(argptr);
f = fopen(file_name, "a");
--
1.1.3