pidgin/pidgin

Add fuzzing support for some libpurple features
release-2.x.y
2021-06-24, Jordy Zomer <>
97c51d97d375
Add fuzzing support for some libpurple features

Testing Done:
Hi!

I built and tested all of these fuzzers for libpurple.

You can build them by first building pidgin/libpurple with `--enable-fuzzing` then going into `libpurple/tests` and run `make check`. After that you can run these fuzzers. With a dictionary if you want :)

for example:
```bash
$ ./fuzz_markup_strip_html -dict=dictionaries/html.dict
Dictionary: 465 entries
INFO: Seed: 2274862685
INFO: Loaded 1 modules (3 inline 8-bit counters): 3 [0x5a4ec0, 0x5a4ec3),
INFO: Loaded 1 PC tables (3 PCs): 3 [0x568ee8,0x568f18),
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: A corpus is not provided, starting from an empty corpus
#2 INITED cov: 2 ft: 2 corp: 1/1b exec/s: 0 rss: 30Mb
#1048576 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 524288 rss: 789Mb
#2097152 pulse cov: 2 ft: 2 corp: 1/1b lim: 4096 exec/s: 524288 rss: 792Mb
```

Best Regards,

Jordy Zomer

Reviewed at https://reviews.imfreedom.org/r/760/
/** @page jabber-signals Jabber Signals
@signals
@signal jabber-receiving-iq
@signal jabber-receiving-message
@signal jabber-receiving-presence
@signal jabber-watched-iq
@signal jabber-register-namespace-watcher
@signal jabber-unregister-namespace-watcher
@signal jabber-sending-xmlnode
@signal jabber-receiving-xmlnode
@endsignals
<hr>
@signaldef jabber-receiving-iq
@signalproto
gboolean (*iq_received)(PurpleConnection *gc, const char *type, const char *id,
const char *from, xmlnode *iq);
@endsignalproto
@signaldesc
Emitted when an XMPP IQ stanza is received. Allows a plugin to process IQ
stanzas.
@param gc The connection on which the stanza is received
@param type The IQ type ('get', 'set', 'result', or 'error')
@param id The ID attribute from the stanza. MUST NOT be NULL.
@param from The originator of the stanza. MAY BE NULL if the stanza
originated from the user's server.
@param iq The full stanza received.
@return TRUE if the plugin processed this stanza and *nobody else* should
process it. FALSE otherwise.
@endsignaldef
@signaldef jabber-receiving-message
@signalproto
gboolean (*message_received)(PurpleConnection *gc, const char *type,
const char *id, const char *from, const char *to,
xmlnode *message);
@endsignalproto
@signaldesc
Emitted when an XMPP message stanza is received. Allows a plugin to
process message stanzas.
@param gc The connection on which the stanza is received
@param type The message type (see rfc3921 or rfc3921bis)
@param id The ID attribute from the stanza. MAY BE NULL.
@param from The originator of the stanza. MAY BE NULL if the stanza
originated from the user's server.
@param to The destination of the stanza. This is probably either the
full JID of the receiver or the receiver's bare JID.
@param message The full stanza received.
@return TRUE if the plugin processed this stanza and *nobody else* should
process it. FALSE otherwise.
@endsignaldef
@signaldef jabber-receiving-presence
@signalproto
gboolean (*presence_received)(PurpleConnection *gc, const char *type,
const char *from, xmlnode *presence);
@endsignalproto
@signaldesc
Emitted when an XMPP presence stanza is received. Allows a plugin to process
presence stanzas.
@param gc The connection on which the stanza is received
@param type The presence type (see rfc3921 or rfc3921bis). NULL indicates
this is an "available" (i.e. online) presence.
@param from The originator of the stanza. MAY BE NULL if the stanza
originated from the user's server.
@param presence The full stanza received.
@return TRUE if the plugin processed this stanza and *nobody else* should
process it. FALSE otherwise.
@endsignaldef
@signaldef jabber-watched-iq
@signalproto
gboolean (*watched_iq)(PurpleConnection *gc, const char *type, const char *id,
const char *from, xmlnode *child);
@endsignalproto
@signaldesc
Emitted when an IQ with a watched (child, namespace) pair is received. See
jabber-register-namespace-watcher and jabber-unregister-namespace-watcher.
@param gc The connection on which the stanza is received
@param type The IQ type ('get', 'set', 'result', or 'error')
@param id The ID attribute from the stanza. MUST NOT be NULL.
@param from The originator of the stanza. MAY BE NULL if the stanza
originated from the user's server.
@param child The child node with namespace.
@return TRUE if the plugin processed this stanza and *nobody else* should
process it. FALSE otherwise.
@endsignaldef
@signaldef jabber-register-namespace-watcher
@signalproto
void (register_namespace_watcher)(const char *node, const char *namespace);
@endsignalproto
@signaldesc
Emit this signal to register your desire to have specific IQ stanzas to be
emitted via the jabber-watched-iq signal when received.
@param node The IQ child name to longer watch.
@param namespace The IQ child namespace to longer watch.
@endsignaldef
@signaldef jabber-unregister-namespace-watcher
@signalproto
void (unregister_namespace_watcher)(const char *node, const char *namespace);
@endsignalproto
@signaldesc
Emit this signal to unregister your desire to have specific IQ stanzas to be
emitted via the jabber-watched-iq signal when received.
@param node The IQ child name to no longer watch.
@param namespace The IQ child namespace to no longer watch.
@endsignaldef
@signaldef jabber-sending-xmlnode
@signalproto
void (sending_xmlnode)(PurpleConnection *gc, xmlnode **stanza);
@endsignalproto
@signaldesc
Emit this signal (@c purple_signal_emit) to send a stanza. It is preferred
to use this instead of prpl_info->send_raw.
@param gc The connection on which to send the stanza.
@param stanza The stanza to send. If stanza is not NULL after being sent,
the emitter should free it.
@endsignaldef
@signaldef jabber-receiving-xmlnode
@signalproto
void (receiving_xmlnode)(PurpleConnection *gc, xmlnode **stanza);
@endsignalproto
@signaldesc
Emitted when an XMPP stanza is received. Allows a plugin to process any
stanza.
@param gc The connection on which the stanza was received.
@param stanza The received stanza. Set stanza to NULL (and free it) to
stop processing the stanza.
@endsignaldef
*/
// vim: syntax=c.doxygen tw=75 et