[Glibc-bsd-commits] r2909 - in trunk/freebsd-libs/debian: . patches

Aurelien Jarno aurel32 at alioth.debian.org
Fri Jan 8 00:08:18 UTC 2010


Author: aurel32
Date: 2010-01-08 00:08:07 +0000 (Fri, 08 Jan 2010)
New Revision: 2909

Added:
   trunk/freebsd-libs/debian/patches/13_libusb-update.diff
Modified:
   trunk/freebsd-libs/debian/changelog
   trunk/freebsd-libs/debian/patches/series
Log:
  * Add patches/13_libusb-update.diff from upstream to update the API.



Modified: trunk/freebsd-libs/debian/changelog
===================================================================
--- trunk/freebsd-libs/debian/changelog	2010-01-07 23:21:33 UTC (rev 2908)
+++ trunk/freebsd-libs/debian/changelog	2010-01-08 00:08:07 UTC (rev 2909)
@@ -2,8 +2,9 @@
 
   * libusb2-dev: add a libusb-1.0.so -> libusb.so symlink to make
     configure scripts happy.
+  * Add patches/13_libusb-update.diff from upstream to update the API.
 
- -- Aurelien Jarno <aurel32 at debian.org>  Fri, 08 Jan 2010 00:21:20 +0100
+ -- Aurelien Jarno <aurel32 at debian.org>  Fri, 08 Jan 2010 01:07:39 +0100
 
 freebsd-libs (8.0-3) unstable; urgency=low
 

Added: trunk/freebsd-libs/debian/patches/13_libusb-update.diff
===================================================================
--- trunk/freebsd-libs/debian/patches/13_libusb-update.diff	                        (rev 0)
+++ trunk/freebsd-libs/debian/patches/13_libusb-update.diff	2010-01-08 00:08:07 UTC (rev 2909)
@@ -0,0 +1,549 @@
+r199055 | thompsa | 2009-11-08 21:03:52 +0100 (dim. 08 nov. 2009) | 12 lignes
+
+- fix refcounting error during data transfer
+- fix a memory leak on the USB backend
+- fix invalid pointer computations (in one case memory outside the allocated
+  area was written in LibUSB v1.0)
+- make sure memory is always initialised, also in failing cases
+- add missing functions from v1.0.4
+
+PR:             usb/140325
+Reported by:    Robert Jenssen
+Submitted by:   Hans Petter Selasky
+MFC After:      3 days
+
+--- a/lib/libusb/libusb20_ugen20.c
++++ b/lib/libusb/libusb20_ugen20.c
+@@ -449,6 +449,8 @@
+ 	uint16_t len;
+ 	int error;
+ 
++	/* make sure memory is initialised */
++	memset(&cdesc, 0, sizeof(cdesc));
+ 	memset(&gen_desc, 0, sizeof(gen_desc));
+ 
+ 	gen_desc.ugd_data = &cdesc;
+@@ -468,6 +470,10 @@
+ 	if (!ptr) {
+ 		return (LIBUSB20_ERROR_NO_MEM);
+ 	}
++
++	/* make sure memory is initialised */
++	memset(ptr, 0, len);
++
+ 	gen_desc.ugd_data = ptr;
+ 	gen_desc.ugd_maxlen = len;
+ 
+--- a/lib/libusb/libusb10_io.c
++++ b/lib/libusb/libusb10_io.c
+@@ -32,6 +32,7 @@
+ #include <time.h>
+ #include <errno.h>
+ #include <sys/queue.h>
++#include <sys/endian.h>
+ 
+ #include "libusb20.h"
+ #include "libusb20_desc.h"
+@@ -148,19 +149,19 @@
+ 		goto do_done;
+ 	}
+ 	for (i = 0; i != nfds; i++) {
+-		if (fds[i].revents == 0)
+-			continue;
+ 		if (ppdev[i] != NULL) {
+ 			dev = libusb_get_device(ppdev[i]);
+ 
+-			err = libusb20_dev_process(ppdev[i]);
++			if (fds[i].revents == 0)
++				err = 0;	/* nothing to do */
++			else
++				err = libusb20_dev_process(ppdev[i]);
++
+ 			if (err) {
+ 				/* cancel all transfers - device is gone */
+ 				libusb10_cancel_all_transfer(dev);
+-				/*
+-				 * make sure we don't go into an infinite
+-				 * loop
+-				 */
++
++				/* remove USB device from polling loop */
+ 				libusb10_remove_pollfd(dev->ctx, &dev->dev_poll);
+ 			}
+ 			CTX_UNLOCK(ctx);
+@@ -573,3 +574,160 @@
+ 	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer leave");
+ 	return (ret);
+ }
++
++uint8_t *
++libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index)
++{
++	uint8_t *ptr;
++	uint32_t n;
++
++	if (transfer->num_iso_packets < 0)
++		return (NULL);
++
++	if (index >= (uint32_t)transfer->num_iso_packets)
++		return (NULL);
++
++	ptr = transfer->buffer;
++	if (ptr == NULL)
++		return (NULL);
++
++	for (n = 0; n != index; n++) {
++		ptr += transfer->iso_packet_desc[n].length;
++	}
++	return (ptr);
++}
++
++uint8_t *
++libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index)
++{
++	uint8_t *ptr;
++
++	if (transfer->num_iso_packets < 0)
++		return (NULL);
++
++	if (index >= (uint32_t)transfer->num_iso_packets)
++		return (NULL);
++
++	ptr = transfer->buffer;
++	if (ptr == NULL)
++		return (NULL);
++
++	ptr += transfer->iso_packet_desc[0].length * index;
++
++	return (ptr);
++}
++
++void
++libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length)
++{
++	int n;
++
++	if (transfer->num_iso_packets < 0)
++		return;
++
++	for (n = 0; n != transfer->num_iso_packets; n++)
++		transfer->iso_packet_desc[n].length = length;
++}
++
++uint8_t *
++libusb_control_transfer_get_data(struct libusb_transfer *transfer)
++{
++	if (transfer->buffer == NULL)
++		return (NULL);
++
++	return (transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE);
++}
++
++struct libusb_control_setup *
++libusb_control_transfer_get_setup(struct libusb_transfer *transfer)
++{
++	return ((struct libusb_control_setup *)transfer->buffer);
++}
++
++void
++libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType,
++    uint8_t bRequest, uint16_t wValue,
++    uint16_t wIndex, uint16_t wLength)
++{
++	struct libusb_control_setup *req = (struct libusb_control_setup *)buf;
++
++	/* The alignment is OK for all fields below. */
++	req->bmRequestType = bmRequestType;
++	req->bRequest = bRequest;
++	req->wValue = htole16(wValue);
++	req->wIndex = htole16(wIndex);
++	req->wLength = htole16(wLength);
++}
++
++void
++libusb_fill_control_transfer(struct libusb_transfer *transfer, 
++    libusb_device_handle *devh, uint8_t *buf,
++    libusb_transfer_cb_fn callback, void *user_data,
++    uint32_t timeout)
++{
++	struct libusb_control_setup *setup = (struct libusb_control_setup *)buf;
++
++	transfer->dev_handle = devh;
++	transfer->endpoint = 0;
++	transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL;
++	transfer->timeout = timeout;
++	transfer->buffer = buf;
++	if (setup != NULL)
++		transfer->length = LIBUSB_CONTROL_SETUP_SIZE
++			+ le16toh(setup->wLength);
++	else
++		transfer->length = 0;
++	transfer->user_data = user_data;
++	transfer->callback = callback;
++
++}
++
++void
++libusb_fill_bulk_transfer(struct libusb_transfer *transfer, 
++    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, 
++    int length, libusb_transfer_cb_fn callback, void *user_data,
++    uint32_t timeout)
++{
++	transfer->dev_handle = devh;
++	transfer->endpoint = endpoint;
++	transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
++	transfer->timeout = timeout;
++	transfer->buffer = buf;
++	transfer->length = length;
++	transfer->user_data = user_data;
++	transfer->callback = callback;
++}
++
++void
++libusb_fill_interrupt_transfer(struct libusb_transfer *transfer,
++    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf,
++    int length, libusb_transfer_cb_fn callback, void *user_data,
++    uint32_t timeout)
++{
++	transfer->dev_handle = devh;
++	transfer->endpoint = endpoint;
++	transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT;
++	transfer->timeout = timeout;
++	transfer->buffer = buf;
++	transfer->length = length;
++	transfer->user_data = user_data;
++	transfer->callback = callback;
++}
++
++void
++libusb_fill_iso_transfer(struct libusb_transfer *transfer, 
++    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf,
++    int length, int npacket, libusb_transfer_cb_fn callback,
++    void *user_data, uint32_t timeout)
++{
++	transfer->dev_handle = devh;
++	transfer->endpoint = endpoint;
++	transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS;
++	transfer->timeout = timeout;
++	transfer->buffer = buf;
++	transfer->length = length;
++	transfer->num_iso_packets = npacket;
++	transfer->user_data = user_data;
++	transfer->callback = callback;
++}
++
+--- a/lib/libusb/libusb10_desc.c
++++ b/lib/libusb/libusb10_desc.c
+@@ -35,6 +35,8 @@
+ #include "libusb.h"
+ #include "libusb10.h"
+ 
++#define	N_ALIGN(n) (-((-(n)) & (-8UL)))
++
+ /* USB descriptors */
+ 
+ int
+@@ -114,17 +116,17 @@
+ 
+ 	nalt = nif = pconf->num_interface;
+ 	nep = 0;
+-	nextra = pconf->extra.len;
++	nextra = N_ALIGN(pconf->extra.len);
+ 
+ 	for (i = 0; i < nif; i++) {
+ 
+ 		pinf = pconf->interface + i;
+-		nextra += pinf->extra.len;
++		nextra += N_ALIGN(pinf->extra.len);
+ 		nep += pinf->num_endpoints;
+ 		k = pinf->num_endpoints;
+ 		pend = pinf->endpoints;
+ 		while (k--) {
+-			nextra += pend->extra.len;
++			nextra += N_ALIGN(pend->extra.len);
+ 			pend++;
+ 		}
+ 
+@@ -132,12 +134,12 @@
+ 		nalt += pinf->num_altsetting;
+ 		pinf = pinf->altsetting;
+ 		while (j--) {
+-			nextra += pinf->extra.len;
++			nextra += N_ALIGN(pinf->extra.len);
+ 			nep += pinf->num_endpoints;
+ 			k = pinf->num_endpoints;
+ 			pend = pinf->endpoints;
+ 			while (k--) {
+-				nextra += pend->extra.len;
++				nextra += N_ALIGN(pend->extra.len);
+ 				pend++;
+ 			}
+ 			pinf++;
+@@ -150,17 +152,18 @@
+ 	    (nalt * sizeof(libusb_interface_descriptor)) +
+ 	    (nep * sizeof(libusb_endpoint_descriptor));
+ 
++	nextra = N_ALIGN(nextra);
++
+ 	pconfd = malloc(nextra);
+ 
+ 	if (pconfd == NULL) {
+ 		free(pconf);
+ 		return (LIBUSB_ERROR_NO_MEM);
+ 	}
+-	/* make sure memory is clean */
++	/* make sure memory is initialised */
+ 	memset(pconfd, 0, nextra);
+ 
+-	pconfd->interface = (libusb_interface *) (pconfd +
+-	    sizeof(libusb_config_descriptor));
++	pconfd->interface = (libusb_interface *) (pconfd + 1);
+ 
+ 	ifd = (libusb_interface_descriptor *) (pconfd->interface + nif);
+ 	endd = (libusb_endpoint_descriptor *) (ifd + nalt);
+@@ -181,7 +184,7 @@
+ 		pconfd->extra_length = pconf->extra.len;
+ 		pconfd->extra = pextra;
+ 		memcpy(pextra, pconf->extra.ptr, pconfd->extra_length);
+-		pextra += pconfd->extra_length;
++		pextra += N_ALIGN(pconfd->extra_length);
+ 	}
+ 	/* setup all interface and endpoint pointers */
+ 
+@@ -221,7 +224,7 @@
+ 				ifd->extra_length = pinf->extra.len;
+ 				ifd->extra = pextra;
+ 				memcpy(pextra, pinf->extra.ptr, pinf->extra.len);
+-				pextra += pinf->extra.len;
++				pextra += N_ALIGN(pinf->extra.len);
+ 			}
+ 			for (k = 0; k < pinf->num_endpoints; k++) {
+ 				pend = &pinf->endpoints[k];
+@@ -238,7 +241,7 @@
+ 					endd->extra_length = pend->extra.len;
+ 					endd->extra = pextra;
+ 					memcpy(pextra, pend->extra.ptr, pend->extra.len);
+-					pextra += pend->extra.len;
++					pextra += N_ALIGN(pend->extra.len);
+ 				}
+ 			}
+ 		}
+@@ -304,3 +307,12 @@
+ 
+ 	return (LIBUSB_ERROR_OTHER);
+ }
++
++int
++libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, 
++    uint8_t desc_index, uint8_t *data, int length)
++{
++	return (libusb_control_transfer(devh, LIBUSB_ENDPOINT_IN,
++	    LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data,
++	    length, 1000));
++}
+--- a/lib/libusb/libusb20_desc.c
++++ b/lib/libusb/libusb20_desc.c
+@@ -118,6 +118,9 @@
+ 	if (lub_config == NULL) {
+ 		return (NULL);		/* out of memory */
+ 	}
++	/* make sure memory is initialised */
++	memset(lub_config, 0, size);
++
+ 	lub_interface = (void *)(lub_config + 1);
+ 	lub_alt_interface = (void *)(lub_interface + niface_no_alt);
+ 	lub_endpoint = (void *)(lub_interface + niface);
+--- a/lib/libusb/libusb10.c
++++ b/lib/libusb/libusb10.c
+@@ -35,6 +35,7 @@
+ #include <sys/ioctl.h>
+ #include <sys/filio.h>
+ #include <sys/queue.h>
++#include <sys/endian.h>
+ 
+ #include "libusb20.h"
+ #include "libusb20_desc.h"
+@@ -185,8 +186,6 @@
+ 	/* create libusb v1.0 compliant devices */
+ 	i = 0;
+ 	while ((pdev = libusb20_be_device_foreach(usb_backend, NULL))) {
+-		/* get device into libUSB v1.0 list */
+-		libusb20_be_dequeue_device(usb_backend, pdev);
+ 
+ 		dev = malloc(sizeof(*dev));
+ 		if (dev == NULL) {
+@@ -199,6 +198,10 @@
+ 			libusb20_be_free(usb_backend);
+ 			return (LIBUSB_ERROR_NO_MEM);
+ 		}
++
++		/* get device into libUSB v1.0 list */
++		libusb20_be_dequeue_device(usb_backend, pdev);
++
+ 		memset(dev, 0, sizeof(*dev));
+ 
+ 		/* init transfer queues */
+@@ -416,6 +419,8 @@
+ 	libusb10_remove_pollfd(ctx, &dev->dev_poll);
+ 
+ 	libusb20_dev_close(pdev);
++
++	/* unref will free the "pdev" when the refcount reaches zero */
+ 	libusb_unref_device(dev);
+ 
+ 	/* make sure our event loop detects the closed device */
+@@ -1195,7 +1200,7 @@
+ 	struct libusb20_transfer *pxfer1;
+ 	struct libusb_super_transfer *sxfer;
+ 	struct libusb_device *dev;
+-	unsigned int endpoint;
++	uint32_t endpoint;
+ 	int err;
+ 
+ 	if (uxfer == NULL)
+@@ -1252,7 +1257,7 @@
+ 	struct libusb20_transfer *pxfer1;
+ 	struct libusb_super_transfer *sxfer;
+ 	struct libusb_device *dev;
+-	unsigned int endpoint;
++	uint32_t endpoint;
+ 
+ 	if (uxfer == NULL)
+ 		return (LIBUSB_ERROR_INVALID_PARAM);
+@@ -1312,3 +1317,16 @@
+ {
+ 	/* TODO */
+ }
++
++uint16_t
++libusb_cpu_to_le16(uint16_t x)
++{
++	return (htole16(x));
++}
++
++uint16_t
++libusb_le16_to_cpu(uint16_t x)
++{
++	return (le16toh(x));
++}
++
+--- a/lib/libusb/libusb20.c
++++ b/lib/libusb/libusb20.c
+@@ -630,6 +630,9 @@
+ 	struct LIBUSB20_CONTROL_SETUP_DECODED req;
+ 	int error;
+ 
++	/* make sure memory is initialised */
++	memset(ptr, 0, len);
++
+ 	if (len < 4) {
+ 		/* invalid length */
+ 		return (LIBUSB20_ERROR_INVALID_PARAM);
+@@ -1093,7 +1096,8 @@
+ 	if (pbe->methods->exit_backend) {
+ 		pbe->methods->exit_backend(pbe);
+ 	}
+-	return;
++	/* free backend */
++	free(pbe);
+ }
+ 
+ void
+@@ -1101,7 +1105,6 @@
+ {
+ 	pdev->beMethods = pbe->methods;	/* copy backend methods */
+ 	TAILQ_INSERT_TAIL(&(pbe->usb_devs), pdev, dev_entry);
+-	return;
+ }
+ 
+ void
+@@ -1109,5 +1112,4 @@
+     struct libusb20_device *pdev)
+ {
+ 	TAILQ_REMOVE(&(pbe->usb_devs), pdev, dev_entry);
+-	return;
+ }
+--- a/lib/libusb/libusb.h
++++ b/lib/libusb/libusb.h
+@@ -271,9 +271,11 @@
+ 	uint16_t wLength;
+ }	libusb_control_setup;
+ 
++#define	LIBUSB_CONTROL_SETUP_SIZE	8	/* bytes */
++
+ typedef struct libusb_iso_packet_descriptor {
+-	unsigned int length;
+-	unsigned int actual_length;
++	uint32_t length;
++	uint32_t actual_length;
+ 	enum libusb_transfer_status status;
+ }	libusb_iso_packet_descriptor __aligned(sizeof(void *));
+ 
+@@ -282,9 +284,9 @@
+ typedef struct libusb_transfer {
+ 	libusb_device_handle *dev_handle;
+ 	uint8_t	flags;
+-	unsigned int endpoint;
++	uint32_t endpoint;
+ 	uint8_t type;
+-	unsigned int timeout;
++	uint32_t timeout;
+ 	enum libusb_transfer_status status;
+ 	int	length;
+ 	int	actual_length;
+@@ -320,7 +322,7 @@
+ int	libusb_set_configuration(libusb_device_handle * devh, int configuration);
+ int	libusb_claim_interface(libusb_device_handle * devh, int interface_number);
+ int	libusb_release_interface(libusb_device_handle * devh, int interface_number);
+-int	libusb_reset_device(libusb_device_handle * dev);
++int	libusb_reset_device(libusb_device_handle * devh);
+ int 	libusb_kernel_driver_active(libusb_device_handle * devh, int interface);
+ int 	libusb_detach_kernel_driver(libusb_device_handle * devh, int interface);
+ int 	libusb_attach_kernel_driver(libusb_device_handle * devh, int interface);
+@@ -333,7 +335,8 @@
+ int	libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config);
+ int	libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config);
+ void	libusb_free_config_descriptor(struct libusb_config_descriptor *config);
+-int	libusb_get_string_descriptor_ascii(libusb_device_handle * dev, uint8_t desc_index, uint8_t *data, int length);
++int	libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length);
++int	libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length);
+ 
+ /* Asynchronous device I/O */
+ 
+@@ -341,7 +344,16 @@
+ void	libusb_free_transfer(struct libusb_transfer *transfer);
+ int	libusb_submit_transfer(struct libusb_transfer *transfer);
+ int	libusb_cancel_transfer(struct libusb_transfer *transfer);
+-uint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, unsigned int packet);
++uint8_t *libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index);
++uint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index);
++void	libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length);
++uint8_t *libusb_control_transfer_get_data(struct libusb_transfer *transfer);
++struct libusb_control_setup *libusb_control_transfer_get_setup(struct libusb_transfer *transfer);
++void	libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength);
++void	libusb_fill_control_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t *buf, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
++void	libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
++void	libusb_fill_interrupt_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
++void	libusb_fill_iso_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, int npacket, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
+ 
+ /* Polling and timing */
+ 
+@@ -362,10 +374,15 @@
+ 
+ /* Synchronous device I/O */
+ 
+-int	libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, unsigned int timeout);
+-int	libusb_bulk_transfer(libusb_device_handle *devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, unsigned int timeout);
+-int	libusb_interrupt_transfer(libusb_device_handle *devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, unsigned int timeout);
++int	libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, uint32_t timeout);
++int	libusb_bulk_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
++int	libusb_interrupt_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
+ 
++/* Byte-order */
++
++uint16_t libusb_cpu_to_le16(uint16_t x);
++uint16_t libusb_le16_to_cpu(uint16_t x);
++
+ #if 0
+ {					/* indent fix */
+ #endif

Modified: trunk/freebsd-libs/debian/patches/series
===================================================================
--- trunk/freebsd-libs/debian/patches/series	2010-01-07 23:21:33 UTC (rev 2908)
+++ trunk/freebsd-libs/debian/patches/series	2010-01-08 00:08:07 UTC (rev 2909)
@@ -9,3 +9,4 @@
 10_memstat.diff
 11_netgraph.diff
 12_usb.diff
+13_libusb-update.diff




More information about the Glibc-bsd-commits mailing list