1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

"/bookmark add foo" crash - fix

A user providing an invalid JID when creating a new bookmark (like 'foo')
would reproducibly crash/segfault profanity, as it insists on checking
string length behind the @ of the JID. However, it could be NULL
if the user accidentally omitted it.
The patch avoids the crash by NULL-checking and prevents
getting there in the first place by checking the argument to "add".
Backtrace of unpatched profanity with above command:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x00007fff85699732 in strlen ()
(gdb) bt
 #0  0x00007fff85699732 in strlen ()
 #1  0x00000001000965d2 in xmpp_strdup ()
 #2  0x0000000100095d6d in xmpp_stanza_set_attribute ()
 #3  0x0000000100011c5c in _send_bookmarks ()
 #4  0x00000001000115a8 in _bookmark_add ()
 #5  0x000000010003320d in cmd_bookmark ()
 #6  0x000000010002a0f2 in cmd_execute ()
 #7  0x0000000100003a1d in process_input ()
 #8  0x00000001000037c7 in prof_run ()
 #9  0x0000000100045032 in main ()
(gdb)
This commit is contained in:
Jan Hacker 2014-08-17 22:22:12 +02:00
parent 225312802e
commit e87eb4c40e
2 changed files with 11 additions and 5 deletions

View File

@ -1865,11 +1865,15 @@ cmd_bookmark(gchar **args, struct cmd_help_t help)
}
if (strcmp(cmd, "add") == 0) {
gboolean added = bookmark_add(jid, nick, password, autojoin);
if (added) {
cons_show("Bookmark added for %s.", jid);
if (strchr(jid, '@')==NULL) {
cons_show("Can't add bookmark with JID '%s'; should be '%s@domain.tld'", jid, jid);
} else {
cons_show("Bookmark already exists, use /bookmark update to edit.");
gboolean added = bookmark_add(jid, nick, password, autojoin);
if (added) {
cons_show("Bookmark added for %s.", jid);
} else {
cons_show("Bookmark already exists, use /bookmark update to edit.");
}
}
} else if (strcmp(cmd, "update") == 0) {
gboolean updated = bookmark_update(jid, nick, password, autojoin);

View File

@ -422,7 +422,9 @@ _send_bookmarks(void)
xmpp_stanza_set_attribute(conference, STANZA_ATTR_JID, bookmark->jid);
Jid *jidp = jid_create(bookmark->jid);
xmpp_stanza_set_attribute(conference, STANZA_ATTR_NAME, jidp->localpart);
if (jidp->localpart != NULL) {
xmpp_stanza_set_attribute(conference, STANZA_ATTR_NAME, jidp->localpart);
}
jid_destroy(jidp);
if (bookmark->autojoin) {