[Crash-catcher] Le fichier de prospection complet en exportation illimitee
by julien
Le nouveau Fichier de prospection V8 - 800 000 emails est arrivé.
En tant que client privilégié nous vous avons gardé un exemplaire.
Ce fichier représente aujourd'hui le plus important fichier de prospection de France
Sans plus attendre profitez de notre offre pré vente pour commander votre fichier
800 000 emails de dirigeants d'entreprises pour 559,95 ht !
Appellez nous maintenant au + 33 1 70 37 6200
Pour connaitre toutes les carractéristiques de ce fichier cliquez sur le bouton droit de votre souris et téléchargez les images
Ce courriel commercial est conforme à la législation en vigueur et aux délibérations de la CNIL des 22 et 30 mars 2005 sur la prospection par courrier électronique dans le cadre professionnel. Conformément à l'article 34 de la loi 78-17 du 6 janvier mille neuf cent soixante dix huit, relative à l'informatique, aux fichiers et aux libertés, vous disposez d'un droit d'accès, de rectification des données nominatives vous concernant.
Inscrivez notre adresse dans votre liste blanche ou white liste pour recevoir nos offres une fois par semaine
Pour ne plus recevoir de mail de notre part Cliquez-ici .
Si vous souhaitez vous désabonner, recopiez cette adresse dans la barre d'adresse de votre navigateur :
http://www.active-diffusion.com/u-1.1.php?param=3Rbi_1IvEkRQjb1KxEatT38fg...
13 years, 11 months
[Crash-catcher] [PATCH 1/3] rid of std::string from bugzilla
by Nikola Pajkovsky
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
lib/Plugins/Bugzilla.cpp | 236 +++++++++++++++++++++++--------------------
lib/Plugins/Bugzilla.h | 10 +-
lib/Plugins/Catcut.cpp | 5 +-
lib/Plugins/Logger.cpp | 10 +-
lib/Utils/Plugin.h | 8 +-
lib/Utils/make_descr.cpp | 253 +++++++++++++++++++++++----------------------
6 files changed, 273 insertions(+), 249 deletions(-)
diff --git a/lib/Plugins/Bugzilla.cpp b/lib/Plugins/Bugzilla.cpp
index 94fd383..7075961 100644
--- a/lib/Plugins/Bugzilla.cpp
+++ b/lib/Plugins/Bugzilla.cpp
@@ -31,6 +31,8 @@
#define XML_RPC_SUFFIX "/xmlrpc.cgi"
#define MAX_HOPS 5
+#include "strbuf.h"
+
/*
* TODO: npajkovs: better deallocation of xmlrpc value
* npajkovs: better gathering function which collects all information from bugzilla
@@ -350,46 +352,48 @@ int ctx::add_comment(xmlrpc_int32 bug_id, const char* comment, bool is_private)
xmlrpc_int32 ctx::new_bug(const map_crash_data_t& pCrashData)
{
- const std::string& package = get_crash_data_item_content(pCrashData, FILENAME_PACKAGE);
- const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
- const std::string& release = get_crash_data_item_content(pCrashData, FILENAME_RELEASE);
- const std::string& arch = get_crash_data_item_content(pCrashData, FILENAME_ARCHITECTURE);
- const std::string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
- const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
- const char *function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
-
- std::string summary = "[abrt] " + package;
+ const char *package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
+ const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
+ const char *release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
+ const char *arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
+ const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, CD_DUPHASH);
+ const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
+ const char *function = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_CRASH_FUNCTION);
+
+ struct strbuf *buf_summary = strbuf_new();
+ strbuf_append_strf(buf_summary, "[abrt] %s", package);
+
if (function != NULL && strlen(function) < 30)
- {
- summary += ": ";
- summary += function;
- }
+ strbuf_append_strf(buf_summary, ": %s", function);
if (reason != NULL)
- {
- summary += ": ";
- summary += reason;
- }
- std::string status_whiteboard = "abrt_hash:" + duphash;
+ strbuf_append_strf(buf_summary, ": %s", reason);
+
+ char *status_whiteboard = xasprintf("abrt_hash:%s", duphash);
- std::string description = "abrt version: "VERSION"\n";
- description += make_description_bz(pCrashData);
+ char *bz_dsc = make_description_bz(pCrashData);
+ char *full_dsc = xasprintf("abrt version: "VERSION"\n%s", bz_dsc);
+ free(bz_dsc);
char *product = NULL;
char *version = NULL;
- parse_release(release.c_str(), &product, &version);
+ parse_release(release, &product, &version);
+ char *summary = strbuf_free_nobuf(buf_summary);
xmlrpc_value* result = call("Bug.create", "({s:s,s:s,s:s,s:s,s:s,s:s,s:s})",
"product", product,
- "component", component.c_str(),
+ "component", component,
"version", version,
- "summary", summary.c_str(),
- "description", description.c_str(),
- "status_whiteboard", status_whiteboard.c_str(),
- "platform", arch.c_str()
+ "summary", summary,
+ "description", full_dsc,
+ "status_whiteboard", status_whiteboard,
+ "platform", arch
);
+ free(status_whiteboard);
free(product);
free(version);
+ free(summary);
+ free(full_dsc);
if (!result)
return -1;
@@ -416,21 +420,23 @@ int ctx::add_attachments(const char* bug_id_str, const map_crash_data_t& pCrashD
map_crash_data_t::const_iterator it = pCrashData.begin();
for (; it != pCrashData.end(); it++)
{
- const std::string &itemname = it->first;
- const std::string &type = it->second[CD_TYPE];
- const std::string &content = it->second[CD_CONTENT];
+ const char *itemname = it->first.c_str();
+ const char *type = it->second[CD_TYPE].c_str();
+ const char *content = it->second[CD_CONTENT].c_str();
- if (type == CD_TXT
- && (content.length() > CD_TEXT_ATT_SIZE || itemname == FILENAME_BACKTRACE)
+ if ((strcmp(type, CD_TXT) == 0)
+ && (strlen(content) > CD_TEXT_ATT_SIZE || (strcmp(itemname, FILENAME_BACKTRACE) == 0))
) {
- char *encoded64 = encode_base64(content.c_str(), content.length());
+ char *encoded64 = encode_base64(content, strlen(content));
+ char *filename = xasprintf("File: %s", itemname);
xmlrpc_value* result = call("bugzilla.addAttachment", "(s{s:s,s:s,s:s,s:s})", bug_id_str,
- "description", ("File: " + itemname).c_str(),
- "filename", itemname.c_str(),
+ "description", filename,
+ "filename", itemname,
"contenttype", "text/plain",
"data", encoded64
);
free(encoded64);
+ free(filename);
if (!result)
return -1;
@@ -499,9 +505,11 @@ void ctx::login(const char* login, const char* passwd)
if (!result)
{
- std::string errmsg = ssprintf("Can't login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/Bugzilla.conf. Server said: %s", env.fault_string);
- error_msg("%s", errmsg.c_str()); // show error in daemon log
- throw CABRTException(EXCEP_PLUGIN, "%s", errmsg.c_str());
+ char *errmsg = xasprintf("Can't login. Check Edit->Plugins->Bugzilla and /etc/abrt/plugins/Bugzilla.conf. Server said: %s", env.fault_string);
+ error_msg("%s", errmsg); // show error in daemon log
+ CABRTException e(EXCEP_PLUGIN, errmsg);
+ free(errmsg);
+ throw e;
}
xmlrpc_DECREF(result);
}
@@ -577,64 +585,71 @@ static map_plugin_settings_t parse_settings(const map_plugin_settings_t& pSettin
return plugin_settings;
}
-CReporterBugzilla::CReporterBugzilla() :
- m_bNoSSLVerify(false),
- m_sBugzillaURL("https://bugzilla.redhat.com"),
- m_sBugzillaXMLRPC("https://bugzilla.redhat.com"XML_RPC_SUFFIX)
-{}
+CReporterBugzilla::CReporterBugzilla()
+{
+ m_no_ssl_verify = false;
+ m_login = NULL;
+ m_password = NULL;
+ m_bugzilla_url = xstrdup("https://bugzilla.redhat.com");
+ m_bugzilla_xmlrpc = xstrdup("https://bugzilla.redhat.com"XML_RPC_SUFFIX);
+}
CReporterBugzilla::~CReporterBugzilla()
-{}
+{
+ free(m_login);
+ free(m_password);
+ free(m_bugzilla_url);
+ free(m_bugzilla_xmlrpc);
+}
std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
const map_plugin_settings_t& pSettings,
const char *pArgs)
{
xmlrpc_int32 bug_id = -1;
- std::string Login;
- std::string Password;
- std::string BugzillaXMLRPC;
- std::string BugzillaURL;
- bool NoSSLVerify;
+ const char *login = NULL;
+ const char *password = NULL;
+ const char *bugzilla_xmlrpc = NULL;
+ const char *bugzilla_url = NULL;
+ bool no_ssl_verify;
+
map_plugin_settings_t settings = parse_settings(pSettings);
/* if parse_settings fails it returns an empty map so we need to use defaults */
if (!settings.empty())
{
- Login = settings["Login"];
- Password = settings["Password"];
- BugzillaXMLRPC = settings["BugzillaXMLRPC"];
- BugzillaURL = settings["BugzillaURL"];
- NoSSLVerify = string_to_bool(settings["NoSSLVerify"].c_str());
+ login = settings["Login"].c_str();
+ password = settings["Password"].c_str();
+ bugzilla_xmlrpc = settings["BugzillaXMLRPC"].c_str();
+ bugzilla_url = settings["BugzillaURL"].c_str();
+ no_ssl_verify = string_to_bool(settings["NoSSLVerify"].c_str());
}
else
{
- Login = m_sLogin;
- Password = m_sPassword;
- BugzillaXMLRPC = m_sBugzillaXMLRPC;
- BugzillaURL = m_sBugzillaURL;
- NoSSLVerify = m_bNoSSLVerify;
+ login = m_login;
+ password = m_password;
+ bugzilla_xmlrpc = m_bugzilla_xmlrpc;
+ bugzilla_url = m_bugzilla_url;
+ no_ssl_verify = m_no_ssl_verify;
}
- if ((Login == "") || (Password == ""))
+ if ((strcmp(login, "") == 0) || (strcmp(password, "") == 0))
{
VERB3 log("Empty login and password");
throw CABRTException(EXCEP_PLUGIN, _("Empty login or password.\nPlease check "PLUGINS_CONF_DIR"/Bugzilla.conf."));
}
- const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
- const std::string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
+ const char *component = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_COMPONENT);
+ const char *duphash = get_crash_data_item_content_or_NULL(pCrashData, CD_DUPHASH);
- ctx bz_server(BugzillaXMLRPC.c_str(), NoSSLVerify);
+ ctx bz_server(bugzilla_xmlrpc, no_ssl_verify);
update_client(_("Logging into bugzilla..."));
- bz_server.login(Login.c_str(), Password.c_str());
+ bz_server.login(login, password);
update_client(_("Checking for duplicates..."));
- xmlrpc_value* result = bz_server.call_quicksearch_duphash(component.c_str(), duphash.c_str());
+ xmlrpc_value* result = bz_server.call_quicksearch_duphash(component, duphash);
if (!result)
- {
throw_if_xml_fault_occurred(&bz_server.env);
- }
xmlrpc_value* all_bugs = bz_server.get_member("bugs", result);
xmlrpc_DECREF(result);
@@ -659,11 +674,11 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
throw_if_xml_fault_occurred(&bz_server.env);
throw CABRTException(EXCEP_PLUGIN, _("Bugzilla entry creation failed"));
}
+
+ update_client(_("Creating new attachment..."));
int ret = bz_server.add_attachments(to_string(bug_id).c_str(), pCrashData);
if (ret == -1)
- {
throw_if_xml_fault_occurred(&bz_server.env);
- }
update_client(_("Logging out..."));
bz_server.logout();
@@ -671,7 +686,7 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
std::string bug_status = ssprintf(
"Status: NEW\n"
"%s/show_bug.cgi?id=%u",
- BugzillaURL.c_str(),
+ bugzilla_url,
(int)bug_id
);
return bug_status;
@@ -680,16 +695,14 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
{
// When someone clones bug it has same duphash, so we can find more than 1.
// Need to be checked if component is same.
- VERB3 log("Bugzilla has %u reports with same duphash '%s'", all_bugs_size, duphash.c_str());
+ VERB3 log("Bugzilla has %u reports with same duphash '%s'", all_bugs_size, duphash);
}
// decision based on state
bug_id = bz_server.get_bug_id(all_bugs);
xmlrpc_DECREF(all_bugs);
if (bug_id == -1)
- {
throw_if_xml_fault_occurred(&bz_server.env);
- }
struct bug_info bz;
bug_info_init(&bz);
@@ -737,11 +750,11 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
if (strcmp(bz.bug_status, "CLOSED") != 0)
{
int status = 0;
- if ((strcmp(bz.bug_reporter, Login.c_str()) != 0) && (am_i_in_cc(&bz, Login.c_str())))
+ if ((strcmp(bz.bug_reporter, login) != 0) && (am_i_in_cc(&bz, login)))
{
- VERB2 log(_("Add %s to CC list"), Login.c_str());
- update_client(_("Add %s to CC list"), Login.c_str());
- status = bz_server.add_plus_one_cc(bug_id, Login.c_str());
+ VERB2 log(_("Add %s to CC list"), login);
+ update_client(_("Add %s to CC list"), login);
+ status = bz_server.add_plus_one_cc(bug_id, login);
}
if (status == -1)
@@ -750,28 +763,30 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
throw_if_xml_fault_occurred(&bz_server.env);
}
- std::string description = make_description_reproduce_comment(pCrashData);
- if (!description.empty())
+ char *dsc = make_description_reproduce_comment(pCrashData);
+ if (dsc)
{
const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
const char* release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
const char* arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
const char* is_private = get_crash_data_item_content_or_NULL(pCrashData, "is_private");
- description = ssprintf("Package: %s\n"
+ char *full_dsc = xasprintf("Package: %s\n"
"Architecture: %s\n"
"OS Release: %s\n"
- "%s", package, arch, release, description.c_str()
+ "%s", package, arch, release, dsc
);
-
+ free(dsc);
update_client(_("Add new comment into bug(%d)"), (int)bug_id);
bool is_priv = is_private && (is_private[0] == '1');
- if (bz_server.add_comment(bug_id, description.c_str(), is_priv) == -1)
+ if (bz_server.add_comment(bug_id, full_dsc, is_priv) == -1)
{
+ free(full_dsc);
bug_info_destroy(&bz);
throw_if_xml_fault_occurred(&bz_server.env);
}
+ free(full_dsc);
}
}
@@ -784,7 +799,7 @@ std::string CReporterBugzilla::Report(const map_crash_data_t& pCrashData,
bz.bug_status,
bz.bug_resolution ? " " : "",
bz.bug_resolution ? bz.bug_resolution : "",
- BugzillaURL.c_str(),
+ bugzilla_url,
(int)bug_id
);
@@ -806,54 +821,55 @@ void CReporterBugzilla::SetSettings(const map_plugin_settings_t& pSettings)
map_plugin_settings_t::const_iterator end = pSettings.end();
map_plugin_settings_t::const_iterator it;
+
it = pSettings.find("BugzillaURL");
if (it != end)
{
- m_sBugzillaURL = it->second;
- //remove the /xmlrpc.cgi part from old settings
- //FIXME: can be removed after users are informed about new config format
- std::string::size_type pos = m_sBugzillaURL.find(XML_RPC_SUFFIX);
- if (pos != std::string::npos)
- {
- m_sBugzillaURL.erase(pos);
- }
- //remove the trailing '/'
- while (m_sBugzillaURL[m_sBugzillaURL.length() - 1] == '/')
- {
- m_sBugzillaURL.erase(m_sBugzillaURL.length() - 1);
- }
- /*
- if (*(--m_sBugzillaURL.end()) == '/')
- {
- m_sBugzillaURL.erase(--m_sBugzillaURL.end());
- }
- */
- m_sBugzillaXMLRPC = m_sBugzillaURL + XML_RPC_SUFFIX;
+ free(m_bugzilla_url);
+ free(m_bugzilla_xmlrpc);
+
+ m_bugzilla_url = xstrdup(it->second.c_str());
+
+ int cnt = strlen(m_bugzilla_url);
+ while (m_bugzilla_url[cnt--] == '/')
+ m_bugzilla_url[cnt] = '\0';
+
+ int ret = suffixcmp(m_bugzilla_url, XML_RPC_SUFFIX);
+ if (ret != 0)
+ m_bugzilla_xmlrpc = xasprintf("%s%s", m_bugzilla_url, XML_RPC_SUFFIX);
+ else
+ m_bugzilla_xmlrpc = xstrdup(m_bugzilla_url);
}
+
it = pSettings.find("Login");
if (it != end)
{
- m_sLogin = it->second;
+ free(m_login);
+ m_login = xstrdup(it->second.c_str());
}
+
it = pSettings.find("Password");
if (it != end)
{
- m_sPassword = it->second;
+ free(m_password);
+ m_password = xstrdup(it->second.c_str());
}
+
it = pSettings.find("NoSSLVerify");
if (it != end)
{
- m_bNoSSLVerify = string_to_bool(it->second.c_str());
+ m_no_ssl_verify = string_to_bool(it->second.c_str());
}
+ VERB3 log("%s:%s:%s:%s:%s", __FILE__, __func__, m_bugzilla_url, m_login, m_password);
}
/* Should not be deleted (why?) */
const map_plugin_settings_t& CReporterBugzilla::GetSettings()
{
- m_pSettings["BugzillaURL"] = m_sBugzillaURL;
- m_pSettings["Login"] = m_sLogin;
- m_pSettings["Password"] = m_sPassword;
- m_pSettings["NoSSLVerify"] = m_bNoSSLVerify ? "yes" : "no";
+ m_pSettings["BugzillaURL"] = m_bugzilla_url;
+ m_pSettings["Login"] = (m_login)? m_login: "";
+ m_pSettings["Password"] = (m_password)? m_password: "";
+ m_pSettings["NoSSLVerify"] = m_no_ssl_verify ? "yes" : "no";
return m_pSettings;
}
diff --git a/lib/Plugins/Bugzilla.h b/lib/Plugins/Bugzilla.h
index cad00ef..4388794 100644
--- a/lib/Plugins/Bugzilla.h
+++ b/lib/Plugins/Bugzilla.h
@@ -25,11 +25,11 @@
class CReporterBugzilla : public CReporter
{
private:
- bool m_bNoSSLVerify;
- std::string m_sBugzillaURL;
- std::string m_sBugzillaXMLRPC;
- std::string m_sLogin;
- std::string m_sPassword;
+ bool m_no_ssl_verify;
+ char *m_bugzilla_url;
+ char *m_bugzilla_xmlrpc;
+ char *m_login;
+ char *m_password;
public:
CReporterBugzilla();
diff --git a/lib/Plugins/Catcut.cpp b/lib/Plugins/Catcut.cpp
index 05a93bb..83e0863 100644
--- a/lib/Plugins/Catcut.cpp
+++ b/lib/Plugins/Catcut.cpp
@@ -288,7 +288,7 @@ ctx::new_bug(const char *auth_cookie, const map_crash_data_t& pCrashData)
string summary = "[abrt] crash in " + package;
string status_whiteboard = "abrt_hash:" + uuid;
- string description = make_description_catcut(pCrashData);
+ char *dsc = make_description_catcut(pCrashData);
char *product = NULL;
char *version = NULL;
@@ -300,12 +300,13 @@ ctx::new_bug(const char *auth_cookie, const map_crash_data_t& pCrashData)
"component", component.c_str(),
"version", version,
"summary", summary.c_str(),
- "description", description.c_str(),
+ "description", dsc,
"status_whiteboard", status_whiteboard.c_str(),
"platform", arch.c_str()
);
free(product);
free(version);
+ free(dsc);
throw_if_xml_fault_occurred(&env);
xmlrpc_value *result;
diff --git a/lib/Plugins/Logger.cpp b/lib/Plugins/Logger.cpp
index a0c2364..9507afa 100644
--- a/lib/Plugins/Logger.cpp
+++ b/lib/Plugins/Logger.cpp
@@ -60,7 +60,9 @@ std::string CLogger::Report(const map_crash_data_t& pCrashData,
const map_plugin_settings_t& pSettings,
const char *pArgs)
{
- std::string description = make_description_logger(pCrashData);
+ char *dsc = make_description_logger(pCrashData);
+ char *full_dsc = xasprintf("%s\n\n\n", dsc);
+ free(dsc);
/* open, not fopen - want to set mode if we create the file, not just open */
const char *fname = m_sLogPath.c_str();
@@ -71,9 +73,9 @@ std::string CLogger::Report(const map_crash_data_t& pCrashData,
throw CABRTException(EXCEP_PLUGIN, "Can't open '%s'", fname);
update_client(_("Writing report to '%s'"), fname);
- description += "\n\n\n";
- const char *desc = description.c_str();
- full_write(fd, desc, strlen(desc));
+ full_write(fd, full_dsc, strlen(full_dsc));
+ free(full_dsc);
+
close(fd);
return "file://" + m_sLogPath;
diff --git a/lib/Utils/Plugin.h b/lib/Utils/Plugin.h
index 059f800..f8f17bb 100644
--- a/lib/Utils/Plugin.h
+++ b/lib/Utils/Plugin.h
@@ -119,10 +119,10 @@ typedef struct SPluginInfo
};
/* helper functions */
-std::string make_description_bz(const map_crash_data_t& pCrashData);
-std::string make_description_reproduce_comment(const map_crash_data_t& pCrashData);
-std::string make_description_logger(const map_crash_data_t& pCrashData);
-std::string make_description_catcut(const map_crash_data_t& pCrashData);
+char* make_description_bz(const map_crash_data_t& pCrashData);
+char* make_description_reproduce_comment(const map_crash_data_t& pCrashData);
+char* make_description_logger(const map_crash_data_t& pCrashData);
+char* make_description_catcut(const map_crash_data_t& pCrashData);
/**
* Loads settings and stores it in second parameter. On success it
diff --git a/lib/Utils/make_descr.cpp b/lib/Utils/make_descr.cpp
index 7db30bc..49c8b75 100644
--- a/lib/Utils/make_descr.cpp
+++ b/lib/Utils/make_descr.cpp
@@ -29,13 +29,16 @@
# define _(S) (S)
#endif
+#include "strbuf.h"
+
using namespace std;
-static void add_content(bool &was_multiline, string& description, const char *header, const char *content)
+// caller is responsible for freeing **dsc
+static void add_content(bool *was_multiline, char **dsc, const char *header, const char *content)
{
- /* We separate multiline contents with emply line */
- if (was_multiline)
- description += '\n';
+ struct strbuf *buf_description = strbuf_new();
+ if (*was_multiline)
+ strbuf_append_char(buf_description, '\n');
while (content[0] == '\n')
content++;
@@ -45,27 +48,27 @@ static void add_content(bool &was_multiline, string& description, const char *he
if (skip_whitespace(content)[0] == '\0')
{
/* empty, dont report at all */
+ *dsc = strbuf_free_nobuf(buf_description);
return;
}
/* one string value, like OS release */
- description += header;
- description += ": ";
- description += content;
- description += '\n';
- was_multiline = 0;
+ strbuf_append_strf(buf_description, "%s: %s\n", header, content);
+ *was_multiline = 0;
}
else
{
/* multi-string value, like backtrace */
- if (!was_multiline && description.size() != 0) /* if wasn't yet separated */
- description += '\n'; /* do it now */
- description += header;
- description += "\n-----\n";
- description += content;
+ if (!*was_multiline && (buf_description->len != 0)) /* if wasn't yet separated */
+ strbuf_append_char(buf_description, '\n');
+
+ strbuf_append_strf(buf_description, "%s\n-----\n%s", header, content);
if (content[strlen(content) - 1] != '\n')
- description += '\n';
- was_multiline = 1;
+ strbuf_append_char(buf_description, '\n');
+
+ *was_multiline = 1;
}
+
+ *dsc = strbuf_free_nobuf(buf_description);
}
/* Items we don't want to include */
@@ -86,208 +89,210 @@ static const char *const blacklisted_items_bz[] = {
NULL
};
-string make_description_bz(const map_crash_data_t& pCrashData)
+char* make_description_bz(const map_crash_data_t& pCrashData)
{
- string description;
- string long_description;
+ struct strbuf *buf_dsc = strbuf_new();
+ struct strbuf *buf_long_dsc = strbuf_new();
map_crash_data_t::const_iterator it = pCrashData.begin();
for (; it != pCrashData.end(); it++)
{
- const string& itemname = it->first;
- const string& type = it->second[CD_TYPE];
- const string& content = it->second[CD_CONTENT];
- if (type == CD_TXT)
+ const char *itemname = it->first.c_str();
+ const char *type = it->second[CD_TYPE].c_str();
+ const char *content = it->second[CD_CONTENT].c_str();
+ if (strcmp(type, CD_TXT) == 0)
{
/* Skip items we are not interested in */
const char *const *bl = blacklisted_items_bz;
while (*bl)
{
- if (itemname == *bl)
+ if (strcmp(itemname, *bl) == 0)
break;
bl++;
}
if (*bl)
continue; /* blacklisted */
- if (content == "1.\n2.\n3.\n")
+ if (strcmp(content, "1.\n2.\n3.\n") == 0)
continue; /* user did not change default "How to reproduce" */
- if (content.size() <= CD_TEXT_ATT_SIZE)
+ if (strlen(content) <= CD_TEXT_ATT_SIZE)
{
/* Add small (less than few kb) text items inline */
bool was_multiline = 0;
- string tmp;
- add_content(was_multiline,
- tmp,
- /* "reproduce: blah" looks ugly, fixing: */
- itemname == FILENAME_REPRODUCE ? "How to reproduce" : itemname.c_str(),
- content.c_str()
+ char *tmp = NULL;
+ add_content(&was_multiline,
+ &tmp,
+ /* "reproduce: blah" looks ugly, fixing: */
+ (strcmp(itemname, FILENAME_REPRODUCE) == 0) ? "How to reproduce" : itemname,
+ content
);
if (was_multiline)
{
/* Not one-liner */
- if (long_description.size() != 0)
- long_description += '\n';
- long_description += tmp;
+ if (buf_long_dsc->len != 0)
+ strbuf_append_char(buf_long_dsc, '\n');
+
+ strbuf_append_str(buf_long_dsc, tmp);
}
else
- {
- description += tmp;
- }
+ strbuf_append_str(buf_dsc, tmp);
+
+ free(tmp);
} else {
bool was_multiline = 0;
- add_content(was_multiline, description, "Attached file", itemname.c_str());
+ char *dsc = NULL;
+ add_content(&was_multiline, &dsc, "Attached file", itemname);
+ strbuf_append_str(buf_dsc, dsc);
+ free(dsc);
}
}
}
/* One-liners go first, then multi-line items */
- if (description.size() != 0 && long_description.size() != 0)
- {
- description += '\n';
- }
- description += long_description;
+ if (buf_dsc->len != 0 && buf_long_dsc->len != 0)
+ strbuf_append_char(buf_dsc, '\n');
- return description;
+
+ char *long_dsc = strbuf_free_nobuf(buf_long_dsc);
+ strbuf_append_str(buf_dsc, long_dsc);
+ free(long_dsc);
+
+ return strbuf_free_nobuf(buf_dsc);
}
-string make_description_logger(const map_crash_data_t& pCrashData)
+char* make_description_logger(const map_crash_data_t& pCrashData)
{
- string description;
- string long_description;
+ struct strbuf *buf_dsc = strbuf_new();
+ struct strbuf *buf_long_dsc = strbuf_new();
map_crash_data_t::const_iterator it = pCrashData.begin();
for (; it != pCrashData.end(); it++)
{
- const string &filename = it->first;
- const string &type = it->second[CD_TYPE];
- const string &content = it->second[CD_CONTENT];
- if (type == CD_TXT
- || type == CD_BIN
+ const char *filename = it->first.c_str();
+ const char *type = it->second[CD_TYPE].c_str();
+ const char *content = it->second[CD_CONTENT].c_str();
+ if ((strcmp(type, CD_TXT) == 0)
+ || (strcmp(type, CD_BIN) == 0)
) {
- if (content == "1.\n2.\n3.\n")
+ if (strcmp(content, "1.\n2.\n3.\n") == 0)
continue; /* user did not change default "How to reproduce" */
bool was_multiline = 0;
- string tmp;
- add_content(was_multiline, tmp, filename.c_str(), content.c_str());
+ char *tmp = NULL;
+ add_content(&was_multiline, &tmp, filename, content);
if (was_multiline)
{
- if (long_description.size() != 0)
- long_description += '\n';
- long_description += tmp;
+ if (buf_long_dsc->len != 0)
+ strbuf_append_char(buf_long_dsc,'\n');
+
+ strbuf_append_str(buf_long_dsc, tmp);
}
else
- {
- description += tmp;
- }
+ strbuf_append_str(buf_dsc, tmp);
}
}
- if (description.size() != 0 && long_description.size() != 0)
- {
- description += '\n';
- }
- description += long_description;
+ if (buf_dsc->len != 0 && buf_long_dsc->len != 0)
+ strbuf_append_char(buf_dsc, '\n');
- return description;
+ char *long_dsc = strbuf_free_nobuf(buf_long_dsc);
+ strbuf_append_str(buf_dsc, long_dsc);
+ free(long_dsc);
+
+ return strbuf_free_nobuf(buf_dsc);
}
-string make_description_reproduce_comment(const map_crash_data_t& pCrashData)
+char* make_description_reproduce_comment(const map_crash_data_t& pCrashData)
{
+ char *repro = NULL;
+ char *comment = NULL;
+
map_crash_data_t::const_iterator end = pCrashData.end();
map_crash_data_t::const_iterator it;
- string howToReproduce;
it = pCrashData.find(FILENAME_REPRODUCE);
if (it != end)
{
if ((it->second[CD_CONTENT].size() > 0)
&& (it->second[CD_CONTENT] != "1.\n2.\n3.\n"))
{
- howToReproduce = "\n\nHow to reproduce\n"
- "-----\n";
- howToReproduce += it->second[CD_CONTENT];
+ repro = xasprintf("\n\nHow to reproduce\n-----\n%s", it->second[CD_CONTENT].c_str());
}
}
- string comment;
+
it = pCrashData.find(FILENAME_COMMENT);
if (it != end)
{
if (it->second[CD_CONTENT].size() > 0)
- {
- comment = "\n\nComment\n"
- "-----\n";
- comment += it->second[CD_CONTENT];
- }
+ comment = xasprintf("\n\nComment\n-----\n%s", it->second[CD_CONTENT].c_str());
}
- return howToReproduce + comment;
+
+ if (!repro && !comment)
+ return NULL;
+
+ struct strbuf *buf_dsc = strbuf_new();
+
+ if (repro)
+ strbuf_append_str(buf_dsc, repro);
+
+ if (comment)
+ strbuf_append_str(buf_dsc, comment);
+
+ free(repro);
+ free(comment);
+
+ return strbuf_free_nobuf(buf_dsc);
}
/* This needs more work to make the result less ugly */
-string make_description_catcut(const map_crash_data_t& pCrashData)
+char* make_description_catcut(const map_crash_data_t& pCrashData)
{
map_crash_data_t::const_iterator end = pCrashData.end();
map_crash_data_t::const_iterator it;
- string howToReproduce;
+ char *repro = NULL;
it = pCrashData.find(FILENAME_REPRODUCE);
if (it != end)
- {
- howToReproduce = "\n\nHow to reproduce\n"
- "-----\n";
- howToReproduce += it->second[CD_CONTENT];
- }
- string comment;
+ repro = xasprintf("\n\nHow to reproduce\n-----\n%s", it->second[CD_CONTENT].c_str());
+
+ char *comment = NULL;
it = pCrashData.find(FILENAME_COMMENT);
if (it != end)
- {
- comment = "\n\nComment\n"
- "-----\n";
- comment += it->second[CD_CONTENT];
- }
+ comment = xasprintf("\n\nComment\n-----\n", it->second[CD_CONTENT].c_str());
+
+ struct strbuf *buf_dsc = strbuf_new();
+ strbuf_append_str(buf_dsc, "\nabrt "VERSION" detected a crash.\n");
+ strbuf_append_strf(buf_dsc, "%s%s", repro, comment);
+ strbuf_append_str(buf_dsc, "\n\nAdditional information\n======\n");
- string pDescription = "\nabrt "VERSION" detected a crash.\n";
- pDescription += howToReproduce;
- pDescription += comment;
- pDescription += "\n\nAdditional information\n"
- "======\n";
+ free(repro);
+ free(comment);
for (it = pCrashData.begin(); it != end; it++)
{
- const string &filename = it->first;
- const string &type = it->second[CD_TYPE];
- const string &content = it->second[CD_CONTENT];
- if (type == CD_TXT)
+ const char *filename = it->first.c_str();
+ const char *type = it->second[CD_TYPE].c_str();
+ const char *content = it->second[CD_CONTENT].c_str();
+ if (strcmp(type, CD_TXT) == 0)
{
- if (content.length() <= CD_TEXT_ATT_SIZE)
+ if (strlen(content) <= CD_TEXT_ATT_SIZE)
{
- if (filename != CD_DUPHASH
- && filename != FILENAME_ARCHITECTURE
- && filename != FILENAME_RELEASE
- && filename != FILENAME_REPRODUCE
- && filename != FILENAME_COMMENT
+ if ((strcmp(filename, CD_DUPHASH) != 0)
+ && (strcmp(filename, FILENAME_ARCHITECTURE) != 0)
+ && (strcmp(filename, FILENAME_RELEASE) != 0)
+ && (strcmp(filename, FILENAME_REPRODUCE) != 0)
+ && (strcmp(filename, FILENAME_COMMENT) != 0)
) {
- pDescription += '\n';
- pDescription += filename;
- pDescription += "\n-----\n";
- pDescription += content;
- pDescription += "\n\n";
+ strbuf_append_strf(buf_dsc, "\n%s\n-----\n%s\n\n", filename, content);
}
- } else {
- pDescription += "\n\nAttached files\n"
- "----\n";
- pDescription += filename;
- pDescription += '\n';
- }
- }
- else if (type == CD_BIN)
- {
- error_msg(_("Binary file %s will not be reported"), filename.c_str());
+ } else
+ strbuf_append_strf(buf_dsc,"\n\nAttached files\n----\n%s\n", filename);
}
+ else if (strcmp(type, CD_BIN) == 0)
+ error_msg(_("Binary file %s will not be reported"), filename);
}
- return pDescription;
+ return strbuf_free_nobuf(buf_dsc);
}
--
1.6.5.2
13 years, 11 months
[Crash-catcher] [PATCH] save binary image along with coredump
by Denys Vlasenko
It occurred to me that we can easily save binary image too,
even if it is deleted - by opening and reading /proc/PID/exe!
This later can be hooked to gdb to get backtrace more reliably.
Here's the patch. Run tested. Please ACK.
--
vda
diff -x '*.po' -d -urpN abrt.0/inc/CrashTypes.h abrt.1/inc/CrashTypes.h
--- abrt.0/inc/CrashTypes.h 2010-05-28 18:55:39.000000000 +0200
+++ abrt.1/inc/CrashTypes.h 2010-06-01 19:26:22.129761826 +0200
@@ -25,6 +25,7 @@
// filled by a hook:
#define FILENAME_ANALYZER "analyzer"
#define FILENAME_EXECUTABLE "executable"
+#define FILENAME_BINARY "binary"
#define FILENAME_CMDLINE "cmdline"
#define FILENAME_REASON "reason"
#define FILENAME_COREDUMP "coredump"
diff -x '*.po' -d -urpN abrt.0/src/Hooks/abrt-hook-ccpp.cpp abrt.1/src/Hooks/abrt-hook-ccpp.cpp
--- abrt.0/src/Hooks/abrt-hook-ccpp.cpp 2010-05-28 18:55:39.000000000 +0200
+++ abrt.1/src/Hooks/abrt-hook-ccpp.cpp 2010-06-01 19:32:47.427011677 +0200
@@ -132,11 +132,12 @@ static off_t copyfd_sparse(int src_fd, i
return total;
}
-static char* get_executable(pid_t pid)
+static char* get_executable(pid_t pid, int *fd_p)
{
char buf[sizeof("/proc/%lu/exe") + sizeof(long)*3];
sprintf(buf, "/proc/%lu/exe", (long)pid);
+ *fd_p = open(buf, O_RDONLY); /* might fail and return -1, it's ok */
return malloc_readlink(buf);
}
@@ -262,7 +263,8 @@ int main(int argc, char** argv)
error_msg_and_die("pid '%s' or limit '%s' is bogus", argv[2], argv[5]);
}
- char* executable = get_executable(pid);
+ int src_fd_binary;
+ char* executable = get_executable(pid, &src_fd_binary);
if (executable == NULL)
{
error_msg_and_die("can't read /proc/%lu/exe link", (long)pid);
@@ -391,6 +393,20 @@ int main(int argc, char** argv)
free(cmdline);
free(reason);
+ if (src_fd_binary > 0)
+ {
+ strcpy(path + path_len, "/"FILENAME_BINARY);
+ int dst_fd_binary = xopen3(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ off_t sz = copyfd_eof(src_fd_binary, dst_fd_binary, COPYFD_SPARSE);
+ if (sz < 0 || fsync(dst_fd_binary) != 0)
+ {
+ unlink(path);
+ error_msg_and_die("error saving binary image to %s", path);
+ }
+ close(dst_fd_binary);
+ close(src_fd_binary);
+ }
+
/* We need coredumps to be readable by all, because
* when abrt daemon processes coredump,
* process producing backtrace is run under the same UID
13 years, 11 months
[Crash-catcher] Or looking after her. I don't go down more 'n I can avoid. It make
by Hembry Gellinger
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 4.6.33.3689;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 4.6.33.3689;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 4.6.33.3689;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 4.6.33.3689;}ttp://www.ku12.ru"}}{\fldrslt{\ul\cf1 http://www.ku12.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 4.6.33.3689;}}
13 years, 11 months
[Crash-catcher] rows and enjoying sam
by Hussien Bracewell
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 4.4.7.1367;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 4.4.7.1367;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 4.4.7.1367;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 4.4.7.1367;}ttp://www.de93.ru"}}{\fldrslt{\ul\cf1 http://www.de93.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 4.4.7.1367;}}
13 years, 11 months
[Crash-catcher] Fur farm for you? It would only take a few da
by Convery Merel
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 2.33.42.602;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 2.33.42.602;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 2.33.42.602;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 2.33.42.602;}ttp://www.da85.ru"}}{\fldrslt{\ul\cf1 http://www.da85.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 2.33.42.602;}}
13 years, 11 months
[Crash-catcher] [PATCH] new fuctions and realloc replaced by xrealloc
by Nikola Pajkovsky
new functions are prefixcmp and suffixcmp
Signed-off-by: Nikola Pajkovsky <npajkovs(a)redhat.com>
---
inc/abrtlib.h | 3 +++
lib/Utils/strbuf.c | 26 ++++++++++++++++++++------
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/inc/abrtlib.h b/inc/abrtlib.h
index 4c4aa6b..cfeb62e 100644
--- a/inc/abrtlib.h
+++ b/inc/abrtlib.h
@@ -98,6 +98,9 @@ extern int g_verbose;
char* skip_whitespace(const char *s);
char* skip_non_whitespace(const char *s);
+extern int prefixcmp(const char *str, const char *prefix);
+extern int suffixcmp(const char *str, const char *suffix);
+
unsigned xatou(const char *numstr);
int xatoi(const char *numstr);
diff --git a/lib/Utils/strbuf.c b/lib/Utils/strbuf.c
index 0206233..0d14100 100644
--- a/lib/Utils/strbuf.c
+++ b/lib/Utils/strbuf.c
@@ -25,6 +25,25 @@
#include <stdarg.h>
#include "xfuncs.h"
+
+int prefixcmp(const char *str, const char *prefix)
+{
+ for (; ; str++, prefix++)
+ if (!*prefix)
+ return 0;
+ else if (*str != *prefix)
+ return (unsigned char)*prefix - (unsigned char)*str;
+}
+
+int suffixcmp(const char *str, const char *suffix)
+{
+ int len = strlen(str), suflen = strlen(suffix);
+ if (len < suflen)
+ return -1;
+ else
+ return strcmp(str + len - suflen, suffix);
+}
+
struct strbuf *strbuf_new()
{
struct strbuf *buf = xmalloc(sizeof(struct strbuf));
@@ -66,12 +85,7 @@ static void strbuf_grow(struct strbuf *strbuf, int num)
while (strbuf->len + num + 1 > strbuf->alloc)
strbuf->alloc *= 2; /* huge grow = infinite loop */
- strbuf->buf = realloc(strbuf->buf, strbuf->alloc);
- if (!strbuf->buf)
- {
- puts("Error while allocating memory for string buffer.");
- exit(5);
- }
+ strbuf->buf = xrealloc(strbuf->buf, strbuf->alloc);
}
}
--
1.6.5.2
13 years, 11 months
[Crash-catcher] The soul that strives, or world it tries Conclusions wit
by Derrico Mateos
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 1.8.21.1659;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 1.8.21.1659;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 1.8.21.1659;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 1.8.21.1659;}ttp://www.da85.ru"}}{\fldrslt{\ul\cf1 http://www.da85.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 1.8.21.1659;}}
13 years, 11 months
[Crash-catcher] he came into association, and it had made
by Voedisch Yurko
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\*\generator Msftedit 0.31.9.2881;}{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 0.31.9.2881;}{\colortbl ;\red0\green0\blue255;\red192\green80\blue77;\red0\green176\blue80;\red204\green180\blue0;\red255\green0\blue0;\red223\green206\blue4;\red155\green0\blue211;\red79\green129\blue189;\red165\green165\blue165;\red128\green158\blue194;\red247\green150\blue70;\red0\green77\blue187;\red75\green172\blue198;\red221\green132\blue132;\red51\green51\blue51;\red158\green124\blue124;\red155\green187\blue89;}
{\*\generator Msftedit 0.31.9.2881;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs32{\field{\*\fldinst{HYPERLINK "h{\*\dd 0.31.9.2881;}ttp://www.ma95.ru"}}{\fldrslt{\ul\cf1 http://www.ma95.ru}}}\f0\cf1\b\fs32 - Order the cheapest medications now!\par
Viagra \cf4 Cialis \cf3 Viagra Professional \cf5 Cialis Professional \cf6 Viagra Super Active+ \cf3 Cialis Super Active+ \cf7 Levitra\cf0 \cf8 Viagra Soft Tabs \cf9 Cialis Soft Tabs\cf10 \cf11 Levitra Professional \cf4 Female Viagra \cf12 Propecia \cf7 Acomplia \cf6 Xenical\cf0 \cf5 Brand Levitra \cf13 Female Cialis \cf14 Levitra Super Active+ \cf15 Tamiflu\cf0 \cf7 VPXL\cf0 \cf16 Viagra Soft Flavoured \cf5 Brand Viagra \cf17 Brand Cialis\cf0
{\*\generator Msftedit 0.31.9.2881;}}
13 years, 11 months