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/
/*
* pidgin
*
* Pidgin is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*
*/
#include "internal.h"
#include "gtkidle.h"
#ifdef HAVE_IOKIT
# include <CoreFoundation/CoreFoundation.h>
# include <IOKit/IOKitLib.h>
#else
# ifdef USE_SCREENSAVER
# ifdef _WIN32
# include "gtkwin32dep.h"
# else
/* We're on X11 and not MacOS X with IOKit. */
# include <X11/Xlib.h>
# include <X11/Xutil.h>
# include <X11/extensions/scrnsaver.h>
# include <gdk/gdkx.h>
# endif /* !_WIN32 */
# endif /* USE_SCREENSAVER */
#endif /* !HAVE_IOKIT */
#include "idle.h"
/**
* Get the number of seconds the user has been idle. In Unix-world
* this is based on the X Windows usage. In MS Windows this is
* based on keyboard/mouse usage information obtained from the OS.
* In MacOS X, this is based on keyboard/mouse usage information
* obtained from the OS, if configure detected IOKit. Otherwise,
* MacOS X is handled as a case of X Windows.
*
* In Debian bug #271639, jwz says:
*
* Purple should simply ask xscreensaver how long the user has been idle:
* % xscreensaver-command -time
* XScreenSaver 4.18: screen blanked since Tue Sep 14 14:10:45 2004
*
* Or you can monitor the _SCREENSAVER_STATUS property on root window #0.
* Element 0 is the status (0, BLANK, LOCK), element 1 is the time_t since
* the last state change, and subsequent elements are which hack is running
* on the various screens:
* % xprop -f _SCREENSAVER_STATUS 32ac -root _SCREENSAVER_STATUS
* _SCREENSAVER_STATUS(INTEGER) = BLANK, 1095196626, 10, 237
*
* See watch() in xscreensaver/driver/xscreensaver-command.c.
*
* @return The number of seconds the user has been idle.
*/
#if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT)
static time_t
pidgin_get_time_idle(void)
{
# ifdef HAVE_IOKIT
/* Query the IOKit API */
static io_service_t macIOsrvc = NULL;
CFTypeRef property;
uint64_t idle_time = 0; /* nanoseconds */
if (macIOsrvc == NULL)
{
mach_port_t master;
IOMasterPort(MACH_PORT_NULL, &master);
macIOsrvc = IOServiceGetMatchingService(master,
IOServiceMatching("IOHIDSystem"));
}
property = IORegistryEntryCreateCFProperty(macIOsrvc, CFSTR("HIDIdleTime"),
kCFAllocatorDefault, 0);
CFNumberGetValue((CFNumberRef)property,
kCFNumberSInt64Type, &idle_time);
CFRelease(property);
/* convert nanoseconds to seconds */
return idle_time / 1000000000;
# else
# ifdef _WIN32
/* Query Windows */
return (GetTickCount() - winpidgin_get_lastactive()) / 1000;
# else
/* We're on X11 and not MacOS X with IOKit. */
/* Query xscreensaver */
static XScreenSaverInfo *mit_info = NULL;
static int has_extension = -1;
int event_base, error_base;
if (has_extension == -1)
has_extension = XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, &error_base);
if (has_extension)
{
if (mit_info == NULL)
mit_info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), mit_info);
return (mit_info->idle) / 1000;
}
else
return 0;
# endif /* !_WIN32 */
# endif /* !HAVE_IOKIT */
}
#endif /* USE_SCREENSAVER || HAVE_IOKIT */
static PurpleIdleUiOps ui_ops =
{
#if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT)
pidgin_get_time_idle,
#else
NULL,
#endif /* USE_SCREENSAVER || HAVE_IOKIT */
NULL,
NULL,
NULL,
NULL
};
PurpleIdleUiOps *
pidgin_idle_get_ui_ops()
{
return &ui_ops;
}