From 17f2ef1c0cecf9cea47f46019f7c64078e21c0db Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 22 Jan 2009 14:41:02 +0000 Subject: [PATCH] Fix bug #1211 crash during reload with bad dird.conf file. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8395 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/patches/2.4.4-bat-install.patch | 29 +++++ bacula/patches/2.4.4-reload.patch | 152 +++++++++++++++++++++++++ bacula/src/lib/parse_conf.c | 23 +++- bacula/src/version.h | 6 +- bacula/technotes-2.5 | 2 + 5 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 bacula/patches/2.4.4-bat-install.patch create mode 100644 bacula/patches/2.4.4-reload.patch diff --git a/bacula/patches/2.4.4-bat-install.patch b/bacula/patches/2.4.4-bat-install.patch new file mode 100644 index 0000000000..a3e95fa03c --- /dev/null +++ b/bacula/patches/2.4.4-bat-install.patch @@ -0,0 +1,29 @@ + + This patch fixes bat.pro.in so that bat will install correctly. + + Apply it to version 2.4.4 with: + + cd + patch -p0 <2.4.4-bat-install.patch + ./configure + make + ... + make install + + +Index: src/qt-console/bat.pro.in +=================================================================== +--- src/qt-console/bat.pro.in (revision 8326) ++++ src/qt-console/bat.pro.in (working copy) +@@ -9,9 +9,9 @@ + # + CONFIG += qt debug @QWT@ + +-bins.path = /$(DESTDIR)@sbindir@ ++bins.path = $(DESTDIR)@sbindir@ + bins.files = ./bat +-confs.path = /$(DESTDIR)@sysconfdir@ ++confs.path = $(DESTDIR)@sysconfdir@ + confs.commands = ./install_conf_file + + TEMPLATE = app diff --git a/bacula/patches/2.4.4-reload.patch b/bacula/patches/2.4.4-reload.patch new file mode 100644 index 0000000000..72a6867a3a --- /dev/null +++ b/bacula/patches/2.4.4-reload.patch @@ -0,0 +1,152 @@ +Index: src/lib/parse_conf.c +=================================================================== +--- src/lib/parse_conf.c (revision 8393) ++++ src/lib/parse_conf.c (working copy) +@@ -284,6 +284,7 @@ + } + if (token != T_EQUALS) { + scan_err1(lc, _("expected an =, got: %s"), lc->str); ++ return; + } + break; + } +@@ -304,6 +305,7 @@ + Dmsg1(900, "store_msgs dest=%s:\n", NPRT(dest)); + if (token != T_EQUALS) { + scan_err1(lc, _("expected an =, got: %s"), lc->str); ++ return; + } + scan_types(lc, (MSGS *)(item->value), item->code, dest, NULL); + free_pool_memory(dest); +@@ -312,7 +314,7 @@ + + default: + scan_err1(lc, _("Unknown item code: %d\n"), item->code); +- break; ++ return; + } + } + scan_to_eol(lc); +@@ -352,7 +354,7 @@ + } + if (!found) { + scan_err1(lc, _("message type: %s not found"), str); +- /* NOT REACHED */ ++ return; + } + + if (msg_type == M_MAX+1) { /* all? */ +@@ -384,12 +386,14 @@ + lex_get_token(lc, T_NAME); + if (!is_name_valid(lc->str, &msg)) { + scan_err1(lc, "%s\n", msg); ++ return; + } + free_pool_memory(msg); + /* Store the name both pass 1 and pass 2 */ + if (*(item->value)) { + scan_err2(lc, _("Attempt to redefine name \"%s\" to \"%s\"."), + *(item->value), lc->str); ++ return; + } + *(item->value) = bstrdup(lc->str); + scan_to_eol(lc); +@@ -481,10 +485,12 @@ + if (res == NULL) { + scan_err3(lc, _("Could not find config Resource %s referenced on line %d : %s\n"), + lc->str, lc->line_no, lc->line); ++ return; + } + if (*(item->value)) { + scan_err3(lc, _("Attempt to redefine resource \"%s\" referenced on line %d : %s\n"), + item->name, lc->line_no, lc->line); ++ return; + } + *(item->value) = (char *)res; + } +@@ -520,6 +526,7 @@ + if (i >= count) { + scan_err4(lc, _("Too many %s directives. Max. is %d. line %d: %s\n"), + lc->str, count, lc->line_no, lc->line); ++ return; + } + list = New(alist(10, not_owned_by_alist)); + } +@@ -530,6 +537,7 @@ + if (res == NULL) { + scan_err3(lc, _("Could not find config Resource \"%s\" referenced on line %d : %s\n"), + item->name, lc->line_no, lc->line); ++ return; + } + Dmsg5(900, "Append %p to alist %p size=%d i=%d %s\n", + res, list, list->size(), i, item->name); +@@ -592,6 +600,7 @@ + if (res == NULL) { + scan_err3(lc, _("Missing config Resource \"%s\" referenced on line %d : %s\n"), + lc->str, lc->line_no, lc->line); ++ return; + } + } + scan_to_eol(lc); +@@ -655,12 +664,13 @@ + } + if (!size_to_uint64(bsize, strlen(bsize), &uvalue)) { + scan_err1(lc, _("expected a size number, got: %s"), lc->str); ++ return; + } + *(uint64_t *)(item->value) = uvalue; + break; + default: + scan_err1(lc, _("expected a size, got: %s"), lc->str); +- break; ++ return; + } + if (token != T_EOL) { + scan_to_eol(lc); +@@ -697,12 +707,13 @@ + } + if (!duration_to_utime(period, &utime)) { + scan_err1(lc, _("expected a time period, got: %s"), period); ++ return; + } + *(utime_t *)(item->value) = utime; + break; + default: + scan_err1(lc, _("expected a time period, got: %s"), lc->str); +- break; ++ return; + } + if (token != T_EOL) { + scan_to_eol(lc); +@@ -721,6 +732,7 @@ + *(uint32_t *)(item->value) &= ~(item->code); + } else { + scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */ ++ return; + } + scan_to_eol(lc); + set_bit(index, res_all.hdr.item_present); +@@ -736,6 +748,7 @@ + *(bool *)(item->value) = false; + } else { + scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */ ++ return; + } + scan_to_eol(lc); + set_bit(index, res_all.hdr.item_present); +@@ -761,6 +774,7 @@ + } + if (i != 0) { + scan_err1(lc, _("Expected a Tape Label keyword, got: %s"), lc->str); ++ return; + } + scan_to_eol(lc); + set_bit(index, res_all.hdr.item_present); +@@ -910,6 +924,7 @@ + Dmsg0(900, "T_EOB => define new resource\n"); + if (res_all.hdr.name == NULL) { + scan_err0(lc, _("Name not specified for resource")); ++ return 0; + } + save_resource(res_type, items, pass); /* save resource */ + break; diff --git a/bacula/src/lib/parse_conf.c b/bacula/src/lib/parse_conf.c index 52927627d0..f85798d8fc 100644 --- a/bacula/src/lib/parse_conf.c +++ b/bacula/src/lib/parse_conf.c @@ -274,6 +274,7 @@ void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass) } if (token != T_EQUALS) { scan_err1(lc, _("expected an =, got: %s"), lc->str); + return; } break; } @@ -294,6 +295,7 @@ void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass) Dmsg1(900, "store_msgs dest=%s:\n", NPRT(dest)); if (token != T_EQUALS) { scan_err1(lc, _("expected an =, got: %s"), lc->str); + return; } scan_types(lc, (MSGS *)(item->value), item->code, dest, NULL); free_pool_memory(dest); @@ -302,7 +304,7 @@ void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass) default: scan_err1(lc, _("Unknown item code: %d\n"), item->code); - break; + return; } } scan_to_eol(lc); @@ -342,7 +344,7 @@ static void scan_types(LEX *lc, MSGS *msg, int dest_code, char *where, char *cmd } if (!found) { scan_err1(lc, _("message type: %s not found"), str); - /* NOT REACHED */ + return; } if (msg_type == M_MAX+1) { /* all? */ @@ -374,12 +376,14 @@ void store_name(LEX *lc, RES_ITEM *item, int index, int pass) lex_get_token(lc, T_NAME); if (!is_name_valid(lc->str, &msg)) { scan_err1(lc, "%s\n", msg); + return; } free_pool_memory(msg); /* Store the name both pass 1 and pass 2 */ if (*(item->value)) { scan_err2(lc, _("Attempt to redefine name \"%s\" to \"%s\"."), *(item->value), lc->str); + return; } *(item->value) = bstrdup(lc->str); scan_to_eol(lc); @@ -471,10 +475,12 @@ void store_res(LEX *lc, RES_ITEM *item, int index, int pass) if (res == NULL) { scan_err3(lc, _("Could not find config Resource %s referenced on line %d : %s\n"), lc->str, lc->line_no, lc->line); + return; } if (*(item->value)) { scan_err3(lc, _("Attempt to redefine resource \"%s\" referenced on line %d : %s\n"), item->name, lc->line_no, lc->line); + return; } *(item->value) = (char *)res; } @@ -510,6 +516,7 @@ void store_alist_res(LEX *lc, RES_ITEM *item, int index, int pass) if (i >= count) { scan_err4(lc, _("Too many %s directives. Max. is %d. line %d: %s\n"), lc->str, count, lc->line_no, lc->line); + return; } list = New(alist(10, not_owned_by_alist)); } @@ -520,6 +527,7 @@ void store_alist_res(LEX *lc, RES_ITEM *item, int index, int pass) if (res == NULL) { scan_err3(lc, _("Could not find config Resource \"%s\" referenced on line %d : %s\n"), item->name, lc->line_no, lc->line); + return; } Dmsg5(900, "Append %p to alist %p size=%d i=%d %s\n", res, list, list->size(), i, item->name); @@ -582,6 +590,7 @@ void store_defs(LEX *lc, RES_ITEM *item, int index, int pass) if (res == NULL) { scan_err3(lc, _("Missing config Resource \"%s\" referenced on line %d : %s\n"), lc->str, lc->line_no, lc->line); + return; } } scan_to_eol(lc); @@ -645,12 +654,13 @@ void store_size(LEX *lc, RES_ITEM *item, int index, int pass) } if (!size_to_uint64(bsize, strlen(bsize), &uvalue)) { scan_err1(lc, _("expected a size number, got: %s"), lc->str); + return; } *(uint64_t *)(item->value) = uvalue; break; default: scan_err1(lc, _("expected a size, got: %s"), lc->str); - break; + return; } if (token != T_EOL) { scan_to_eol(lc); @@ -687,12 +697,13 @@ void store_time(LEX *lc, RES_ITEM *item, int index, int pass) } if (!duration_to_utime(period, &utime)) { scan_err1(lc, _("expected a time period, got: %s"), period); + return; } *(utime_t *)(item->value) = utime; break; default: scan_err1(lc, _("expected a time period, got: %s"), lc->str); - break; + return; } if (token != T_EOL) { scan_to_eol(lc); @@ -711,6 +722,7 @@ void store_bit(LEX *lc, RES_ITEM *item, int index, int pass) *(uint32_t *)(item->value) &= ~(item->code); } else { scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */ + return; } scan_to_eol(lc); set_bit(index, res_all.hdr.item_present); @@ -726,6 +738,7 @@ void store_bool(LEX *lc, RES_ITEM *item, int index, int pass) *(bool *)(item->value) = false; } else { scan_err2(lc, _("Expect %s, got: %s"), "YES, NO, TRUE, or FALSE", lc->str); /* YES and NO must not be translated */ + return; } scan_to_eol(lc); set_bit(index, res_all.hdr.item_present); @@ -751,6 +764,7 @@ void store_label(LEX *lc, RES_ITEM *item, int index, int pass) } if (i != 0) { scan_err1(lc, _("Expected a Tape Label keyword, got: %s"), lc->str); + return; } scan_to_eol(lc); set_bit(index, res_all.hdr.item_present); @@ -947,6 +961,7 @@ bool CONFIG::parse_config() Dmsg0(900, "T_EOB => define new resource\n"); if (res_all.hdr.name == NULL) { scan_err0(lc, _("Name not specified for resource")); + return 0; } save_resource(res_type, items, pass); /* save resource */ break; diff --git a/bacula/src/version.h b/bacula/src/version.h index a755ba410b..1b36cb8e46 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -3,9 +3,9 @@ */ #undef VERSION -#define VERSION "2.5.29" -#define BDATE "18 January 2009" -#define LSMDATE "18Jan09" +#define VERSION "2.5.30" +#define BDATE "22 January 2009" +#define LSMDATE "22Jan09" #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n" #define BYEAR "2009" /* year for copyright messages in progs */ diff --git a/bacula/technotes-2.5 b/bacula/technotes-2.5 index 8bcdfa561b..8dcd2ce6d7 100644 --- a/bacula/technotes-2.5 +++ b/bacula/technotes-2.5 @@ -10,6 +10,8 @@ filepattern (restore with regex in bsr) mixed priorities General: +22Jan09 +kes Fix bug #1211 crash during reload with bad dird.conf file. 21Jan09 ebl Add detection of intptr_t and uintptr_t to configure process 20Jan09 -- 2.39.5