Revision: 7533 http://sourceforge.net/p/ipcop/svn/7533 Author: owes Date: 2014-05-14 09:38:21 +0000 (Wed, 14 May 2014) Log Message: ----------- Bump linux kernel to 3.4-3 (3.4.90). Drop the obsolete ledtrig patch. Add (temporary) patch to fix n_tty_write_crash.
Modified Paths: -------------- ipcop/trunk/lfs/linux ipcop/trunk/updates/2.1.6/ROOTFILES.i486-2.1.6 ipcop/trunk/updates/2.1.6/information.xml ipcop/trunk/updates/2.1.6/setup Added Paths: ----------- ipcop/trunk/src/patches/linux-3.4_fix-n_tty_write-crash.patch Removed Paths: ------------- ipcop/trunk/src/patches/linux-2.6.32_ledtrig-netdev.patch Modified: ipcop/trunk/lfs/linux =================================================================== --- ipcop/trunk/lfs/linux 2014-05-13 20:21:17 UTC (rev 7532) +++ ipcop/trunk/lfs/linux 2014-05-14 09:38:21 UTC (rev 7533) @@ -34,8 +34,8 @@ PKG_NAME = linux VER = 3.4 -PATCHLEVEL = 3.4.87 -IPCOPKRELEASE = -2 +PATCHLEVEL = 3.4.90 +IPCOPKRELEASE = -3 HOST_ARCH = all OTHER_SRC = yes @@ -72,7 +72,7 @@ $(GRSECURITYPATCH) = http://ipcop-addons.mooo.com/misc/IPCop/$(GRSECURITYPATCH) $(DL_FILE)_MD5 = 967f72983655e2479f951195953e8480 -patch-$(PATCHLEVEL).xz_MD5 = 54af6fa0d30629f843930ca7af688c48 +patch-$(PATCHLEVEL).xz_MD5 = d9160b053d17f3384e5479715b4fb6e6 $(GRSECURITYPATCH)_MD5 = b15bb91a07aa2fb030e18c47c91940bb install : $(TARGET) @@ -111,13 +111,13 @@ cd $(DIR_APP) && sed -i -e "s/SUBLEVEL\ =.*//" Makefile cd $(DIR_APP) && sed -i -e "s/EXTRAVERSION\ =.*/EXTRAVERSION\ =$(IPCOPKRELEASE)/" Makefile + # not yet in stable release, queued for 3.4.91 + cd $(DIR_APP) && patch -Np1 -i $(DIR_PATCHES)/$(THISAPP)_fix-n_tty_write-crash.patch + # get working isapnp, not yet ready, need some others changes to retrieve the events #cd $(DIR_APP) && patch -Np1 -i $(DIR_PATCHES)/$(THISAPP)_isapnp1.patch #cd $(DIR_APP) && patch -Np1 -i $(DIR_PATCHES)/$(THISAPP)_isapnp2.patch - # LED Netdev Trigger - #cd $(DIR_APP) && patch -Np1 -i $(DIR_PATCHES)/$(THISAPP)_ledtrig-netdev.patch - # APU LEDs cd $(DIR_APP) && patch -Np1 -i $(DIR_PATCHES)/$(THISAPP)_leds-apu.patch Deleted: ipcop/trunk/src/patches/linux-2.6.32_ledtrig-netdev.patch =================================================================== --- ipcop/trunk/src/patches/linux-2.6.32_ledtrig-netdev.patch 2014-05-13 20:21:17 UTC (rev 7532) +++ ipcop/trunk/src/patches/linux-2.6.32_ledtrig-netdev.patch 2014-05-14 09:38:21 UTC (rev 7533) @@ -1,609 +0,0 @@ -From OpenWRT, proposed upstream http://marc.info/?l=linux-kernel&m=129099808322799&w=2 -2 minor modifications for 2.6.32 to fix use of 32/64 bit stat counters, search for: KERNEL_VERSION(2,6,36) - -===== - -Changes in v2: -- Use individual entries for link, transmit, and receive; - each can be "enabled" or "disabled" -- Use strict_strtoul instead of simple_strtoul -- Add descriptions to Documentation/ABI/testing/sysfs-class-led - - Documentation/ABI/testing/sysfs-class-led | 64 ++++ - drivers/leds/Kconfig | 7 + - drivers/leds/Makefile | 1 + - drivers/leds/ledtrig-netdev.c | 475 +++++++++++++++++++++++++++++ - 4 files changed, 547 insertions(+), 0 deletions(-) - create mode 100644 drivers/leds/ledtrig-netdev.c - -diff --git a/Documentation/ABI/testing/sysfs-class-led b/Documentation/ABI/testing/sysfs-class-led -index 9e4541d..0b03863 100644 ---- a/Documentation/ABI/testing/sysfs-class-led -+++ b/Documentation/ABI/testing/sysfs-class-led -@@ -26,3 +26,67 @@ Description: - scheduler is chosen. Trigger specific parameters can appear in - /sys/class/leds/<led> once a given trigger is selected. - -+What: /sys/class/leds/<led>/device_name -+Date: November 2010 -+KernelVersion: 2.6.37 -+Contact: Eric Cooper <e...@cmu.edu> -+Description: -+ Network device name to monitor when trigger is set to "netdev". -+ -+What: /sys/class/leds/<led>/interval -+Date: November 2010 -+KernelVersion: 2.6.37 -+Contact: Eric Cooper <e...@cmu.edu> -+Description: -+ Duration of LED blink in milliseconds when trigger is set to -+ "netdev". -+ -+What: /sys/class/leds/<led>/link -+Date: November 2010 -+KernelVersion: 2.6.37 -+Contact: Eric Cooper <e...@cmu.edu> -+Description: -+ When trigger is set to "netdev", this value is either "enabled" -+ or "disabled". If enabled, this LED's normal state reflects -+ whether or not the link for the corresponding network device -+ is up (has carrier). -+ -+What: /sys/class/leds/<led>/transmit -+Date: November 2010 -+KernelVersion: 2.6.37 -+Contact: Eric Cooper <e...@cmu.edu> -+Description: -+ When trigger is set to "netdev", this value is either "enabled" -+ or "disabled". If enabled, this LED blinks when data is -+ transmitted on the corresponding network device. -+ -+What: /sys/class/leds/<led>/receive -+Date: November 2010 -+KernelVersion: 2.6.37 -+Contact: Eric Cooper <e...@cmu.edu> -+Description: -+ When trigger is set to "netdev", this value is either "enabled" -+ or "disabled". If enabled, this LED blinks when data is -+ received on the corresponding network device. -+ -+ Example configurations: -+ -+ Simple link status LED: -+ # echo netdev >someled/trigger -+ # echo eth0 >someled/device_name -+ # echo enabled >someled/link -+ -+ Ethernet-style link/activity LED: -+ # echo netdev >someled/trigger -+ # echo eth0 >someled/device_name -+ # echo enabled >someled/link -+ # echo enabled >someled/transmit -+ # echo enabled >someled/receive -+ -+ Modem-style tx/rx LEDs: -+ # echo netdev >led1/trigger -+ # echo ppp0 >led1/device_name -+ # echo enabled >led1/transmit -+ # echo netdev >led2/trigger -+ # echo ppp0 >led2/device_name -+ # echo enabled >led2/receive -diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig -index 77b8fd2..8d81cd0 100644 ---- a/drivers/leds/Kconfig -+++ b/drivers/leds/Kconfig -@@ -374,6 +374,13 @@ config LEDS_TRIGGER_HEARTBEAT - load average. - If unsure, say Y. - -+config LEDS_TRIGGER_NETDEV -+ tristate "LED Network Device Trigger" -+ depends on NET -+ help -+ This allows LEDs to be controlled by network device activity. -+ If unsure, say Y. -+ - config LEDS_TRIGGER_BACKLIGHT - tristate "LED backlight Trigger" - help -diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile -index aae6989..a3bb67d 100644 ---- a/drivers/leds/Makefile -+++ b/drivers/leds/Makefile -@@ -49,6 +49,7 @@ obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o - obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o - obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o - obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o -+obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o - obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o - obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o - obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o -diff --git a/drivers/leds/ledtrig-netdev.c b/drivers/leds/ledtrig-netdev.c -new file mode 100644 -index 0000000..eeb5ac8 ---- /dev/null -+++ b/drivers/leds/ledtrig-netdev.c -@@ -0,0 +1,483 @@ -+/* -+ * LED Kernel Netdev Trigger -+ * -+ * Toggles the LED to reflect the link and traffic state of a named net device -+ * -+ * Copyright 2007 Oliver Jowett <oli...@opencloud.com> -+ * -+ * Derived from ledtrig-timer.c which is: -+ * Copyright 2005-2006 Openedhand Ltd. -+ * Author: Richard Purdie <rpur...@openedhand.com> -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/jiffies.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/list.h> -+#include <linux/spinlock.h> -+#include <linux/device.h> -+#include <linux/sysdev.h> -+#include <linux/netdevice.h> -+#include <linux/timer.h> -+#include <linux/ctype.h> -+#include <linux/leds.h> -+#include <linux/version.h> -+#include <net/net_namespace.h> -+ -+#include "leds.h" -+ -+/* -+ * Configurable sysfs attributes: -+ * -+ * device_name - network device name to monitor -+ * -+ * interval - duration of LED blink, in milliseconds -+ * -+ * Each of the following attributes may be "enabled" or "disabled": -+ * -+ * link - if enabled, the LED's normal state reflects -+ * whether the link is up (has carrier) -+ * transmit - if enabled, the LED blinks on transmitted data -+ * receive - if enabled, the LED blinks on received data -+ * -+ * Some suggestions: -+ * -+ * Simple link status LED: -+ * $ echo netdev >someled/trigger -+ * $ echo eth0 >someled/device_name -+ * $ echo enabled >someled/link -+ * -+ * Ethernet-style link/activity LED: -+ * $ echo netdev >someled/trigger -+ * $ echo eth0 >someled/device_name -+ * $ echo enabled >someled/link -+ * $ echo enabled >someled/transmit -+ * $ echo enabled >someled/receive -+ * -+ * Modem-style tx/rx LEDs: -+ * $ echo netdev >led1/trigger -+ * $ echo ppp0 >led1/device_name -+ * $ echo enabled >led1/transmit -+ * $ echo netdev >led2/trigger -+ * $ echo ppp0 >led2/device_name -+ * $ echo enabled >led2/receive -+ */ -+ -+#define MODE_LINK 1 -+#define MODE_TX 2 -+#define MODE_RX 4 -+ -+struct led_netdev_data { -+ rwlock_t lock; -+ -+ struct timer_list timer; -+ struct notifier_block notifier; -+ -+ struct led_classdev *led_cdev; -+ struct net_device *net_dev; -+ -+ char device_name[IFNAMSIZ]; -+ unsigned interval; -+ unsigned mode; -+ unsigned link_up; -+ unsigned last_activity; -+}; -+ -+static void set_baseline_state(struct led_netdev_data *trigger_data) -+{ -+ if ((trigger_data->mode & MODE_LINK) != 0 && trigger_data->link_up) -+ led_set_brightness(trigger_data->led_cdev, LED_FULL); -+ else -+ led_set_brightness(trigger_data->led_cdev, LED_OFF); -+ -+ if ((trigger_data->mode & (MODE_TX | MODE_RX)) != 0 && -+ trigger_data->link_up) -+ mod_timer(&trigger_data->timer, -+ jiffies + trigger_data->interval); -+ else -+ del_timer(&trigger_data->timer); -+} -+ -+static ssize_t led_device_name_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ -+ read_lock(&trigger_data->lock); -+ sprintf(buf, "%s\n", trigger_data->device_name); -+ read_unlock(&trigger_data->lock); -+ -+ return strlen(buf) + 1; -+} -+ -+static ssize_t led_device_name_store(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t size) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ -+ if (size < 0 || size >= IFNAMSIZ) -+ return -EINVAL; -+ -+ write_lock(&trigger_data->lock); -+ -+ strcpy(trigger_data->device_name, buf); -+ if (size > 0 && trigger_data->device_name[size-1] == '\n') -+ trigger_data->device_name[size-1] = 0; -+ -+ if (trigger_data->device_name[0] != 0) { -+ /* check for existing device to update from */ -+ struct net_device *dev = -+ dev_get_by_name(&init_net, trigger_data->device_name); -+ if (dev != NULL) { -+ unsigned int flags = dev_get_flags(dev); -+ trigger_data->net_dev = dev; -+ trigger_data->link_up = (flags & IFF_LOWER_UP) != 0; -+ } -+ /* updates LEDs, may start timers */ -+ set_baseline_state(trigger_data); -+ } -+ -+ write_unlock(&trigger_data->lock); -+ return size; -+} -+ -+static DEVICE_ATTR(device_name, 0644, -+ led_device_name_show, led_device_name_store); -+ -+static const char enabled[] = "enabled"; -+static const char disabled[] = "disabled"; -+ -+static ssize_t led_show_mode(struct device *dev, -+ struct device_attribute *attr, char *buf, -+ unsigned mode_bit) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ -+ return sprintf(buf, "%s\n", (trigger_data->mode & mode_bit) ? -+ enabled : disabled); -+} -+ -+static void led_mode_set(struct led_netdev_data *data, unsigned bit) -+{ -+ write_lock(&data->lock); -+ data->mode |= bit; -+ set_baseline_state(data); -+ write_unlock(&data->lock); -+} -+ -+static void led_mode_clear(struct led_netdev_data *data, unsigned bit) -+{ -+ write_lock(&data->lock); -+ data->mode &= ~bit; -+ set_baseline_state(data); -+ write_unlock(&data->lock); -+} -+ -+static ssize_t led_store_mode(struct device *dev, -+ struct device_attribute *attr, const char *buf, -+ size_t size, unsigned mode_bit) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ char *cp; -+ int len = size; -+ -+ cp = memchr(buf, '\n', size); -+ if (cp) -+ len = cp - buf; -+ if (len == sizeof(enabled) - 1 && strncmp(buf, enabled, len) == 0) -+ led_mode_set(trigger_data, mode_bit); -+ else if (len == sizeof(disabled) - 1 && -+ strncmp(buf, disabled, len) == 0) -+ led_mode_clear(trigger_data, mode_bit); -+ else -+ return -EINVAL; -+ return size; -+} -+ -+#define LED_NETDEV_ATTR(name, mode_bit) \ -+static ssize_t led_show_##name(struct device *dev, \ -+ struct device_attribute *attr, \ -+ char *buf) \ -+{ \ -+ return led_show_mode(dev, attr, buf, mode_bit); \ -+} \ -+ \ -+static ssize_t led_store_##name(struct device *dev, \ -+ struct device_attribute *attr, \ -+ const char *buf, size_t size) \ -+{ \ -+ return led_store_mode(dev, attr, buf, size, mode_bit); \ -+} \ -+ \ -+static DEVICE_ATTR(name, 0644, led_show_##name, led_store_##name) -+ -+LED_NETDEV_ATTR(link, MODE_LINK); -+LED_NETDEV_ATTR(transmit, MODE_TX); -+LED_NETDEV_ATTR(receive, MODE_RX); -+ -+static ssize_t led_interval_show(struct device *dev, -+ struct device_attribute *attr, -+ char *buf) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ -+ read_lock(&trigger_data->lock); -+ sprintf(buf, "%u\n", jiffies_to_msecs(trigger_data->interval)); -+ read_unlock(&trigger_data->lock); -+ -+ return strlen(buf) + 1; -+} -+ -+static ssize_t led_interval_store(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t size) -+{ -+ struct led_classdev *led_cdev = dev_get_drvdata(dev); -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ unsigned long value; -+ int ret; -+ -+ ret = strict_strtoul(buf, 10, &value); -+ if (ret < 0) -+ return ret; -+ -+ /* impose some basic bounds on the timer interval */ -+ if (value >= 5 && value <= 10000) { -+ write_lock(&trigger_data->lock); -+ trigger_data->interval = msecs_to_jiffies(value); -+ set_baseline_state(trigger_data); /* resets timer */ -+ write_unlock(&trigger_data->lock); -+ return size; -+ } else { -+ return -EINVAL; -+ } -+} -+ -+static DEVICE_ATTR(interval, 0644, led_interval_show, led_interval_store); -+ -+static int netdev_trig_notify(struct notifier_block *nb, -+ unsigned long evt, -+ void *dv) -+{ -+ struct net_device *dev = dv; -+ struct led_netdev_data *trigger_data = -+ container_of(nb, struct led_netdev_data, notifier); -+ -+ if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE && -+ evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER) -+ return NOTIFY_DONE; -+ -+ write_lock(&trigger_data->lock); -+ -+ if (strcmp(dev->name, trigger_data->device_name)) -+ goto done; -+ -+ if (evt == NETDEV_REGISTER) { -+ if (trigger_data->net_dev != NULL) -+ dev_put(trigger_data->net_dev); -+ dev_hold(dev); -+ trigger_data->net_dev = dev; -+ trigger_data->link_up = 0; -+ goto done; -+ } -+ -+ if (evt == NETDEV_UNREGISTER && trigger_data->net_dev != NULL) { -+ dev_put(trigger_data->net_dev); -+ trigger_data->net_dev = NULL; -+ goto done; -+ } -+ -+ /* UP / DOWN / CHANGE */ -+ -+ trigger_data->link_up = (evt != NETDEV_DOWN && netif_carrier_ok(dev)); -+ set_baseline_state(trigger_data); -+ -+done: -+ write_unlock(&trigger_data->lock); -+ return NOTIFY_DONE; -+} -+ -+/* here's the real work! */ -+static void netdev_trig_timer(unsigned long arg) -+{ -+ struct led_netdev_data *trigger_data = (struct led_netdev_data *)arg; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) -+ struct rtnl_link_stats64 temp; -+ const struct rtnl_link_stats64 *dev_stats; -+#else -+ const struct net_device_stats *dev_stats; -+#endif -+ unsigned new_activity; -+ -+ write_lock(&trigger_data->lock); -+ -+ if (!trigger_data->link_up || !trigger_data->net_dev || -+ (trigger_data->mode & (MODE_TX | MODE_RX)) == 0) { -+ /* we don't need to do timer work, just reflect link state. */ -+ int on = (trigger_data->mode & MODE_LINK) != 0 && -+ trigger_data->link_up; -+ led_set_brightness(trigger_data->led_cdev, -+ on ? LED_FULL : LED_OFF); -+ goto no_restart; -+ } -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) -+ dev_stats = dev_get_stats(trigger_data->net_dev, &temp); -+#else -+ dev_stats = dev_get_stats(trigger_data->net_dev); -+#endif -+ -+ new_activity = -+ ((trigger_data->mode & MODE_TX) ? dev_stats->tx_packets : 0) + -+ ((trigger_data->mode & MODE_RX) ? dev_stats->rx_packets : 0); -+ -+ if (trigger_data->mode & MODE_LINK) { -+ /* base state is ON (link present) */ -+ /* if there's no link, we don't get this far -+ and the LED is off */ -+ -+ /* OFF -> ON always */ -+ /* ON -> OFF on activity */ -+ if (trigger_data->led_cdev->brightness == LED_OFF) -+ led_set_brightness(trigger_data->led_cdev, LED_FULL); -+ else if (trigger_data->last_activity != new_activity) -+ led_set_brightness(trigger_data->led_cdev, LED_OFF); -+ } else { -+ /* base state is OFF */ -+ /* ON -> OFF always */ -+ /* OFF -> ON on activity */ -+ if (trigger_data->led_cdev->brightness == LED_FULL) -+ led_set_brightness(trigger_data->led_cdev, LED_OFF); -+ else if (trigger_data->last_activity != new_activity) -+ led_set_brightness(trigger_data->led_cdev, LED_FULL); -+ } -+ -+ trigger_data->last_activity = new_activity; -+ mod_timer(&trigger_data->timer, jiffies + trigger_data->interval); -+ -+no_restart: -+ write_unlock(&trigger_data->lock); -+} -+ -+static void netdev_trig_activate(struct led_classdev *led_cdev) -+{ -+ struct led_netdev_data *trigger_data; -+ int rc; -+ -+ trigger_data = kzalloc(sizeof(struct led_netdev_data), GFP_KERNEL); -+ if (!trigger_data) -+ return; -+ -+ rwlock_init(&trigger_data->lock); -+ -+ trigger_data->notifier.notifier_call = netdev_trig_notify; -+ trigger_data->notifier.priority = 10; -+ -+ setup_timer(&trigger_data->timer, netdev_trig_timer, -+ (unsigned long) trigger_data); -+ -+ trigger_data->led_cdev = led_cdev; -+ trigger_data->net_dev = NULL; -+ trigger_data->device_name[0] = 0; -+ -+ trigger_data->mode = 0; -+ trigger_data->interval = msecs_to_jiffies(50); -+ trigger_data->link_up = 0; -+ trigger_data->last_activity = 0; -+ -+ led_cdev->trigger_data = trigger_data; -+ -+ rc = device_create_file(led_cdev->dev, &dev_attr_device_name); -+ if (rc) -+ goto err_out; -+ rc = device_create_file(led_cdev->dev, &dev_attr_link); -+ if (rc) -+ goto err_out_device_name; -+ rc = device_create_file(led_cdev->dev, &dev_attr_transmit); -+ if (rc) -+ goto err_out_link; -+ rc = device_create_file(led_cdev->dev, &dev_attr_receive); -+ if (rc) -+ goto err_out_transmit; -+ rc = device_create_file(led_cdev->dev, &dev_attr_interval); -+ if (rc) -+ goto err_out_receive; -+ -+ register_netdevice_notifier(&trigger_data->notifier); -+ return; -+ -+err_out_receive: -+ device_remove_file(led_cdev->dev, &dev_attr_receive); -+err_out_transmit: -+ device_remove_file(led_cdev->dev, &dev_attr_transmit); -+err_out_link: -+ device_remove_file(led_cdev->dev, &dev_attr_link); -+err_out_device_name: -+ device_remove_file(led_cdev->dev, &dev_attr_device_name); -+err_out: -+ led_cdev->trigger_data = NULL; -+ kfree(trigger_data); -+} -+ -+static void netdev_trig_deactivate(struct led_classdev *led_cdev) -+{ -+ struct led_netdev_data *trigger_data = led_cdev->trigger_data; -+ -+ if (trigger_data) { -+ unregister_netdevice_notifier(&trigger_data->notifier); -+ -+ device_remove_file(led_cdev->dev, &dev_attr_device_name); -+ device_remove_file(led_cdev->dev, &dev_attr_link); -+ device_remove_file(led_cdev->dev, &dev_attr_transmit); -+ device_remove_file(led_cdev->dev, &dev_attr_receive); -+ device_remove_file(led_cdev->dev, &dev_attr_interval); -+ -+ write_lock(&trigger_data->lock); -+ -+ if (trigger_data->net_dev) { -+ dev_put(trigger_data->net_dev); -+ trigger_data->net_dev = NULL; -+ } -+ -+ write_unlock(&trigger_data->lock); -+ -+ del_timer_sync(&trigger_data->timer); -+ -+ kfree(trigger_data); -+ } -+} -+ -+static struct led_trigger netdev_led_trigger = { -+ .name = "netdev", -+ .activate = netdev_trig_activate, -+ .deactivate = netdev_trig_deactivate, -+}; -+ -+static int __init netdev_trig_init(void) -+{ -+ return led_trigger_register(&netdev_led_trigger); -+} -+ -+static void __exit netdev_trig_exit(void) -+{ -+ led_trigger_unregister(&netdev_led_trigger); -+} -+ -+module_init(netdev_trig_init); -+module_exit(netdev_trig_exit); -+ -+MODULE_AUTHOR("Oliver Jowett <oli...@opencloud.com>"); -+MODULE_DESCRIPTION("Netdev LED trigger"); -+MODULE_LICENSE("GPL"); Added: ipcop/trunk/src/patches/linux-3.4_fix-n_tty_write-crash.patch =================================================================== --- ipcop/trunk/src/patches/linux-3.4_fix-n_tty_write-crash.patch (rev 0) +++ ipcop/trunk/src/patches/linux-3.4_fix-n_tty_write-crash.patch 2014-05-14 09:38:21 UTC (rev 7533) @@ -0,0 +1,77 @@ +From: Peter Hurley <pe...@hurleysoftware.com> +Date: Sat, 3 May 2014 14:04:59 +0200 +Subject: n_tty: Fix n_tty_write crash when echoing in raw mode + +commit 4291086b1f081b869c6d79e5b7441633dc3ace00 upstream. + +The tty atomic_write_lock does not provide an exclusion guarantee for +the tty driver if the termios settings are LECHO & !OPOST. And since +it is unexpected and not allowed to call TTY buffer helpers like +tty_insert_flip_string concurrently, this may lead to crashes when +concurrect writers call pty_write. In that case the following two +writers: +* the ECHOing from a workqueue and +* pty_write from the process +race and can overflow the corresponding TTY buffer like follows. + +If we look into tty_insert_flip_string_fixed_flag, there is: + int space = __tty_buffer_request_room(port, goal, flags); + struct tty_buffer *tb = port->buf.tail; + ... + memcpy(char_buf_ptr(tb, tb->used), chars, space); + ... + tb->used += space; + +so the race of the two can result in something like this: + A B +__tty_buffer_request_room + __tty_buffer_request_room +memcpy(buf(tb->used), ...) +tb->used += space; + memcpy(buf(tb->used), ...) ->BOOM + +B's memcpy is past the tty_buffer due to the previous A's tb->used +increment. + +Since the N_TTY line discipline input processing can output +concurrently with a tty write, obtain the N_TTY ldisc output_lock to +serialize echo output with normal tty writes. This ensures the tty +buffer helper tty_insert_flip_string is not called concurrently and +everything is fine. + +Note that this is nicely reproducible by an ordinary user using +forkpty and some setup around that (raw termios + ECHO). And it is +present in kernels at least after commit +d945cb9cce20ac7143c2de8d88b187f62db99bdc (pty: Rework the pty layer to +use the normal buffering logic) in 2.6.31-rc3. + +js: add more info to the commit log +js: switch to bool +js: lock unconditionally +js: lock only the tty->ops->write call + +References: CVE-2014-0196 +Reported-and-tested-by: Jiri Slaby <jsl...@suse.cz> +Signed-off-by: Peter Hurley <pe...@hurleysoftware.com> +Signed-off-by: Jiri Slaby <jsl...@suse.cz> +Cc: Linus Torvalds <torva...@linux-foundation.org> +Cc: Alan Cox <a...@lxorguk.ukuu.org.uk> +Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org> +[bwh: Backported to 3.2: output_lock is a member of struct tty_struct] +Signed-off-by: Ben Hutchings <b...@decadent.org.uk> +--- + drivers/tty/n_tty.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/tty/n_tty.c ++++ b/drivers/tty/n_tty.c +@@ -1996,7 +1996,9 @@ static ssize_t n_tty_write(struct tty_st + tty->ops->flush_chars(tty); + } else { + while (nr > 0) { ++ mutex_lock(&tty->output_lock); + c = tty->ops->write(tty, b, nr); ++ mutex_unlock(&tty->output_lock); + if (c < 0) { + retval = c; + goto break_out; Modified: ipcop/trunk/updates/2.1.6/ROOTFILES.i486-2.1.6 =================================================================== --- ipcop/trunk/updates/2.1.6/ROOTFILES.i486-2.1.6 2014-05-13 20:21:17 UTC (rev 7532) +++ ipcop/trunk/updates/2.1.6/ROOTFILES.i486-2.1.6 2014-05-14 09:38:21 UTC (rev 7533) @@ -9,8 +9,14 @@ /usr/local/bin/restarthttpd /usr/local/bin/setreservedports.pl ## -## kernel module APU LED -/lib/modules/3.4-2/kernel/drivers/leds/leds-apu.ko.gz +## linux-3.4-3 (3.4.90) +/boot/vmlinuz +/boot/vmlinuz-3.4-3 +/boot/System.map-3.4-3 +/lib/modules/3.4-3/extra/CnxADSL.ko.gz +/lib/modules/3.4-3/extra/pulsar.ko.gz +/lib/modules/3.4-3/extra/solos-pci.ko.gz +/lib/modules/3.4-3/kernel ## ## linux-firmware-f8c22c6 /lib/firmware/rtl_nic/rtl8105e-1.fw Modified: ipcop/trunk/updates/2.1.6/information.xml =================================================================== --- ipcop/trunk/updates/2.1.6/information.xml 2014-05-13 20:21:17 UTC (rev 7532) +++ ipcop/trunk/updates/2.1.6/information.xml 2014-05-14 09:38:21 UTC (rev 7533) @@ -3,9 +3,10 @@ <version>2.1.6</version> <releasedate>2014-mm-dd</releasedate> <size>0</size> - <isoimages>no</isoimages> + <isoimages>yes</isoimages> <description> Patch openssl for CVE-2010-5298.<br /> + Upgrade linux kernel to 3.4-3 (3.4.90).<br /> Upgrade squid to 3.4.5. </description> <previousversion>2.1.5</previousversion> Modified: ipcop/trunk/updates/2.1.6/setup =================================================================== --- ipcop/trunk/updates/2.1.6/setup 2014-05-13 20:21:17 UTC (rev 7532) +++ ipcop/trunk/updates/2.1.6/setup 2014-05-14 09:38:21 UTC (rev 7533) @@ -68,11 +68,11 @@ # Modify or remove line below, depending on update # Update bootloader config -# /usr/local/sbin/updatekernel.pl --add 2.6.32-2 --keep 2.6.32-1 --remove 2.6.32-0 +/usr/local/sbin/updatekernel.pl --add 3.4-3 --keep 3.4-2 --remove 3.4-1 # Modify or remove line below, depending on update # Create the new initramfs -# /sbin/mkinitramfs --with-kernel=2.6.32-2 --with-firmware --many-modules --with-list=/etc/modules.initramfs +/sbin/mkinitramfs --with-kernel=3.4-3 --with-firmware --many-modules --with-list=/etc/modules.initramfs # Adjust the changed config files # /usr/local/bin/upgrade.sh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE Instantly run your Selenium tests across 300+ browser/OS combos. Get unparalleled scalability from the best Selenium testing platform available Simple to use. Nothing to install. Get started now for free." http://p.sf.net/sfu/SauceLabs _______________________________________________ Ipcop-svn mailing list Ipcop-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ipcop-svn