level to avoid prematurely freeing a message when spooling it
to more than one node.
/*
* Text description of this software
*/
/*
* Text description of this software
*/
-#define CITADEL "Citadel 6.80"
+#define CITADEL "Citadel 6.81"
/*
* REV_LEVEL is the current version number (multiplied by 100 to avoid having
/*
* REV_LEVEL is the current version number (multiplied by 100 to avoid having
* usually more strict because you're not really supposed to dump/load and
* upgrade at the same time.
*/
* usually more strict because you're not really supposed to dump/load and
* upgrade at the same time.
*/
-#define REV_LEVEL 680 /* This version */
+#define REV_LEVEL 681 /* This version */
#define REV_MIN 591 /* Oldest compatible database */
#define EXPORT_REV_MIN 655 /* Oldest compatible export files */
#define REV_MIN 591 /* Oldest compatible database */
#define EXPORT_REV_MIN 655 /* Oldest compatible export files */
!include "${NSISDIR}\Contrib\Modern UI\System.nsh"
!define MUI_PRODUCT "Citadel"
!include "${NSISDIR}\Contrib\Modern UI\System.nsh"
!define MUI_PRODUCT "Citadel"
-!define MUI_VERSION "6.80"
+!define MUI_VERSION "6.81"
!define MUI_WELCOMEPAGE
!define MUI_LICENSEPAGE
!define MUI_COMPONENTSPAGE
!define MUI_WELCOMEPAGE
!define MUI_LICENSEPAGE
!define MUI_COMPONENTSPAGE
;!define MUI_ICON "${NSISDIR}\Contrib\Icons\modern-install.ico"
;!define MUI_UNICON "${NSISDIR}\Contrib\Icons\modern-uninstall.ico"
;!define MUI_ICON "${NSISDIR}\Contrib\Icons\modern-install.ico"
;!define MUI_UNICON "${NSISDIR}\Contrib\Icons\modern-uninstall.ico"
-OutFile "citadel-6.80.exe"
+OutFile "citadel-6.81.exe"
BGGradient off
LangString DESC_Citadel ${LANG_ENGLISH} "Citadel client and core libraries (required)"
BGGradient off
LangString DESC_Citadel ${LANG_ENGLISH} "Citadel client and core libraries (required)"
# $Id$
Summary: Citadel, the flexible, powerful way to build online communities
Name: citadel
# $Id$
Summary: Citadel, the flexible, powerful way to build online communities
Name: citadel
Release: 1
Copyright: GPL
Group: Applications/Communications
Release: 1
Copyright: GPL
Group: Applications/Communications
void serialize_message(struct ser_ret *ret, /* return values */
struct CtdlMessage *msg) /* unserialized msg */
{
void serialize_message(struct ser_ret *ret, /* return values */
struct CtdlMessage *msg) /* unserialized msg */
{
int i;
static char *forder = FORDER;
int i;
static char *forder = FORDER;
- if (is_valid_message(msg) == 0) return; /* self check */
+ /*
+ * Check for valid message format
+ */
+ if (is_valid_message(msg) == 0) {
+ lprintf(CTDL_ERR, "serialize_message() aborting due to invalid message\n");
+ ret->len = 0;
+ ret->ser = NULL;
+ return;
+ }
ret->len = 3;
for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL)
ret->len = ret->len +
strlen(msg->cm_fields[(int)forder[i]]) + 2;
ret->len = 3;
for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL)
ret->len = ret->len +
strlen(msg->cm_fields[(int)forder[i]]) + 2;
- lprintf(CTDL_DEBUG, "serialize_message() calling malloc(%ld)\n", (long)ret->len);
ret->ser = malloc(ret->len);
if (ret->ser == NULL) {
ret->ser = malloc(ret->len);
if (ret->ser == NULL) {
+ lprintf(CTDL_ERR, "serialize_message() malloc(%ld) failed: %s\n",
+ (long)ret->len, strerror(errno));
wlen = 3;
for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) {
wlen = 3;
for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) {
+ fieldlen = strlen(msg->cm_fields[(int)forder[i]]);
ret->ser[wlen++] = (char)forder[i];
ret->ser[wlen++] = (char)forder[i];
- strcpy((char *)&ret->ser[wlen], msg->cm_fields[(int)forder[i]]);
- wlen = wlen + strlen(msg->cm_fields[(int)forder[i]]) + 1;
+ safestrncpy((char *)&ret->ser[wlen], msg->cm_fields[(int)forder[i]], fieldlen+1);
+ wlen = wlen + fieldlen + 1;
}
if (ret->len != wlen) lprintf(CTDL_ERR, "ERROR: len=%ld wlen=%ld\n",
(long)ret->len, (long)wlen);
}
if (ret->len != wlen) lprintf(CTDL_ERR, "ERROR: len=%ld wlen=%ld\n",
(long)ret->len, (long)wlen);
* after sending out on the network
*/
if (msg->cm_fields['S'] != NULL) {
* after sending out on the network
*/
if (msg->cm_fields['S'] != NULL) {
- if (!strcasecmp(msg->cm_fields['S'],
- "CANCEL")) {
+ if (!strcasecmp(msg->cm_fields['S'], "CANCEL")) {
delete_after_send = 1;
}
}
delete_after_send = 1;
}
}
/* serialize it for transmission */
serialize_message(&sermsg, msg);
/* serialize it for transmission */
serialize_message(&sermsg, msg);
-
- /* write it to the spool file */
- snprintf(filename, sizeof filename,"%s/%s",
- ctdl_netout_dir,
- mptr->remote_nodename);
- lprintf(CTDL_DEBUG, "Appending to %s\n", filename);
- fp = fopen(filename, "ab");
- if (fp != NULL) {
- fwrite(sermsg.ser,
- sermsg.len, 1, fp);
- fclose(fp);
- }
- else {
- lprintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno));
+ if (sermsg.len > 0) {
+
+ /* write it to the spool file */
+ snprintf(filename, sizeof filename,"%s/%s",
+ ctdl_netout_dir,
+ mptr->remote_nodename);
+ lprintf(CTDL_DEBUG, "Appending to %s\n", filename);
+ fp = fopen(filename, "ab");
+ if (fp != NULL) {
+ fwrite(sermsg.ser,
+ sermsg.len, 1, fp);
+ fclose(fp);
+ }
+ else {
+ lprintf(CTDL_ERR, "%s: %s\n", filename, strerror(errno));
+ }
+
+ /* free the serialized version */
+ free(sermsg.ser);
- /* free the serialized version */
- free(sermsg.ser);