--- usb_modeswitch_dispatcher.c.orig 2014-02-20 15:08:44.665397121 +0700 +++ usb_modeswitch_dispatcher.c 2014-02-21 01:11:20.351366429 +0700 @@ -183,6 +183,10 @@ void prepare_run_dir(); int check_success(char *dir, char *ifdir); +static int min(int a, int b){ + return a>b?b:a; +} + int main(int argc, char* argv[]) { regex_t reg; @@ -190,6 +194,7 @@ char *val, *tmpval, *tmp; char bus_id[PATH_MAX], *kernel_name = NULL; char dev_top[PATH_MAX]; + int length; char *udev_args = NULL; char *msg, *sys_dir, *fname, *selected_config, *ifdir; char line[PATH_MAX]; @@ -279,8 +284,9 @@ else kernel_name = ""; - strncpy (bus_id, udev_args, strlen(udev_args) - strlen(kernel_name) - 1); - bus_id[strlen(bus_id)] = '\0'; + length = min(kernel_name - udev_args - 1, sizeof(bus_id) - 1); + strncpy (bus_id, udev_args, length); + bus_id[length] = '\0'; if (strlen(kernel_name) > 0 && strlen(bus_id) == 0) { char *colon = strchr (kernel_name, ':'); @@ -289,8 +295,12 @@ modeswitch_log(" Trying to determine it from kernel name (%s) ...\n", kernel_name); if (colon) { - strncpy (dev_top, kernel_name, strlen(kernel_name) - strlen(colon)); - dev_top[strlen(dev_top)] = '\0'; + length = min(colon - kernel_name, sizeof(dev_top) - 1); + strncpy (dev_top, kernel_name, length); + dev_top[length] = '\0'; + }else{ //sometimes udev_args is "/1-1" + strncpy (dev_top, kernel_name, sizeof(dev_top)-1); + dev_top[sizeof(dev_top)-1] = '\0'; } } else if (strlen(bus_id) > 0) {