Permalink
Commits on Aug 18, 2014
  1. XQuartz: Advertise GLX_ARB_create_context and GLX_ARB_create_context_…

    jeremyhu committed Jun 1, 2014
    …profile
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
  2. fb: Revert fb changes that broke XQuartz

    jeremyhu committed May 31, 2014
        http://bugs.freedesktop.org/show_bug.cgi?id=26124
    
    Revert "Use new pixman_glyph_cache_t API that will be in pixman 0.28.0"
    Revert "fb: Fix origin of source picture in fbGlyphs"
    
    This reverts commit 9cbcb5b.
    This reverts commit 983e303.
  3. fb: Revert fb changes that broke XQuartz

    jeremyhu committed Feb 13, 2010
    http://bugs.freedesktop.org/show_bug.cgi?id=26124
    
    Revert "Fix source pictures getting random transforms after 2d6a8f6."
    Revert "fb: Adjust transform or composite coordinates for pixman operations"
    
    http://bugs.freedesktop.org/26124
    
    This reverts commit a72c65e.
    This reverts commit a6bd5d2.
    
    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
  4. Use old miTrapezoids and miTriangles routines

    jeremyhu committed Nov 2, 2013
    Reverts commits:
        788ccb9
        566f193
    
    http://xquartz.macosforge.org/trac/ticket/525
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
  5. Workaround the GC clipping problem in miPaintWindow and add some debu…

    jeremyhu committed Apr 30, 2010
    …gging output.
    
    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
  6. sdksyms.sh: Use CPPFLAGS, not CFLAGS

    jeremyhu committed Jan 13, 2012
    CFLAGS can include flags which are not useful to the preprocessor
    or can even cause it to fail.  This fixes a build issue on darwin
    when building for more than one architecture.
    
    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
    Reviewed-by: Keith Packard <keithp@keithp.com>
Commits on Aug 11, 2014
  1. XQuartz: Better support turning off "Displays have separate Spaces" o…

    jeremyhu committed Aug 11, 2014
    …n OS X Mavericks
    
    http://xquartz.macosforge.org/trac/ticket/1876
    
    Follow-up to: 1c10b37
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
    (cherry picked from commit ab32ee3)
  2. ListenOnOpenFD: Remove Resets since this is intended to be for hotplu…

    jeremyhu committed Jul 23, 2014
    …gging connections
    
    pharris says that the resets should not be done in the hotplugging case.
    
    This may fix a crash reported against XQuartz:
    http://xquartz.macosforge.org/trac/ticket/869
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
    Reviewed-by: Peter Harris <pharris@opentext.com>
    (cherry picked from commit dfbc6a1)
Commits on Jun 27, 2014
  1. Bump version to 1.15.2

    whot committed Jun 27, 2014
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Commits on Jun 26, 2014
  1. Xi: block SIGIOs while copying device classes around

    stevenjm authored and whot committed May 18, 2014
    I've been seeing sporadic (anywhere from once every few days to 3-4
    times a day) crashes and freezes in X. The problematic behaviour isn't
    always the same, but I chose a particular incident to debug, and found
    that X was segfaulting in updateMotionHistory, on line 575 of
    dix/getevents.c.
    
    After some further investigation, I found that the bug was being
    triggered when a SIGIO was received in DeepCopyPointerClasses, between
    the AllocValuatorClass call (line 540) and updating the to->valuator
    pointer (line 545). AllocValuatorClass calls realloc() on to->valuator,
    so between these lines, it's not guaranteed to point to allocated
    memory.
    
    It seems the SIGIO handler is calling updateMotionHistory, which is
    reading the memory pointed to by to->valuator and getting a wrong value
    for last_motion, which updates buff to point to wildly the wrong place
    and thus generates a segfault when a memcpy() is done into buff.
    
    I am attaching a patch which I've been running on that machine for the
    past three days, and haven't yet observed any more crashing or freezing
    behaviour. The patch simply calls OsBlockSIGIO while
    DeepCopyDeviceClasses is in progress, as the state of the X server's
    device data structures is not guaranteed to be in a consistent state
    during that time.
    
    Debian bug#744303 <https://bugs.debian.org/744303>
    
    Signed-off-by: Julien Cristau <jcristau@debian.org>
    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit d7a2df0)
  2. Fix overflow checking extension versions

    robert-ancell authored and whot committed May 21, 2014
    The easiest way to check for the version of an extension is to send the maximum
    possible version numbers in the QueryVersion request. The X server overflows on
    these as it assumes you will send a reasonable version number.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit 548fc93)
  3. man: drop specific mention of DontZap in -retro (#71113)

    whot committed May 24, 2014
    DontZap off is the default anyway, don't mention it specifically to avoid
    confusion
    
    X.Org Bug 71113 <http://bugs.freedesktop.org/show_bug.cgi?id=71113>
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit cfaf2ab)
  4. xfree86: fix wrong DontZap documentation (#71113)

    whot committed May 24, 2014
    X.Org Bug 71113 <http://bugs.freedesktop.org/show_bug.cgi?id=71113>
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit e48a132)
Commits on Jun 23, 2014
Commits on Jun 1, 2014
  1. XQuartz: Update logic to account for title bar on every display in Ma…

    jeremyhu committed Jun 1, 2014
    …vericks
    
    <rdar://problem/14205847>
    http://xquartz.macosforge.org/trac/ticket/832
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
    (cherry picked from commit 1c10b37)
  2. XQuartz: Dead code removal (ENABLE_DEBUG_LOG)

    jeremyhu committed Jun 1, 2014
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
    (cherry picked from commit ad0ff64)
  3. XQuartz: Bump to 2.7.7

    jeremyhu committed May 31, 2014
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
    (cherry picked from commit e281288)
  4. fb: Fix origin of source picture in fbGlyphs

    peterh authored and jeremyhu committed Apr 11, 2014
    If a source picture doesn't repeat and a mask format is specified, the
    incorrect calulation of the origin of the glyphs caused the glyphs to
    not be drawn at all.
    
    Noticed when running gtk-demo from RHEL 6.5 and selecting "Rotated
    Text".
    
    Signed-off-by: Peter Harris <pharris@opentext.com>
    Reviewed-by: Keith Packard <keithp@keithp.com>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    
    /* Test for this bug
    
    cc -std=c99 -o glyph glyph.c `pkg-config --cflags --libs xcb-render`
    
    */
    
    // 16 x 16 pictfmt_a8 "glyph"
    static const char glyph[] = {
        0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff,
        0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0,
        0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0, 0,
        0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0,
        0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0xff, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0xff, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0,
        0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0,
        0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0, 0,
        0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0,
        0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff,
    };
    
    static struct {
        uint8_t len;
        uint8_t pad[3];
        uint16_t deltax, deltay;
        uint8_t glyph;
        uint8_t pad2[3];
    } elt = { len:1, glyph:1, deltax:WIN_SIZE/2 - GLYPH_SIZE/2, deltay:WIN_SIZE/2 - GLYPH_SIZE/2 };
    
    int main(int argc, char *argv[])
    {
        int screen;
        xcb_connection_t *c = xcb_connect(NULL, &screen);
        if (!c || xcb_connection_has_error(c)) {
    	fprintf(stderr, "Cannot open default display \"%s\"\n", getenv("DISPLAY"));
    	return EXIT_FAILURE;
        }
    
        // Find root window and depth
        const xcb_setup_t *setup = xcb_get_setup(c);
        if (screen >= setup->roots_len)
    	screen = 0;
        xcb_screen_iterator_t si = xcb_setup_roots_iterator(setup);
        for (int i=0; i < screen; i++)
    	xcb_screen_next(&si);
        xcb_window_t root = si.data->root;
        uint8_t depth = si.data->root_depth;
        xcb_visualid_t visual = si.data->root_visual;
    
        // Find picture formats
        xcb_render_query_pict_formats_reply_t *qpf;
        qpf = xcb_render_query_pict_formats_reply(c, xcb_render_query_pict_formats(c), NULL);
        if (!qpf) {
    	fprintf(stderr, "Cannot query RENDER picture formats\n");
    	return EXIT_FAILURE;
        }
        xcb_render_pictformat_t fmt_a8 = 0;
        xcb_render_pictforminfo_iterator_t pfi =
            xcb_render_query_pict_formats_formats_iterator(qpf);
        for (int i = 0; i < xcb_render_query_pict_formats_formats_length(qpf); i++) {
    
            if (pfi.data->depth == 8 &&
                    pfi.data->type == XCB_RENDER_PICT_TYPE_DIRECT &&
                    pfi.data->direct.alpha_mask == 0xFF) {
                fmt_a8 = pfi.data->id;
                break;
            }
            xcb_render_pictforminfo_next(&pfi);
        }
        if (!fmt_a8) {
    	fprintf(stderr, "Cannot find a8 RENDER picture format\n");
    	return EXIT_FAILURE;
        }
    
        xcb_render_pictformat_t fmt_visual = 0;
        xcb_render_pictscreen_iterator_t psi =
            xcb_render_query_pict_formats_screens_iterator(qpf);
        for (int i = 0; i < xcb_render_query_pict_formats_screens_length(qpf); i++) {
            xcb_render_pictdepth_iterator_t pdi =
                xcb_render_pictscreen_depths_iterator(psi.data);
            for (int j = 0; i < xcb_render_pictscreen_depths_length(psi.data); i++) {
                xcb_render_pictvisual_iterator_t pvi =
                    xcb_render_pictdepth_visuals_iterator(pdi.data);
                for (int k = 0; k < xcb_render_pictdepth_visuals_length(pdi.data); i++) {
                    if (pvi.data->visual == visual) {
                        fmt_visual = pvi.data->format;
                        goto found_visual;
                    }
                    xcb_render_pictvisual_next(&pvi);
                }
                xcb_render_pictdepth_next(&pdi);
            }
            xcb_render_pictscreen_next(&psi);
        }
    found_visual:
        if (!fmt_visual) {
    	fprintf(stderr, "Cannot find visual RENDER picture format\n");
    	return EXIT_FAILURE;
        }
    
        xcb_render_glyphset_t glyphset = xcb_generate_id(c);
        xcb_render_create_glyph_set(c, glyphset, fmt_a8);
        uint32_t glyph_ids[] = {1};
        xcb_render_add_glyphs(c, glyphset, 1, glyph_ids,
                &(xcb_render_glyphinfo_t){width:GLYPH_SIZE, height:GLYPH_SIZE}, sizeof(glyph), glyph);
    
        // Create window, pixmap, and gc
        xcb_window_t window = xcb_generate_id(c);
        uint32_t list[] = { si.data->black_pixel, XCB_EVENT_MASK_EXPOSURE };
        xcb_create_window(c, XCB_COPY_FROM_PARENT, window, root, 0, 0, WIN_SIZE, WIN_SIZE,
    	    0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT,
    	    XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK, list);
        xcb_map_window(c, window);
        xcb_render_picture_t winpic = xcb_generate_id(c);
        xcb_render_create_picture(c, winpic, window, fmt_visual, 0, NULL);
    
        xcb_pixmap_t pixmap = xcb_generate_id(c);
        xcb_create_pixmap(c, depth, pixmap, window, GLYPH_SIZE, GLYPH_SIZE);
        xcb_render_picture_t pixpic = xcb_generate_id(c);
        xcb_render_create_picture(c, pixpic, pixmap, fmt_visual, 0, NULL);
        xcb_render_fill_rectangles(c, XCB_RENDER_PICT_OP_SRC, pixpic,
                (xcb_render_color_t){green:0xFFFF, alpha:0xFFFF}, 1,
                &(xcb_rectangle_t){width:GLYPH_SIZE, height:GLYPH_SIZE} );
    
        xcb_flush(c);
        for (xcb_generic_event_t *ev = xcb_wait_for_event(c); ev; ev = xcb_wait_for_event(c)) {
    	int type = ev->response_type;
    	free(ev);
    	if (type == XCB_EXPOSE) {
                xcb_clear_area(c, 0, window, 0, 0, 0, 0);
                xcb_render_composite_glyphs_8(c, XCB_RENDER_PICT_OP_SRC, pixpic, winpic, fmt_a8,
                        glyphset, 0, 0, sizeof(elt), (uint8_t *)&elt);
                xcb_flush(c);
            }
        }
    
        return EXIT_SUCCESS;
    }
    
    (cherry picked from commit 983e303)
Commits on Apr 15, 2014
  1. XQuartz: Ensure we wait for the server thread to terminate

    jeremyhu authored and marcoz001 committed Apr 6, 2014
    AKA: XQuartz 2.7.5 doesn't delete its /tmp/.X$d-lock
    
    http://xquartz.macosforge.org/trac/ticket/823
    
    Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
Commits on Apr 14, 2014
  1. Bump version to 1.15.1

    marcoz001 committed Apr 14, 2014
Commits on Apr 12, 2014
  1. glx: Clear new FBConfig attributes to 0 by default.

    anholt authored and marcoz001 committed Mar 7, 2014
    The visualSelectGroup wasn't getting set (since our DRI drivers don't
    use it), and and since it's the top priority in the sort order, you
    got random sorting of your visuals unless malloc really returned you
    new memory.  This manifested as Xephyr -glamor rendering to a
    multisampled window on my system, which as you might guess was
    slightly lower performance than expected.
    
    Signed-off-by: Eric Anholt <eric@anholt.net>
    Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Commits on Apr 8, 2014
  1. Xephyr: restore initial window resize lost in xcb conversion

    Julien Cristau authored and marcoz001 committed Mar 26, 2014
    The XResizeWindow call wasn't replaced by the xcb equivalent, so we
    were no longer setting the initial window size, only wm size hints.
    
    Regression from commit a2b73da "Xephyr: start converting hostx.c over to
    xcb"
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74849
    
    Signed-off-by: Julien Cristau <jcristau@debian.org>
    Reported-by: Laércio de Sousa <lbsousajr@gmail.com>
    Tested-by: Jon TURNEY <jon.turney@dronecode.org.uk>
    Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
    Signed-off-by: Keith Packard <keithp@keithp.com>
Commits on Mar 22, 2014
  1. Bump bersion to 1.15.0.901

    marcoz001 committed Mar 22, 2014
Commits on Mar 12, 2014
  1. config: search for PnPID on all parents (#75513)

    whot committed Feb 25, 2014
    The PnPID for a device may not be on the immediate parent, so search up the
    device tree until we find one.
    
    X.Org Bug 75513 <http://bugs.freedesktop.org/show_bug.cgi?id=75513>
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Tested-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
    (cherry picked from commit 7950664)
  2. Xi: check for invalid modifiers for XI2 passive grabs

    whot committed Feb 20, 2014
    The other values are checked correctly, but if a modifier was outside the
    allowed range, it would go unnoticed and cause a out-of-bounds read error for
    any mask equal or larger than 256. The DetailRec where we store the grab masks
    is only sized to 8 * sizeof(Mask).
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    (cherry picked from commit 0f10cfd)
  3. sync: Avoid ridiculously long timeouts

    Mark Kettenis authored and whot committed Dec 15, 2013
    On OpenBSD, passing a timeout longer than 100000000 seconds to select(2) will
    make it fail with EINVAL.  As this is original 4.4BSD behaviour it is not
    inconceivable that other systems suffer from the same problem.  And Linux,
    though not suffering from any 4.4BSD heritage, briefly did something similar:
    
    <https://lkml.org/lkml/2012/8/31/263>
    
    So avoid calling AdjustWaitForDelay() instead of setting the timeout to
    (effectively) ULONG_MAX milliseconds.
    
    Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
    Reviewed-by: Matthieu Herrb <matthieu@herrb.eu>
    (cherry picked from commit ddeca92)
Commits on Mar 7, 2014
  1. Merge branch 'server-1.15-branch' of git://people.freedesktop.org/~je…

    marcoz001 committed Mar 7, 2014
    …remyhu/xserver into server-1.15-branch
Commits on Feb 19, 2014
  1. dix: prevent a driver from initializing or submitting buttons > MAX_B…

    whot committed Jan 24, 2014
    …UTTONS
    
    The server internally relies on arrays with a MAX_BUTTONS maximum size (which
    is the max the core protocol can transport). Make sure a driver adheres to
    that.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
    (cherry picked from commit 87ca80a)
  2. xf86DeleteScreen: move check for NULL pScrn before first dereference

    alanc authored and whot committed Jan 29, 2014
    Flagged by cppcheck 1.62:
    [hw/xfree86/common/xf86Helper.c:220] -> [hw/xfree86/common/xf86Helper.c:231]:
     (warning) Possible null pointer dereference: pScrn - otherwise it is
     redundant to check it against null.
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit c1ac89c)
  3. On realloc failure, free font_path_string instead of leaking it

    alanc authored and whot committed Jan 29, 2014
    Flagged by cppcheck 1.62:
    [dix/dixfonts.c:1792]: (error) Common realloc mistake:
     'font_path_string' nulled but not freed upon failure
    
    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit e6733ae)
  4. Check for calloc() failure in add_master()

    alanc authored and whot committed Jan 25, 2014
    Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit 9fc1916)
  5. Xi: fix modifier offset in XIPassiveGrab swapping function

    whot committed Jan 24, 2014
    The request is followed by mask_len 4-byte units, then followed by the actual
    modifiers.
    
    Also fix up the swapping test, which had the same issue.
    
    Reported-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
    (cherry picked from commit 76b3be7)
    
    Conflicts:
    	test/xi2/protocol-xipassivegrabdevice.c
  6. os: restrict display names to digits

    whot committed Jan 13, 2014
    We call atoi() on the server's display to get the socket but otherwise use the
    unmodified display for log file name, xkb paths, etc. This results in
    Xorg :banana being the equivalent of Xorg :0, except for the log files being
    in /var/log/Xorg.banana.log. I'm not sure there's a good use-case for this
    behaviour.
    
    Check the display for something that looks reasonable, i.e. digits only, but
    do allow for :0.0 (i.e. digits, followed by a period, followed by one or two
    digits).
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit 71baa46)
  7. Xi: Ensure DeviceChanged is emitted after grabs are deactivated

    garnacho authored and whot committed Jan 2, 2014
    When a grab on a slave device is deactivated, the master device must
    be checked, just in case there were events from other devices while
    the slave device was stolen away by the passive grab. This may
    introduce misbehaviors on mismatching valuators and device features
    later on UpdateDeviceState().
    
    Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    (cherry picked from commit b2d5ee2)
Commits on Feb 13, 2014
  1. dix: fix button state check before changing a button mapping

    whot committed Jan 24, 2014
    dev->button->down is a bitmask, not a normal array. Use the helper function to
    check, we technically allow the mapping to change after the physical button
    has been pressed (but not yet processed yet), so only check BUTTON_PROCESSED.
    
    From XSetPointerMapping(3):
    "If any of the buttons to be altered are logically in the down state,
    XSetPointerMapping returns MappingBusy, and the mapping is not changed."
    
    Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
    (cherry picked from commit 25d1046)